POS-tagging met NLTK en chunking in NLP [VOORBEELDEN]

POS-tagging

POS-tagging (Parts of Speech Tagging) is een proces om de woorden in tekstformaat te markeren voor een bepaald deel van een toespraak op basis van de definitie en context ervan. Het is verantwoordelijk voor het lezen van tekst in een taal en het toewijzen van een specifiek token (delen van spraak) aan elk woord. Het wordt ook wel grammaticale tagging genoemd.

Laten we leren met een NLTK Part of Speech-voorbeeld:

Input: Alles om ons dit toe te staan.

Output: [('Alles', NN),('aan', TO), ('vergunning', VB), ('ons', PRP)]

Stappen die betrokken zijn bij het voorbeeld van POS-tagging

  • Tokenize-tekst (word_tokenize)
  • pas pos_tag toe op bovenstaande stap, namelijk nltk.pos_tag(tokenize_text)

Voorbeelden van NLTK POS-tags zijn als volgt:

Afkorting Betekenis
CC coördinerende conjunctie
CD kardinaal cijfer
DT bepaler
EX existentieel daar
FW buitenlands woord
IN voorzetsel/ondergeschikt voegwoord
JJ Deze NLTK POS-tag is een bijvoeglijk naamwoord (groot)
JJR bijvoeglijk naamwoord, vergelijkend (groter)
JJS bijvoeglijk naamwoord, superlatief (grootste)
LS lijst markt
MD modaal (kan, wil)
NN zelfstandig naamwoord, enkelvoud (kat, boom)
NNS zelfstandig naamwoord meervoud (bureaus)
NNP eigennaam, enkelvoud (sarah)
NNPS eigennaam, meervoud (indianen of amerikanen)
PDT voorbepaler (alle, beide, de helft)
POS bezittelijke uitgang (ouder's)
PRP persoonlijk voornaamwoord (haar, haarzelf, hem, zichzelf)
PRP$ bezittelijk voornaamwoord (haar, zijn, mijn, mijn, onze)
RB bijwoord (af en toe, snel)
RBR bijwoord, vergelijkend (groter)
RBS bijwoord, overtreffende trap (grootste)
RP deeltje (ongeveer)
TO oneindige markering (naar)
UH tussenwerpsel (tot ziens)
VB werkwoord (vragen)
GBV werkwoord gerund (oordelen)
VBD werkwoord verleden tijd (pleitte)
VBN werkwoord voltooid deelwoord (herenigd)
VBP werkwoord, tegenwoordige tijd, niet 3e persoon enkelvoud (wrap)
VBZ werkwoord, tegenwoordige tijd met 3e persoon enkelvoud (basen)
wdt wh-determinant (dat, wat)
WP wh- voornaamwoord (wie)
WRB wh- bijwoord (hoe)

De bovenstaande NLTK POS-taglijst bevat alle NLTK POS-tags. NLTK POS-tagger wordt gebruikt om grammaticale informatie aan elk woord van de zin toe te wijzen. Het installeren, importeren en downloaden van alle pakketten van POS NLTK is voltooid.

Wat is chunking in NLP?

gerammel in NLP is een proces om kleine stukjes informatie te nemen en ze te groeperen in grote eenheden. Het primaire gebruik van Chunking is het maken van groepen van "zelfstandige naamwoordzinnen". Het wordt gebruikt om structuur toe te voegen aan de zin door POS-tagging te volgen in combinatie met reguliere expressies. De resulterende groep woorden worden "chunks" genoemd. Het wordt ook wel ondiepe parsing genoemd.

Bij ondiep parseren is er maximaal één niveau tussen wortels en bladeren, terwijl diep parseren uit meer dan één niveau bestaat. Ondiep parseren wordt ook wel light parsing of chunking genoemd.

Regels voor het chunken

Er zijn geen vooraf gedefinieerde regels, maar u kunt ze naar behoefte en vereisten combineren.

U moet bijvoorbeeld het zelfstandig naamwoord, het werkwoord (verleden tijd), het bijvoeglijk naamwoord en het coördinerende kruispunt uit de zin taggen. U kunt de regel gebruiken zoals hieronder

brok:{ * * * ?}

De volgende tabel laat zien wat de verschillende symbolen betekenen:

Naam van symbool BESCHRIJVING
. Elk teken behalve nieuwe regel
* Match 0 of meer herhalingen
? Match 0 of 1 herhalingen

Laten we nu de code schrijven om de regel beter te begrijpen

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:{<NN.?>*<VBD.?>*<JJ.?>*<CC>?}"""
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:
       <ChunkRule: '<NN.?>*<VBD.?>*<JJ.?>*<CC>?'>
After Chunking (S
  (mychunk learn/JJ)
  (mychunk php/NN)
  from/IN
  (mychunk guru99/NN and/CC)
  make/VB
  (mychunk study/NN easy/JJ))

De conclusie uit de bovenstaande Part of Speech-tagging Python voorbeeld: “make” is een werkwoord dat niet in de regel is opgenomen, dus het is niet getagd als mychunk

Gebruiksgeval van chunking

Chunking wordt gebruikt voor entiteitsdetectie. Een entiteit is dat deel van de zin waarmee de machine de waarde voor een intentie krijgt.

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

Met andere woorden, chunking wordt gebruikt bij het selecteren van de subsets van tokens. Volg de onderstaande code om te begrijpen hoe chunking wordt gebruikt om de tokens te selecteren. In dit voorbeeld ziet u de grafiek die overeenkomt met een deel van een zelfstandig naamwoord. We zullen de code schrijven en de grafiek tekenen voor een beter begrip.

Code om gebruiksscenario te demonstreren

 import nltk
text = "learn php from guru99"
tokens = nltk.word_tokenize(text)
print(tokens)
tag = nltk.pos_tag(tokens)
print(tag)
grammar = "NP: {<DT>?<JJ>*<NN>}"
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

Diagram

Zelfstandige zin Chunking-grafiek
Zelfstandige zin chunking Grafiek

Uit de grafiek kunnen we concluderen dat “learn” en “guru99” twee verschillende tokens zijn, maar gecategoriseerd zijn als Noun Phrase, terwijl token “from” niet tot de Noun Phrase behoort.

Chunking wordt gebruikt om verschillende tokens in hetzelfde stuk te categoriseren. Het resultaat zal afhangen van de geselecteerde grammatica. Verdere chunking NLTK wordt gebruikt om patronen te taggen en tekstcorpora te verkennen.

POS-TAGS TELLEN

We hebben er verschillende besproken pos_tag in de vorige sectie. In deze specifieke tutorial leert u hoe u deze tags kunt tellen. Het tellen van tags is cruciaal voor tekstclassificatie en ook voor het voorbereiden van de functies voor de op natuurlijke taal gebaseerde bewerkingen. Ik zal met u de aanpak bespreken die guru99 volgde bij het voorbereiden van code, samen met een bespreking van de output. Ik hoop dat dit u zal helpen.

Tags tellen:

Hier zullen we eerst werkende code schrijven en daarna zullen we verschillende stappen schrijven om de code uit te leggen.

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})

Uitwerking van de code

POS-TAGS TELLEN

  1. Om de tags te tellen, kunt u het pakket Counter uit de module van de collectie gebruiken. Een counter is een dictionary-subklasse die werkt op het principe van key-value-bewerking. Het is een ongeordende collectie waarin elementen worden opgeslagen als een dictionary-sleutel terwijl de count hun waarde is.
  2. Importeer nltk die modules bevat om de tekst te tokeniseren.
  3. Schrijf de tekst waarvan u de pos_tag wilt tellen.
  4. Sommige woorden zijn in hoofdletters en sommige in kleine letters. Het is dus passend om alle woorden in kleine letters te transformeren voordat u tokenisatie toepast.
  5. Geef de woorden door word_tokenize vanuit nltk.
  6. Bereken de pos_tag van elk token
    Output = [('guru99', 'NN'), ('is', 'VBZ'), ('one', 'CD'), ('of', 'IN'), ('the', 'DT'), ('best', 'JJS'), ('site', 'NN'), ('to', 'TO'), ('learn', 'VB'), ('web', 'NN'), (',', ','), ('sap', 'NN'), (',', ','), ('ethical', 'JJ'), ('hacking', 'NN'), ('and', 'CC'), ('much', 'RB'), ('more', 'JJR'), ('online', 'JJ')]
  7. Nu komt de rol van woordenboekteller. We hebben coderegel 1 geïmporteerd. Woorden zijn de sleutel en tags zijn de waarde en de teller telt elk tagtotaalaantal in de tekst.

Frequentieverdeling

Frequentieverdeling wordt het aantal keren genoemd dat een uitkomst van een experiment voorkomt. Het wordt gebruikt om de frequentie te vinden van elk woord dat in een document voorkomt. Het gebruikt FreqDistklasse en bepaald door de nltk.waarschijnlijkheid module.

Een frequentieverdeling wordt meestal gecreëerd door het tellen van de monsters van het herhaaldelijk uitvoeren van het experiment. Het aantal tellingen wordt elke keer met één verhoogd. Bijv

freq_dist = FreqDist()

voor het token in het document:

freq_dist.inc(token.type())

Voor elk woord kunnen we controleren hoe vaak het in een bepaald document voorkomt. Bijv

  1. Telmethode: freq_dist.count('and')Deze expressie retourneert de waarde van het aantal keren dat 'en' voorkomt. Het wordt de telmethode genoemd.
  2. Frequentiemethode: freq_dist.freq('and')Dit is de uitdrukking die de frequentie van een gegeven sample retourneert.

We zullen een klein programma schrijven en de werking ervan in detail uitleggen. We zullen wat tekst schrijven en de frequentieverdeling van elk woord in de tekst berekenen.

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()

Frequentieverdeling

Toelichting code:

  1. Importeer nltk-module.
  2. Schrijf de tekst waarvan je de woordverdeling moet vinden.
  3. Tokeniseer elk woord in de tekst dat als invoer dient voor de FreqDist-module van de nltk.
  4. Pas elk woord toe op nlk.FreqDist in de vorm van een lijst
  5. Teken de woorden in de grafiek met behulp van plot()

Visualiseer de grafiek voor een beter begrip van de geschreven tekst

Frequentieverdeling van elk woord in de grafiek

Frequentieverdeling van elk woord in de grafiek

OPMERKING: Matplotlib moet zijn geïnstalleerd om de bovenstaande grafiek te kunnen zien

Bekijk de grafiek hierboven. Het komt overeen met het tellen van het voorkomen van elk woord in de tekst. Het helpt bij het bestuderen van tekst en verder bij het implementeren van op tekst gebaseerde sentimentele analyse. In een notendop kan worden geconcludeerd dat nltk een module heeft voor het tellen van het voorkomen van elk woord in de tekst, wat helpt bij het voorbereiden van de statistieken van natuurlijke taalkenmerken. Het speelt een belangrijke rol bij het vinden van de trefwoorden in de tekst. U kunt de tekst ook uit de pdf extraheren met behulp van bibliotheken zoals extract, PyPDF2 en de tekst invoeren in nlk.FreqDist.

De sleutelterm is "tokenize". Na het tokeniseren controleert het voor elk woord in een bepaalde paragraaf of tekstdocument om te bepalen hoe vaak het voorkomt. Hiervoor hebt u de NLTK-toolkit niet nodig. U kunt het ook doen met uw eigen Python-programmeervaardigheden. De NLTK-toolkit biedt alleen een kant-en-klare code voor de verschillende bewerkingen.

Het tellen van elk woord is misschien niet zo nuttig. In plaats daarvan zou men zich moeten richten op collocation en bigrams, die te maken hebben met veel woorden in een paar. Deze paren identificeren nuttige trefwoorden om natuurlijke taalfuncties te verbeteren die aan de machine kunnen worden doorgegeven. Kijk hieronder voor hun details.

Collocaties: bigrams en trigrammen

Wat zijn collocaties?

Collocaties zijn de woordparen die vele malen samen voorkomen in een document. Het wordt berekend op basis van het aantal van deze paren dat samen voorkomt, ten opzichte van het totale aantal woorden van het document.

Denk eens aan het elektromagnetisch spectrum met woorden als ultraviolette stralen, infraroodstralen.

De woorden ultraviolet en stralen worden niet afzonderlijk gebruikt en kunnen daarom worden behandeld als collocatie. Een ander voorbeeld is de CT-scan. We zeggen CT en Scan niet afzonderlijk, en daarom worden ze ook als collocatie behandeld.

We kunnen zeggen dat het vinden van collocaties het berekenen van de frequenties van woorden en hun verschijning in de context van andere woorden vereist. Deze specifieke woordverzamelingen vereisen filtering om nuttige inhoudstermen te behouden. Elke gram woorden kan vervolgens worden gescoord volgens een bepaalde associatiemaatstaf, om de relatieve waarschijnlijkheid te bepalen dat elke Ingram een ​​collocatie is.

Collocatie kan worden onderverdeeld in twee typen:

  • Bigramen ccombinatie van twee woorden
  • Trigrammencombinatie van drie woorden

Bigrams en Trigrams bieden betekenisvollere en nuttigere functies voor de fase van de functie-extractie. Deze zijn vooral nuttig bij op tekst gebaseerde sentimentele analyses.

Bigrams-voorbeeldcode

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', '.')]

Trigrammen Voorbeeldcode

Soms wordt het belangrijk om een ​​paar van drie woorden in de zin te zien voor statistische analyse en frequentietelling. Dit speelt opnieuw een cruciale rol bij de vorming NLP (functies voor natuurlijke taalverwerking) en op tekst gebaseerde sentimentele voorspelling.

Dezelfde code wordt uitgevoerd voor het berekenen van de trigrammen.

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', '.')]   

Zinnen taggen

Zin taggen in bredere zin verwijst naar de toevoeging van labels van het werkwoord, zelfstandig naamwoord, enz., door de context van de zin. Identificatie van POS-tags is een ingewikkeld proces. Generieke tagging van POS is dus handmatig niet mogelijk, omdat sommige woorden verschillende (dubbelzinnige) betekenissen kunnen hebben afhankelijk van de structuur van de zin. Het converteren van tekst in de vorm van een lijst is een belangrijke stap vóór het taggen, aangezien elk woord in de lijst in een lus wordt opgenomen en voor een bepaalde tag wordt geteld. Zie de onderstaande code om deze beter te begrijpen

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)))

Output:

[('Hallo', 'NNP'), ('Guru99', 'NNP'), (',', ','), ('Jij', 'PRP'), ('heb', 'VBP') , ('build', 'VBN'), ('a', 'DT'), ('zeer', 'RB'), ('goed', 'JJ'), ('site', 'NN') , ('en', 'CC'), ('ik', 'PRP'), ('liefde', 'VBP'), ('op bezoek', 'VBG'), ('jouw', 'PRP$' ), ('site', 'NN'), ('.', '.')]

Zinnen taggen

Code Verklaring:

  1. Code om nltk te importeren (toolkit voor natuurlijke taal die submodules bevat zoals zin tokenize en woord tokenize.)
  2. Tekst waarvan de tags moeten worden afgedrukt.
  3. Zin tokenisatie
  4. Er wordt een For-lus geïmplementeerd waarbij woorden worden getokeniseerd uit een zin en de tag van elk woord wordt afgedrukt als uitvoer.

In Corpus zijn er twee soorten POS-taggers:

  • Op regels gebaseerd
  • Stochastische POS-taggers

1. Op regels gebaseerde POS-tagger: Voor woorden met een dubbelzinnige betekenis wordt een regelgebaseerde benadering op basis van contextuele informatie toegepast. Dit gebeurt door de betekenis van het voorgaande of het volgende woord te controleren of analyseren. Informatie wordt geanalyseerd vanuit de omgeving van het woord of binnen het woord zelf. Daarom worden woorden getagd door de grammaticale regels van een bepaalde taal, zoals hoofdlettergebruik en leestekens. Bijvoorbeeld Brill's tagger.

2. Stochastische POS-tagger: Bij deze methode worden verschillende benaderingen toegepast, zoals frequentie of waarschijnlijkheid. Als een woord in de trainingsset meestal met een bepaalde tag is getagd, krijgt het in de testzin die specifieke tag. De woordtag is niet alleen afhankelijk van zijn eigen tag, maar ook van de vorige tag. Deze methode is niet altijd nauwkeurig. Een andere manier is om de waarschijnlijkheid te berekenen dat een specifieke tag in een zin voorkomt. De uiteindelijke tag wordt dus berekend door de hoogste waarschijnlijkheid van een woord met een bepaalde tag te controleren.

POS-tagging met verborgen Markov-model

Taggingproblemen kunnen ook worden gemodelleerd met behulp van HMM. Het beschouwt invoertokens als waarneembare reeksen, terwijl tags worden beschouwd als verborgen toestanden en het doel is om de volgorde van de verborgen toestanden te bepalen. Bijvoorbeeld x = x1,x2,…………,Xn waarbij x een reeks tokens is terwijl j = j1,y2,y3,y4…jnis de verborgen reeks.

Hoe werkt het verborgen Markov-model (HMM)?

HMM gebruikt een join-distributie die P(x, y) is, waarbij x de invoerreeks/tokenreeks is en y de tagreeks is.

De tagreeks voor x is argmaxj1….ynp(x1,x2,….xn,y1,y2,y3,…..). We hebben tags uit de tekst gecategoriseerd, maar statistieken van dergelijke tags zijn van vitaal belang. Het volgende deel is dus het tellen van deze tags voor statistisch onderzoek.

Samenvatting

  • POS-tagging in NLTK is een proces om de woorden in tekstformaat te markeren voor een bepaald deel van een toespraak op basis van de definitie en context ervan.
  • Enkele voorbeelden van NLTK POS-tagging zijn: CC, CD, EX, JJ, MD, NNP, PDT, PRP$, TO, enz.
  • POS-tagger wordt gebruikt om grammaticale informatie aan elk woord van de zin toe te wijzen. Het installeren, importeren en downloaden van alle pakketten van Part of Speech-tagging met NLTK is voltooid.
  • Chunking in NLP is een proces waarbij kleine stukjes informatie in grote eenheden worden gegroepeerd.
  • Er zijn geen vooraf gedefinieerde regels, maar u kunt ze naar behoefte en vereisten combineren.
  • Chunking wordt gebruikt voor entiteitsdetectie. Een entiteit is dat deel van de zin waarmee de machine de waarde voor een intentie krijgt.
  • Chunking wordt gebruikt om verschillende tokens in hetzelfde stuk te categoriseren.