Tagging POS con NLTK e Chunking in NLP [ESEMPI]

โšก Riepilogo intelligente

Il POS Tagging assegna una parte del discorso a ogni parola in una frase, mentre il Chunking raggruppa le parole etichettate in frasi significative come sintagmi nominali, aggiungendo una struttura superficiale che NLTK costruisce con espressioni regolari in Python.

  • ๐Ÿท๏ธ Etichettatura POS: Ogni parola riceve un token grammaticale come NN, VB o JJ dal suo contesto.
  • ๐ŸŒฟ chunking: Le parole etichettate vengono raggruppate in frasi, un processo chiamato anche analisi sintattica superficiale.
  • ๐Ÿ”ค Flusso di lavoro: Innanzitutto, si procede alla tokenizzazione del testo, quindi all'applicazione del pos_tag e infine al parsing con una grammatica RegexpParser.
  • ๐Ÿ“Š Conteggio delle etichette: Counter e FreqDist rivelano le frequenze di tag e parole per l'ingegneria delle caratteristiche.
  • ๐Ÿ”— Collocazioni: I bigrammi e i trigrammi catturano coppie e triple di parole per caratteristiche testuali piรน efficaci.
  • ๐Ÿค– Utilizzo dell'IA: I tagger basati sull'apprendimento automatico e sugli HMM gestiscono le parole ambigue in modo probabilistico.

Etichettatura POS con NLTK e segmentazione in NLP

Etichettatura POS

Etichettatura POS L'etichettatura grammaticale (Parts of Speech Tagging) รจ un processo che etichetta le parole in formato testuale in base alla loro definizione e al contesto, assegnando a ciascuna parola un token specifico (Parte del Discorso).

Impariamo con un esempio di parte del discorso di NLTK:

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

Fasi coinvolte nell'esempio di etichettatura POS

  • Tokenizza il testo (word_tokenize)
  • Applica pos_tag al passaggio precedente, ovvero nltk.pos_tag(tokenize_text)

Di seguito sono riportati alcuni esempi di tag POS NLTK:

Abbreviazione Significato
CC congiunzione coordinativa
CD cifra cardinale
DT determinante
EX esistenziale lรฌ
FW parola straniera
IN preposizione/congiunzione subordinante
JJ aggettivo
JJR aggettivo, comparativo
JJS aggettivo, superlativo
LS mercato di listino
MD modale
NN sostantivo singolare
NNS sostantivo plurale
PNN nome proprio, singolare
NNPS nome proprio, plurale
PDT predeterminante
POS desinenza possessiva
PRP pronome personale
Prezzo consigliato pronome possessivo
RB avverbio
RBR avverbio, comparativo
RBS avverbio, superlativo
RP particella
A Indicatore infinito
UH interiezione
VB verbo
GBV verbo gerundio
VBD verbo al passato remoto
VBN verbo participio passato
VBP verbo, presente indicativo, non terza persona singolare
VBZ verbo, presente indicativo con terza persona singolare
wdt determinante wh
WP pronome wh
WRB avverbio wh-

L'elenco di tag POS NLTK sopra riportato contiene tutti i tag POS NLTK. Il tagger POS NLTK viene utilizzato per assegnare informazioni grammaticali a ciascuna parola della frase. L'installazione, l'importazione e il download di tutti i pacchetti POS NLTK sono ora completi.

Cos'รจ il Chunking nella PNL?

chunking In PNL (elaborazione del linguaggio naturale), il chunking รจ un processo che consiste nel raggruppare piccole informazioni in unitร  piรน grandi. L'uso principale del chunking รจ la creazione di gruppi di "sintagmi nominali". Viene utilizzato per dare struttura alla frase seguendo l'etichettatura POS (Part-of-Speaking) combinata con le espressioni regolari. Il gruppo di parole risultante รจ chiamato "chunk". รˆ anche noto come parsing superficiale.

Nell'analisi sintattica superficiale, esiste al massimo un livello tra radici e foglie, mentre l'analisi sintattica profonda comprende piรน di un livello. L'analisi sintattica superficiale รจ anche chiamata analisi sintattica leggera o chunking.

Regole per il Chunking

Non ci sono regole predefinite, ma รจ possibile combinarle in base alle esigenze. Ad esempio, supponiamo di dover etichettare un nome, un verbo (al passato), un aggettivo e una congiunzione coordinante all'interno di una frase. รˆ possibile utilizzare la regola seguente:

chunk:{***?}

La tabella seguente illustra il significato dei vari simboli:

Nome del simbolo Descrizione
. Qualsiasi carattere tranne la nuova riga
* Abbina 0 o piรน ripetizioni
? Abbina 0 o 1 ripetizioni

Ora scriviamo il codice per comprendere meglio la regola.

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)

Produzione:

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

La conclusione della parte precedente del tagging del discorso Python Ad esempio, "make" รจ un verbo che non รจ incluso nella regola, quindi non viene etichettato come mychunk.

Caso d'uso del Chunking

La segmentazione (chunking) viene utilizzata per il rilevamento delle entitร . Un'entitร  รจ quella parte della frase tramite la quale una macchina ottiene il valore corrispondente a una determinata intenzione.

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

In altre parole, il chunking viene utilizzato per selezionare sottoinsiemi di token. Segui il codice qui sotto per capire come viene utilizzato il chunking per selezionare i token. In questo esempio, vedrai un grafico che corrisponde a un blocco di un sintagma nominale.

 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

Produzione:

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

Sostantivo Frase Grafico in blocchi

Sostantivo Frase Chunking Grafico

Dal grafico possiamo concludere che "learn" e "guru99" sono due token diversi ma vengono classificati come sintagmi nominali, mentre il token "from" non appartiene a un sintagma nominale. Il chunking viene utilizzato per categorizzare token diversi nello stesso chunk. Il risultato dipenderร  dalla grammatica selezionata. Inoltre, in NLTK il chunking viene utilizzato per etichettare modelli ed esplorare corpus di testo.

Conteggio delle etichette POS

Ne abbiamo discusso vari pos_tag valori precedentemente. Qui studierai come contare questi tag. Il conteggio dei tag รจ fondamentale per la classificazione del testo e per la preparazione delle caratteristiche per le operazioni di elaborazione del linguaggio naturale. Scriveremo prima il codice funzionante e poi spiegheremo i passaggi.

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)

Produzione:

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

Elaborazione del codice:

  1. Utilizza il pacchetto Counter del modulo collections. Counter รจ una sottoclasse di dizionario che memorizza gli elementi come chiavi e i relativi conteggi come valori.
  2. Importa NLTK per tokenizzare il testo.
  3. Scrivi il testo di cui vuoi contare il pos_tag.
  4. Convertire tutte le parole in minuscolo prima della tokenizzazione.
  5. Passa le parole attraverso word_tokenize e calcola il pos_tag di ogni token.
  6. Il contatore quindi conta il numero totale di occorrenze di ciascun tag nel testo.

Distribuzione di frequenza

La distribuzione di frequenza si riferisce al numero di volte in cui si verifica un risultato di un esperimento. Viene utilizzata per trovare la frequenza di ogni parola presente in un documento. Utilizza il FreqDist classe definita da probabilitร  NLTK modulo. Il conteggio viene incrementato di uno ogni volta che si verifica un campionamento.

Per ogni parola, possiamo verificare quante volte compare in un documento. Ad esempio:

  • Metodo di conteggio: freq_dist.count('and') restituisce il numero di volte in cui si รจ verificato 'and'. Viene chiamato metodo count.
  • Metodo di frequenza: freq_dist.freq('and') restituisce la frequenza di un dato campione.

Scriveremo un piccolo programma che calcola la distribuzione di frequenza di ogni parola nel testo.

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

Spiegazione del codice:

  1. Importa il modulo NLTK.
  2. Scrivi il testo di cui devi trovare la distribuzione delle parole.
  3. Tokenizzare ogni parola del testo, che viene poi utilizzata come input per il modulo FreqDist di nltk.
  4. Applica ciascuna parola a nltk.FreqDist sotto forma di elenco.
  5. Rappresenta le parole nel grafico utilizzando la funzione plot().

NOTA: per visualizzare il grafico รจ necessario installare matplotlib. Questo strumento conta le occorrenze di ogni parola nel testo e aiuta nell'analisi del sentiment basata sul testo. Il termine chiave รจ "tokenizzazione": dopo la tokenizzazione, ogni parola viene controllata per determinare quante volte รจ comparsa.

Collocazioni: bigram e trigrammi

Le collocazioni sono coppie di parole che ricorrono insieme piรน volte in un documento. Si calcolano come rapporto tra il numero di queste coppie che compaiono insieme e il numero totale di parole del documento.

Consideriamo parole come raggi ultravioletti e raggi infrarossi. Le parole ultravioletti e raggi non vengono usate singolarmente e quindi possono essere trattate come una collocazione. Un altro esempio รจ la TAC, poichรฉ non diciamo TAC e scansione separatamente. Le collocazioni possono essere classificate in due tipi:

  • Bigrammi: combinazione di due parole
  • Trigrammi: combinazione di tre parole

I bigrammi e i trigrammi forniscono caratteristiche piรน significative e utili per l'espressione delle caratteristichetracfase di zione. Sono particolarmente utili nell'analisi del sentiment basata sul testo.

Esempio di bigrammi 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)

Produzione:

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

Esempio di trigrammi Code:

A volte diventa importante vedere una coppia di tre parole nella frase per l'analisi statistica e il conteggio della frequenza. Anche questo gioca un ruolo cruciale nella formazione NLP (elaborazione del linguaggio naturale) funzionalitร  e previsione del sentiment basata sul testo. Lo stesso codice viene eseguito per calcolare i trigrammi.

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

Produzione:

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

Taggare le frasi

L'etichettatura di una frase consiste nell'aggiungere etichette come verbo o nome in base al contesto della frase. Identificare le etichette POS รจ complesso, quindi l'etichettatura generica manuale non รจ possibile, poichรฉ alcune parole hanno significati ambigui a seconda della struttura della frase. La conversione del testo in un elenco รจ un passaggio importante prima dell'etichettatura, poichรฉ ogni parola viene iterata e conteggiata per una specifica etichetta.

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 Spiegazione:

  1. Code per importare nltk (il Natural Language Toolkit, che contiene sottomoduli come la tokenizzazione delle frasi e la tokenizzazione delle parole).
  2. Testo i cui tag devono essere stampati.
  3. Tokenizzazione delle frasi.
  4. Viene implementato un ciclo for in cui le parole vengono suddivise in token all'interno della frase e il tag di ciascuna parola viene stampato come output.

In un corpus esistono due tipi di tagger POS:

1. Etichettatore POS basato su regole: Per le parole dal significato ambiguo, si applica un approccio basato su regole e informazioni contestuali. Questo avviene analizzando il significato della parola precedente o successiva. Pertanto, le parole vengono etichettate secondo le regole grammaticali di una particolare lingua, come la maiuscola e la punteggiatura. Ad esempio, il tagger di Brill.

2. Etichettatore POS stocastico: In questo metodo si applicano approcci basati sulla frequenza o sulla probabilitร . Se una parola รจ prevalentemente associata a una determinata etichetta nel set di addestramento, le viene assegnata la stessa etichetta nella frase di test. Tuttavia, l'etichetta di una parola dipende non solo dalla propria etichetta, ma anche dall'etichetta precedente, pertanto questo metodo non รจ sempre accurato.

Etichettatura POS con modello di Markov nascosto

I problemi di etichettatura possono essere modellati anche utilizzando un modello di Markov nascosto (HMM). Questo modello considera i token di input come una sequenza osservabile, mentre i tag sono considerati stati nascosti, e l'obiettivo รจ determinare la sequenza degli stati nascosti. Ad esempio, x = x1,x2,โ€ฆ,xn, dove x รจ una sequenza di token, mentre y = y1,y2,y3,y4โ€ฆyn รจ la sequenza nascosta.

Come funziona il modello di Markov nascosto (HMM)?

HMM utilizza una distribuzione congiunta P(x, y), dove x รจ la sequenza di token di input e y รจ la sequenza di tag. La sequenza di tag per x sarร  argmax su y1โ€ฆyn di p(x1,x2,โ€ฆxn,y1,y2,y3,โ€ฆ). Abbiamo categorizzato i tag dal testo, ma le statistiche di tali tag sono fondamentali, quindi la parte successiva consiste nel contare questi tag per l'analisi statistica.

DOMANDE FREQUENTI

L'etichettatura POS (Part-of-Speaking) assegna a ogni singola parola la sua parte del discorso, come nome o verbo. Il chunking va oltre e raggruppa le parole etichettate in frasi, come i sintagmi nominali, conferendo alla frase una struttura piรน semplice.

L'analisi sintattica superficiale, detta anche segmentazione o analisi leggera, mantiene al massimo un livello tra radici e foglie. Identifica i confini delle frasi senza costruire un albero sintattico completo, il che la rende piรน veloce dell'analisi sintattica profonda.

Il chunking raggruppa le parole etichettate in frasi, consentendo a un sistema di rilevare entitร  come persone, luoghi, date o prodotti. Il riconoscimento delle entitร  nominate si basa su questi chunk per esprimeretract valori significativi da testo grezzo.

La funzione nltk.pos_tag() assegna tag di parte del discorso. Per prima cosa, si tokenizza il testo con word_tokenize, quindi si passa l'elenco di token a pos_tag, che restituisce ogni parola associata al suo tag, come NN, VB o JJ.

Sรฌ. I moderni tagger basati sull'intelligenza artificiale, addestrati con l'apprendimento automatico e le reti neurali profonde, risolvono le parole ambigue apprendendo il contesto da grandi corpus di dati, raggiungendo una precisione superiore rispetto ai metodi basati su regole su testi reali.

I tagger stocastici utilizzano la probabilitร  appresa dai dati di addestramento. L'apprendimento automatico stima la probabilitร  che ciascun tag corrisponda a una parola, tenendo conto dei tag circostanti, e seleziona la sequenza con la probabilitร  complessiva piรน elevata.

Oltre a NLTK, le opzioni piรน popolari includono spacy Per pipeline di produzione veloci, Stanford CoreNLP e Hugging Face Transformers per l'etichettatura basata su transformer.

In una grammatica a blocchi, il punto corrisponde a qualsiasi carattere tranne un'interruzione di riga, l'asterisco corrisponde a zero o piรน ripetizioni e il punto interrogativo corrisponde a zero o una ripetizione del precedente schema di tag POS.

Riassumi questo post con: