POS-tagging med NLTK og Chunking i NLP [EKSEMPLER]

⚡ Smart opsummering

POS-tagging tildeler en ordklasse til hvert ord i en sætning, mens Chunking grupperer de taggede ord i meningsfulde sætninger såsom navneordsfraser og tilføjer en overfladisk struktur, som NLTK opbygger med regulære udtryk i. Python.

  • 🏷️ POS-mærkning: Hvert ord modtager et grammatisk token som NN, VB eller JJ fra dets kontekst.
  • 🌿 Chunking: Taggede ord grupperes i sætninger, en proces der også kaldes overfladisk parsing.
  • 🔤 Workflow: Tokeniser først tekst, anvend derefter pos_tag, og pars derefter med en RegexpParser-grammatik.
  • 📊 Tælling af tags: Counter og FreqDist afslører tag- og ordfrekvenser til funktionsudvikling.
  • 🔗 Kollokationer: Bigrammer og trigrammer indfanger ordpar og tripler for at opnå stærkere tekstfunktioner.
  • 🤖 AI-brug: Maskinlæring og HMM-baserede taggers håndterer tvetydige ord probabilistisk.

POS-tagging med NLTK og Chunking i NLP

POS Tagging

POS Tagging (Parts of Speech Tagging) er en proces til at markere ord i tekstformat for en bestemt del af en tale baseret på dens definition og kontekst. Det er ansvarligt for at læse tekst på et sprog og tildele et specifikt token (Parts of Speech) til hvert ord. Det kaldes også grammatisk tagging.

Lad os lære med et eksempel på en NLTK-ordklasse:

Input: Everything to permit us.
Output: [('Everything', NN),('to', TO), ('permit', VB), ('us', PRP)]

Trin involveret i POS-taggingeksemplet

  • Tokenize tekst (word_tokenize)
  • Anvend pos_tag på ovenstående trin, det vil sige nltk.pos_tag(tokenize_text)

Eksempler på NLTK POS-tags er anført nedenfor:

Forkortelse Betydning
CC koordinerende konjunktion
CD kardinal ciffer
DT bestemmelse
EX eksistentiel der
FW fremmedord
IN præposition/underordnet ledsætning
JJ adjektiv
JJR adjektiv, komparativ
JJS adjektiv, superlativ
LS listemarked
MD kapital
NN substantiv, ental
NNS navneord flertal
NNP egennavn, ental
NNPS egennavn, flertal
PDT forudbestemmer
POS besiddende slutning
PRP personligt stedord
PRP$ possessivt pronomen
RB biord
RBR forlængelse adverbium, komparativ
RBS adverbium, superlativ
RP partikel
TIL uendelig markør
UH udråbsord
VB verbum
GBV udsagnsord gerund
VBD verbum datid
VBN verbum participium
VBP verbum, nutid ikke 3. person ental
VBZ verbum, nutid med 3. person ental
wdt wh-determinant
WP wh-pronomen
WRB wh-adverbium

Ovenstående NLTK POS-tagliste indeholder alle NLTK POS-tags. NLTK POS-taggeren bruges til at tildele grammatiske oplysninger til hvert ord i sætningen. Installation, import og download af alle pakkerne til POS NLTK er nu fuldført.

Hvad er Chunking i NLP?

chunking I NLP er Chunking en proces til at tage små informationsstykker og gruppere dem i store enheder. Den primære anvendelse af Chunking er at lave grupper af "navneordsfraser". Det bruges til at tilføje struktur til sætningen ved at følge POS-tagging kombineret med regulære udtryk. Den resulterende gruppe af ord kaldes "chunks". Det kaldes også shallow parsing.

Ved overfladisk parsing er der maksimalt ét niveau mellem rødder og blade, mens dyb parsing omfatter mere end ét niveau. Overfladisk parsing kaldes også let parsing eller chunking.

Regler for chunking

Der er ingen foruddefinerede regler, men du kan kombinere dem efter behov og krav. For eksempel, lad os sige, at du skal markere substantiv, verbum (datid), adjektiv og koordinerende konjunktion fra sætningen. Du kan bruge nedenstående regel:

chunk:{***?}

Følgende tabel viser, hvad de forskellige symboler betyder:

Navn på symbol Beskrivelse
. Ethvert tegn undtagen ny linje
* Match 0 eller flere gentagelser
? Match 0 eller 1 gentagelser

Lad os nu skrive koden for bedre at forstå reglen.

from nltk import pos_tag
from nltk import RegexpParser
text ="learn php from guru99 and make study easy".split()
print("After Split:",text)
tokens_tag = pos_tag(text)
print("After Token:",tokens_tag)
patterns= """mychunk:{***?}"""
chunker = RegexpParser(patterns)
print("After Regex:",chunker)
output = chunker.parse(tokens_tag)
print("After Chunking",output)

Output:

After Split: ['learn', 'php', 'from', 'guru99', 'and', 'make', 'study', 'easy']
After Token: [('learn', 'JJ'), ('php', 'NN'), ('from', 'IN'), ('guru99', 'NN'), ('and', 'CC'), ('make', 'VB'), ('study', 'NN'), ('easy', 'JJ')]
After Regex: chunk.RegexpParser with 1 stages:
RegexpChunkParser with 1 rules:
       '***?'>
After Chunking (S
  (mychunk learn/JJ)
  (mychunk php/NN)
  from/IN
  (mychunk guru99/NN and/CC)
  make/VB
  (mychunk study/NN easy/JJ))

Konklusionen fra ovenstående Part of Speech tagging Python Et eksempel er, at "make" er et verbum, der ikke er inkluderet i reglen, så det er ikke tagget som mychunk.

Brug Case of Chunking

Chunking bruges til entitetsdetektion. En entitet er den del af sætningen, hvormed en maskine får værdien for en given intention.

Example:
Temperature of New York.
Here Temperature is the intention and New York is an entity.

Med andre ord bruges chunking til at vælge delmængder af tokens. Følg koden nedenfor for at forstå, hvordan chunking bruges til at vælge tokens. I dette eksempel vil du se en graf, der svarer til et chunk af en substantivfrase.

 import nltk
text = "learn php from guru99"
tokens = nltk.word_tokenize(text)
print(tokens)
tag = nltk.pos_tag(tokens)
print(tag)
grammar = "NP: {
?*}" cp =nltk.RegexpParser(grammar) result = cp.parse(tag) print(result) result.draw() # It will draw the pattern graphically which can be seen in Noun Phrase chunking

Output:

['learn', 'php', 'from', 'guru99']  -- These are the tokens
[('learn', 'JJ'), ('php', 'NN'), ('from', 'IN'), ('guru99', 'NN')]   -- These are the pos_tag
(S (NP learn/JJ php/NN) from/IN (NP guru99/NN))        -- Noun Phrase Chunking

Navneordssætning Chunking Graph

Navneordssætning chunking Graph

Ud fra grafen kan vi konkludere, at "learn" og "guru99" er to forskellige tokens, men de er kategoriseret som en substantivfrase, hvorimod tokenet "from" ikke tilhører en substantivfrase. Chunking bruges til at kategorisere forskellige tokens i den samme chunk. Resultatet afhænger af den valgte grammatik. Derudover bruges Chunking i NLTK til at mærke mønstre og udforske tekstkorpora.

Optælling af POS-tags

Vi har diskuteret forskellige pos_tag værdier tidligere. Her vil du lære, hvordan man tæller disse tags. Optælling af tags er afgørende for tekstklassificering og for at forberede funktioner til naturlige sprogoperationer. Vi skriver først arbejdskoden og forklarer derefter trinnene.

from collections import Counter
import nltk
text = "Guru99 is one of the best sites to learn WEB, SAP, Ethical Hacking and much more online."
lower_case = text.lower()
tokens = nltk.word_tokenize(lower_case)
tags = nltk.pos_tag(tokens)
counts = Counter( tag for word,  tag in tags)
print(counts)

Output:

Counter({'NN': 5, ',': 2, 'TO': 1, 'CC': 1, 'VBZ': 1, 'NNS': 1, 'CD': 1, '.': 1, 'DT': 1, 'JJS': 1, 'JJ': 1, 'JJR': 1, 'IN': 1, 'VB': 1, 'RB': 1})

Uddybning af koden:

  1. Brug Counter-pakken fra samlingsmodulet. Counter er en ordbogsunderklasse, der gemmer elementer som nøgler og deres antal som værdier.
  2. Importer nltk for at tokenisere teksten.
  3. Skriv den tekst, hvis post_tag du vil tælle.
  4. Omdan alle ord til små bogstaver før tokenisering.
  5. Send ordene gennem word_tokenize og beregn pos_taggen for hver token.
  6. Counter tæller derefter den samlede forekomst af hvert tag i teksten.

Frekvensfordeling

Frekvensfordeling refererer til antallet af gange et resultat af et eksperiment forekommer. Den bruges til at finde hyppigheden af ​​hvert ord, der forekommer i et dokument. Den bruger FrekvensFord. klasse defineret af nltk.sandsynlighed modul. Tællingen øges med én hver gang en stikprøve forekommer.

For ethvert ord kan vi kontrollere, hvor mange gange det forekommer i et dokument. For eksempel:

  • Optællingsmetode: freq_dist.count('og') returnerer antallet af gange 'og' er forekommet. Det kaldes count-metoden.
  • Frekvensmetode: freq_dist.freq('og') returnerer frekvensen af ​​en given sample.

Vi vil skrive et lille program, der beregner frekvensfordelingen af ​​hvert ord i teksten.

import nltk
a = "Guru99 is the site where you can find the best tutorials for Software Testing     Tutorial, SAP Course for Beginners. Java Tutorial for Beginners and much more. Please     visit the site guru99.com and much more."
words = nltk.tokenize.word_tokenize(a)
fd = nltk.FreqDist(words)
fd.plot()

Forklaring af kode:

  1. Importer nltk-modulet.
  2. Skriv den tekst, hvis ordfordeling du skal finde.
  3. Tokeniser hvert ord i teksten, som tjener som input til FreqDist-modulet i nltk.
  4. Anvend hvert ord på nltk.FreqDist i form af en liste.
  5. Plot ordene i grafen ved hjælp af plot().

BEMÆRK: matplotlib skal være installeret for at se grafen. Den tæller forekomsten af ​​hvert ord i teksten og hjælper med tekstbaseret sentimentanalyse. Nøgleordet er "tokenize": efter tokenisering kontrolleres hvert ord for at bestemme, hvor mange gange det forekom.

Kollokationer: Bigrammer og Trigrammer

Kollokationer er ordpar, der forekommer mange gange sammen i et dokument. Det beregnes ud fra forholdet mellem antallet af disse par, der forekommer sammen, og dokumentets samlede ordantal.

Overvej ord som ultraviolette stråler og infrarøde stråler. Ordene ultraviolet og stråler bruges ikke individuelt og kan derfor behandles som en kollokation. Et andet eksempel er CT-scanning, da vi ikke siger CT og scanning separat. Kollokation kan kategoriseres i to typer:

  • Bigrams: kombination af to ord
  • Trigrammer: kombination af tre ord

Bigrammer og trigrammer giver mere meningsfulde og nyttige funktioner til funktionseksemplerne.tractionsfasen. Disse er især nyttige i tekstbaseret sentimentanalyse.

Bigrams-eksempel Code:

import nltk
text = "Guru99 is a totally new kind of learning experience."
Tokens = nltk.word_tokenize(text)
output = list(nltk.bigrams(Tokens))
print(output)

Output:

[('Guru99', 'is'), ('is', 'totally'), ('totally', 'new'), ('new', 'kind'), ('kind', 'of'), ('of', 'learning'), ('learning', 'experience'), ('experience', '.')]

Eksempel på trigrammer Code:

Nogle gange bliver det vigtigt at se et par af tre ord i sætningen til statistisk analyse og frekvenstælling. Dette spiller igen en afgørende rolle i dannelsen NLP (naturlig sprogbehandling) samt tekstbaseret sentimentforudsigelse. Den samme kode køres til beregning af trigrammerne.

import nltk
text = "Guru99 is a totally new kind of learning experience."
Tokens = nltk.word_tokenize(text)
output = list(nltk.trigrams(Tokens))
print(output)

Output:

[('Guru99', 'is', 'totally'), ('is', 'totally', 'new'), ('totally', 'new', 'kind'), ('new', 'kind', 'of'), ('kind', 'of', 'learning'), ('of', 'learning', 'experience'), ('learning', 'experience', '.')]

Tagging af sætninger

At tagge en sætning refererer til at tilføje etiketter såsom verbum eller substantiv baseret på sætningens kontekst. Det er kompliceret at identificere POS-tags, så generisk tagging er ikke mulig manuelt, da nogle ord har tvetydige betydninger afhængigt af sætningsstrukturen. Konvertering af tekst til en liste er et vigtigt trin før tagging, da hvert ord løkkes og tælles for et bestemt tag.

import nltk
text = "Hello Guru99, You have to build a very good site, and I love visiting your site."
sentence = nltk.sent_tokenize(text)
for sent in sentence:
	 print(nltk.pos_tag(nltk.word_tokenize(sent)))

Code Forklaring:

  1. Code at importere nltk (den naturlige Language Toolkit, som indeholder undermoduler såsom sætningstokenisering og ordtokenisering).
  2. Tekst, hvis tags skal udskrives.
  3. Sætningstokenisering.
  4. En for-løkke implementeres, hvor ord tokeniseres fra sætningen, og tagget for hvert ord udskrives som output.

I et korpus er der to typer POS-taggere:

1. Regelbaseret POS-tagger: For ord med tvetydig betydning anvendes en regelbaseret tilgang baseret på kontekstuel information. Det gøres ved at analysere betydningen af ​​det foregående eller efterfølgende ord. Derfor tagges ord efter de grammatiske regler i et bestemt sprog, såsom store bogstaver og tegnsætning. For eksempel Brills tagger.

2. Stokastisk POS-tagger: Tilgange som hyppighed eller sandsynlighed anvendes under denne metode. Hvis et ord for det meste er tagget med et bestemt tag i træningssættet, får det tildelt det pågældende tag i testsætningen. Ordtagget afhænger ikke kun af sit eget tag, men også af det foregående tag, så denne metode er ikke altid nøjagtig.

POS-tagging med skjult Markov-model

Mærkningsproblemer kan også modelleres ved hjælp af en skjult Markov-model (HMM). Den behandler input-tokens som en observerbar sekvens, mens tags betragtes som skjulte tilstande, og målet er at bestemme den skjulte tilstandssekvens. For eksempel er x = x1,x2,…,xn, hvor x er en sekvens af tokens, mens y = y1,y2,y3,y4…yn er den skjulte sekvens.

Hvordan fungerer Hidden Markov Model (HMM)?

HMM bruger en fællesfordeling P(x, y), hvor x er input-tokensekvensen og y er tagsekvensen. Tagsekvensen for x vil være argmax over y1…yn af p(x1,x2,…xn,y1,y2,y3,…). Vi har kategoriseret tags fra teksten, men statistik for sådanne tags er afgørende, så den næste del er at tælle disse tags til statistisk undersøgelse.

Ofte Stillede Spørgsmål

POS-tagging mærker hvert enkelt ord med dets ordklasse, såsom substantiv eller verbum. Chunking går et skridt videre og grupperer de taggede ord i sætninger som substantivfraser, hvilket giver sætningen en overfladisk struktur.

Overfladisk parsing, også kaldet chunking eller let parsing, holder maksimalt ét niveau mellem rødder og blade. Den identificerer sætningsgrænser uden at bygge et fuldt parsetræ, hvilket gør det hurtigere end dyb parsing.

Opdeling af grupper af taggede ord i sætninger, hvilket gør det muligt for et system at registrere enheder såsom personer, steder, datoer eller produkter. Genkendelse af navngivne enheder er afhængig af disse chunks for attracmeningsfulde værdier fra rå tekst.

Funktionen nltk.pos_tag() tildeler ordklasse-tags. Du tokeniserer først teksten med word_tokenize, og sender derefter tokenlisten til pos_tag, som returnerer hvert ord parret med dets tag, f.eks. NN, VB eller JJ.

Ja. Moderne AI-taggere trænet med maskinlæring og dybe neurale netværk løser tvetydige ord ved at lære kontekst fra store korpus og opnår dermed højere nøjagtighed end regelbaserede metoder på tekst fra den virkelige verden.

Stokastiske taggere bruger sandsynlighed lært fra træningsdata. Maskinlæring estimerer, hvor sandsynligt hvert tag er for et ord givet de omgivende tags, og vælger derefter den sekvens med den højeste samlede sandsynlighed.

Udover NLTK, populære muligheder inkluderer spaCy til hurtige produktionsrørledninger, Stanford CoreNLP og Hugging Face Transformers til transformerbaseret tagging.

I en chunk-grammatik matcher et punktum ethvert tegn undtagen en ny linje, en asterisk matcher nul eller flere gentagelser, og et spørgsmålstegn matcher nul eller én gentagelse af det foregående POS-tagmønster.

Opsummer dette indlæg med: