Etichetarea POS cu NLTK și Chunking în NLP [EXEMPLE]

⚡ Rezumat inteligent

Etichetarea POS atribuie o parte de vorbire fiecărui cuvânt dintr-o propoziție, în timp ce gruparea în blocuri grupează acele cuvinte etichetate în sintagme semnificative, cum ar fi sintagme nominale, adăugând o structură superficială pe care NLTK o construiește cu expresii regulate. Python.

  • 🏷️ Etichetarea POS: Fiecare cuvânt primește un indiciu gramatical precum NN, VB sau JJ din contextul său.
  • 🌿 Îmbunătățire: Cuvintele etichetate sunt grupate în sintagme, un proces numit și analiză superficială.
  • 🔤 Flux de lucru: Mai întâi tokenizează textul, apoi aplică pos_tag, apoi analizează-l cu o gramatică RegexpParser.
  • 📊 Numărarea etichetelor: Counter și FreqDist dezvăluie frecvențele etichetelor și cuvintelor pentru ingineria caracteristicilor.
  • 🔗 Colocații: Bigramele și trigramele capturează perechi și triplete de cuvinte pentru caracteristici textuale mai puternice.
  • 🤖 Utilizare AI: Învățarea automată și etichetele bazate pe HMM gestionează probabilistic cuvintele ambigue.

Etichetare POS cu NLTK și Chunking în NLP

Etichetarea POS

Etichetarea POS (Etichetarea părților de vorbire) este un proces de marcare a cuvintelor în format text pentru o anumită parte a unui discurs, pe baza definiției și contextului său. Este responsabil pentru citirea textului într-o limbă și atribuirea unui token specific (părți de vorbire) fiecărui cuvânt. Se mai numește și etichetare gramaticală.

Să învățăm cu un exemplu de parte de vorbire NLTK:

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

Pași implicați în exemplul de etichetare POS

  • Tokenizare text (word_tokenize)
  • Aplică pos_tag la pasul de mai sus, adică nltk.pos_tag(tokenize_text)

Exemple de etichete POS NLTK sunt enumerate mai jos:

Abreviere Sens
CC conjuctie coordonatoare
CD cifră cardinală
DT determinant
EX existențială acolo
FW cuvânt străin
IN prepoziţie/conjuncţie de subordonare
JJ adjectiv
JJR adjectiv, comparativ
JJS adjectiv, superlativ
LS piața de listă
MD modal
NN substantiv, singular
NNS substantiv plural
NNP substantiv propriu, singular
NNPS substantiv propriu, plural
PDT predeterminant
POS terminație posesivă
PRP pronume personal
PRP$ pronume posesiv
RB adverb
extensia RBR adverb, comparativ
RBS adverb, superlativ
RP particulă
LA marker infinit
UH interjecție
VB verb
GBV gerunziu verbal
VBD timpul trecut al verbului
VBN participiu trecut al verbului
VBP verb, timpul prezent, nu persoana a 3-a singular
VBZ verb, timpul prezent la persoana a 3-a singular
WDT determinant wh
WP pronume wh
WRB wh-adverb

Lista de etichete NLTK POS de mai sus conține toate etichetele NLTK POS. Etichetatorul NLTK POS este utilizat pentru a atribui informații gramaticale fiecărui cuvânt din propoziție. Instalarea, importul și descărcarea tuturor pachetelor POS NLTK sunt acum finalizate.

Ce este Chunking în NLP?

chunking În NLP, fragmentarea este un proces de grupare a unor fragmente mici de informații în unități mari. Utilizarea principală a fragmentării (chunking) este crearea de grupuri de „sintagme nominale”. Se folosește pentru a adăuga structură propoziției prin etichetarea POS combinată cu expresii regulate. Grupul de cuvinte rezultat se numește „bucăți”. Se mai numește și analiză superficială.

În analiza superficială, există maximum un nivel între rădăcini și frunze, în timp ce analiza profundă cuprinde mai mult de un nivel. Analiza superficială este numită și analiză ușoară sau chunking.

Reguli pentru Chunking

Nu există reguli predefinite, dar le puteți combina în funcție de nevoi și cerințe. De exemplu, să presupunem că trebuie să etichetați substantivul, verbul (timpul trecut), adjectivul și conjuncția coordonatoare din propoziție. Puteți folosi regula de mai jos:

chunk:{***?}

Următorul tabel prezintă semnificația diferitelor simboluri:

Numele simbolului Descriere
. Orice caracter, cu excepția liniei noi
* Potriviți 0 sau mai multe repetări
? Potriviți 0 sau 1 repetări

Acum haideți să scriem codul pentru a înțelege mai bine regula.

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)

ieșire:

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

Concluzia din partea de mai sus a etichetării vorbirii Python Un exemplu este că „a face” este un verb care nu este inclus în regulă, deci nu este etichetat ca mychunk.

Cazul de utilizare al fragmentării

