2012-02-23 12 views
12

Sto usando il pos_tagger sulle ricette. Un problema che sto avendo è che pos_tagger restituisce che le parole nel tempo imperativo sono sostantivi, non dovrebbero essere verbi? Per esempio:NLTK Pensa che gli imperativi sono nomi

Con l'ingresso:

combine 1 1/2 cups floud, 3/4 cup sugar, salt and baking powder 

L'output è:

[('combine', 'NN'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('floud', 'VBD'), (',',  ','), ('3/4', 'CD'), ('cup', 'NN'), ('sugar', 'NN'), (',', ','), ('salt', 'NN'), ('and', 'CC'), ('baking', 'VBG'), ('powder', 'NN')] 

Ecco il codice che sto utilizzando per questo:

def part_of_speech(self,input_sentance): 
     text = nltk.word_tokenize(input_sentance) 
     return nltk.pos_tag(text) 

Non dovrebbe 'combinare' essere taggato come una sorta di verbo? È questa la colpa del nltk? O sto facendo qualcosa di sbagliato?

+0

Puoi mostrarci quale codice stai attualmente utilizzando per generare quanto sopra. –

+0

yep ha appena aggiunto il codice – mdogg

+2

Mentre io non so nulla di nltk, in una strana coincidenza, questa settimana l'annuale NFL Scouting Combine si terrà a Indianapolis, in cui "combine" è usato come sostantivo. – DSM

risposta

10

Quello che state vedendo è un problema molto comune nell'elaborazione tradizionale del linguaggio naturale statistico (NLP). In breve, i dati su cui stai usando il tagger non sembrano i dati su cui è stato addestrato. NLTK non documenta i dettagli, ma per quanto ne so il tagger predefinito viene addestrato su articoli del Wall Street Journal, il Corpus Brown, o una combinazione dei due. Questi corpora contengono pochissimi imperativi, quindi quando dai dati con gli imperativi non fa la cosa giusta.

Una buona soluzione a lungo termine sarebbe quella di correggere i tag per un grande corpus di ricette e addestrare sui dati corretti, in questo modo si risolve il problema di disallineamento tra i dati di addestramento e di test. Questa è, comunque, una grande quantità di lavoro. Idealmente, un corpus con molti imperativi esisterebbe già; il mio gruppo di ricerca ha esaminato questo aspetto e non ne abbiamo trovato uno adatto, anche se siamo in procinto di produrne uno.

Una soluzione molto più semplice che ho utilizzato in un progetto recente che richiedeva che gli imperativi fossero capiti correttamente è semplicemente notare quali sono gli imperativi che si desidera e forzare i tag affinché tali parole siano corrette.

Quindi nell'esempio seguente, ho creato un dizionario che diceva che "combinare" doveva essere trattato come un verbo, e quindi usare una comprensione di lista per cambiare i tag.

tagged_words = [('combine', 'NN'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('flour', 'VBD')] 
force_tags = {'combine': 'VB'} 
new_tagged_words = [(word, force_tags.get(word, tag)) for word, tag in tagged_words] 

Il contenuto di new_tagged_words ora ha le etichette originali, tranne cambiato ovunque ci fosse una voce in force_tags.

>>> new_tagged_words 
[('combine', 'VB'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('flour', 'VBD')] 

Questa soluzione richiede di dire quali sono le parole che si desidera forzare ai verbi. Questo è tutt'altro che ideale, ma non esiste una soluzione generale migliore.

+0

Capisco. Questo significa che il POS è semplicemente una stringa di corrispondenza? O lo sto semplificando eccessivamente? – mdogg

+1

Taggers generalmente prende in considerazione almeno due tipi di informazioni: le informazioni posizionali tra i tag (ad esempio, i sostantivi seguono determinanti come 'the') e le informazioni sui possibili tag che ciascuna parola può assumere (ovvero, quanto spesso 'steer' è un verbo o sostantivo). In questo caso, sono soprattutto le informazioni posizionali a rappresentare il problema, perché nei dati di allenamento le frasi quasi mai iniziano con i verbi. – Constantine

+0

Per informazioni, ho lo stesso problema quando analizzo testi tedeschi con MatePosTagger. –

1

Il "combinare" nella mappa del nome può essere dovuto al fatto che si pensa che sia un nome. Una mietitrebbiatrice ad esempio. La mia ipotesi è che dovresti accordare l'algoritmo del sostantivo per il tuo caso d'uso o cambiare/modificare la parola corpus.

+0

come si fa a farlo? Sono un noob completo quando si tratta di NLTK – mdogg

+0

Ci sono due grandi libri di python nltk che ho entrambi. Se questa sarà una cosa importante per averli lol. Altrimenti aumenta la tua taglia e potrei fare un esempio per te. –

+0

Inoltre, per favore, vota la mia risposta se pensi che sia giusto. –

3

La formazione sui corpora imperiali sarebbe l'opzione migliore. Ma se non hai il tempo o non pensi che lo sforzo valga la pena, ecco una soluzione semplice (più di un trucco): basta mettere un pronome come "loro" prima di ogni frase (che sei sicuro sia imperativo). Ora nltk fa un buon lavoro con il tagger predefinito.

0
>>> from nltk import pos_tag, word_tokenize 
>>> def imperative_pos_tag(sent): 
...  return pos_tag(['He']+sent)[1:] 
... 
>>> sent1 = 'combine 1 1/2 cups floud, 3/4 cup sugar, salt and baking powder' 

>>> imperative_pos_tag(word_tokenize(sent1)) 
[('combine', 'VBD'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('floud', 'VBD'), (',', ','), ('3/4', 'CD'), ('cup', 'NN'), ('sugar', 'NN'), (',', ','), ('salt', 'NN'), ('and', 'CC'), ('baking', 'VBG'), ('powder', 'NN')] 

Inoltre, dare un'occhiata a Python NLTK pos_tag not returning the correct part-of-speech tag e NLTK identifies verb as Noun in Imperatives

1

provare il Stanford POS tagger.

Ho avuto più fortuna con esso. È stato addestrato con frasi più imperative rispetto al tagger NLTK predefinito.

Anche in versione docker cuzzo/stanford-pos-tagger.

ad es.

Follow us on Instagram 
VB PRP IN NN 
+0

Come si sostituisce il tagger NLTK per quello Stanford? –

Problemi correlati