Segmentarea este utilizată pentru detectarea entităților. O entitate este acea parte a propoziției prin care o mașină obține valoarea pentru orice intenție.

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

Cu alte cuvinte, segmentarea este utilizată pentru a selecta subseturi de token-uri. Vă rugăm să urmați codul de mai jos pentru a înțelege cum este utilizată segmentarea pentru a selecta token-urile. În acest exemplu, veți vedea un grafic care corespunde unui segment dintr-un sintagmă nominală.

 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

ieșire:

['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

Expresie nominală Chunking Graph

Expresie substantivală fragmentare Grafic

Din grafic, putem concluziona că „learn” și „guru99” sunt două token-uri diferite, dar sunt clasificate ca un grup nominal, în timp ce token-ul „from” nu aparține unui grup nominal. Segmentarea este utilizată pentru a clasifica diferite token-uri în același bloc. Rezultatul va depinde de gramatica selectată. În plus, segmentarea în NLTK este utilizată pentru a eticheta modele și pentru a explora corpora de text.

Numărarea etichetelor POS

Am discutat despre diverse pos_tag valori anterior. Aici veți studia cum să numărați aceste etichete. Numărarea etichetelor este crucială pentru clasificarea textului și pentru pregătirea caracteristicilor pentru operațiile în limbaj natural. Mai întâi scriem codul funcțional și apoi explicăm pașii.

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)

ieșire:

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

Elaborarea codului:

  1. Folosește pachetul Counter din modulul colecții. Counter este o subclasă de dicționar care stochează elementele ca chei și numărul lor ca valori.
  2. Importă nltk pentru a tokeniza textul.
  3. Scrieți textul al cărui post_tag doriți să îl numărați.
  4. Transformați toate cuvintele în litere mici înainte de tokenizare.
  5. Transmiteți cuvintele prin word_tokenize și calculați pos_tag-ul fiecărui token.
  6. Contorul numără apoi aparițiile totale ale fiecărei etichete în text.

Distribuția de frecvență

Distribuția frecvenței se referă la numărul de apariții ale unui rezultat al unui experiment. Este utilizată pentru a găsi frecvența fiecărui cuvânt care apare într-un document. Folosește Distribuție frecvență clasă definită de nltk.probabilitate modul. Numărătorul este incrementat cu unu de fiecare dată când apare o mostră.

Pentru orice cuvânt, putem verifica de câte ori a apărut într-un document. De exemplu:

  • Metoda de numărare: freq_dist.count('and') returnează numărul de apariții ale funcției 'and'. Se numește metoda count.
  • Metoda de frecvență: freq_dist.freq('and') returnează frecvența unui eșantion dat.

Vom scrie un mic program care calculează distribuția de frecvență a fiecărui cuvânt din text.

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

Explicația codului:

  1. Importați modulul nltk.
  2. Scrieți textul a cărui distribuție a cuvintelor trebuie să găsiți.
  3. Tokenizează fiecare cuvânt din text, care este servit ca intrare pentru modulul FreqDist al nltk.
  4. Aplică fiecare cuvânt la nltk.FreqDist sub forma unei liste.
  5. Reprezentați cuvintele în grafic folosind funcția plot().

NOTĂ: matplotlib trebuie instalat pentru a vedea graficul. Acesta numără aparițiile fiecărui cuvânt în text și ajută la analiza sentimentelor bazată pe text. Termenul cheie este „tokenizare”: după tokenizare, fiecare cuvânt este verificat pentru a determina de câte ori a apărut.

Colocații: bigrame și trigrame

Colocațiile sunt perechi de cuvinte care apar împreună de mai multe ori într-un document. Se calculează prin raportul dintre numărul acestor perechi care apar împreună și numărul total de cuvinte al documentului.

Luați în considerare cuvinte precum raze ultraviolete și raze infraroșii. Cuvintele ultraviolete și raze nu sunt folosite individual și, prin urmare, pot fi tratate ca o colocație. Un alt exemplu este tomografia computerizată, deoarece nu spunem tomografie computerizată și scanare separat. Colocațiile pot fi clasificate în două tipuri:

  • Bigrame: combinație de două cuvinte
  • Trigrame: combinație de trei cuvinte

Bigramele și trigramele oferă caracteristici mai semnificative și utile pentru exemplul de caracteristici.tracetapa de țiune. Acestea sunt utile în special în analiza sentimentelor bazată pe text.

Exemplu de bigrame 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)

ieșire:

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

Exemplu de trigrame Code:

Uneori devine important să vedeți o pereche de trei cuvinte în propoziție pentru analiza statistică și numărarea frecvenței. Acest lucru joacă din nou un rol crucial în formare PNL (procesarea limbajului natural), precum și predicția sentimentelor bazată pe text. Același cod este rulat pentru calcularea trigramelor.

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

ieșire:

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

Etichetarea propozițiilor

Etichetarea unei propoziții se referă la adăugarea de etichete precum verb sau substantiv pe baza contextului propoziției. Identificarea etichetelor POS este complicată, așadar etichetarea generică nu este posibilă manual, deoarece unele cuvinte au semnificații ambigue în funcție de structura propoziției. Conversia textului într-o listă este un pas important înainte de etichetare, deoarece fiecare cuvânt este repetat și numărat pentru o anumită etichetă.

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 Explicaţie:

  1. Code a importa nltk (Naturalul Language Toolkit, care conține submodule precum tokenizarea propozițiilor și tokenizarea cuvintelor).
  2. Text ale cărui etichete urmează să fie tipărite.
  3. Tokenizarea propozițiilor.
  4. Se implementează o buclă for în care cuvintele sunt tokenizate din propoziție, iar eticheta fiecărui cuvânt este afișată ca ieșire.

Într-un Corpus, există două tipuri de etichete POS:

1. Etichetare POS bazată pe reguli: Pentru cuvintele cu sens ambiguu, se aplică o abordare bazată pe reguli, bazată pe informații contextuale. Aceasta se realizează prin analizarea sensului cuvântului precedent sau următor. Prin urmare, cuvintele sunt etichetate după regulile gramaticale ale unei anumite limbi, cum ar fi scrierea cu majuscule și punctuația. De exemplu, etichetarea lui Brill.

2. Etichetator POS stochastic: În cadrul acestei metode se aplică abordări precum frecvența sau probabilitatea. Dacă un cuvânt este etichetat în mare parte cu o anumită etichetă din setul de antrenament, i se atribuie acea etichetă în propoziția de test. Eticheta cuvântului depinde nu numai de propria etichetă, ci și de eticheta anterioară, deci această metodă nu este întotdeauna precisă.

Etichetare POS cu model Markov ascuns

Problemele de etichetare pot fi modelate și folosind un Model Markov Ascuns (HMM). Acesta tratează token-urile de intrare ca o secvență observabilă, în timp ce etichetele sunt considerate stări ascunse, iar scopul este de a determina secvența stărilor ascunse. De exemplu, x = x1,x2,…,xn, unde x este o secvență de token-uri, în timp ce y = y1,y2,y3,y4…yn este secvența ascunsă.

Cum funcționează Hidden Markov Model (HMM)?

HMM utilizează o distribuție comună P(x, y), unde x este secvența de tokenuri de intrare și y este secvența de etichete. Secvența de etichete pentru x va fi argmax peste y1…yn din p(x1,x2,…xn,y1,y2,y3,…). Am clasificat etichetele din text, dar statisticile acestor etichete sunt vitale, așa că următoarea parte este numărarea acestor etichete pentru studiul statistic.

Întrebări frecvente

Etichetarea POS etichetează fiecare cuvânt individual cu partea sa de vorbire, cum ar fi substantivul sau verbul. Segmentarea merge cu un pas mai departe și grupează acele cuvinte etichetate în sintagme precum sintagme nominale, oferind propoziției o structură superficială.

Analiza superficială, numită și chunking sau parsare ușoară, menține maximum un nivel între rădăcini și frunze. Identifică limitele frazelor fără a construi un arbore de analiză complet, ceea ce o face mai rapidă decât analiza profundă.

Gruparea cuvintelor etichetate în fraze, ceea ce permite unui sistem să detecteze entități precum persoane, locații, date sau produse. Recunoașterea entităților denumite se bazează pe aceste blocuri pentru a exprimatracvalori semnificative din text brut.

Funcția nltk.pos_tag() atribuie etichete pentru părți de vorbire. Mai întâi, textul se tokenizează cu word_tokenize, apoi se transmite lista de tokenuri către pos_tag, care returnează fiecare cuvânt asociat cu eticheta sa, cum ar fi NN, VB sau JJ.

Da. Etichetele moderne bazate pe inteligență artificială, antrenate cu învățare automată și rețele neuronale profunde, rezolvă cuvinte ambigue prin învățarea contextului din corpusuri mari, atingând o precizie mai mare decât metodele bazate pe reguli pe text din lumea reală.

Etichetele stocastice folosesc probabilitatea învățată din datele de antrenament. Învățarea automată estimează cât de probabilă este fiecare etichetă pentru un cuvânt, având în vedere etichetele înconjurătoare, apoi selectează secvența cu cea mai mare probabilitate generală.

În afară de NLTK, opțiunile populare includ spațios pentru conducte de producție rapide, Stanford CoreNLP și transformatoare Hugging Face pentru etichetare bazată pe transformatoare.

Într-o gramatică de tip chunk, un punct se potrivește cu orice caracter cu excepția unei noi linii, un asterisc se potrivește cu zero sau mai multe repetiții, iar un semn de întrebare se potrivește cu zero sau o repetiție a modelului de etichete POS precedent.

Rezumați această postare cu: