2010-12-17 16 views
5

Attualmente sto cercando di costruire un tagger POS generico (o generale come pratico) con NLTK. Mi sono dilettato con i corpora marrone e treebank per l'allenamento, ma probabilmente mi accontenterò del corpus treebank.Tentativo di utilizzare MEGAM come classificatoreBasedPOSTagger NLTK?

Imparando mentre vado, sto trovando il classificatore che i tagger POS sono i più precisi. Il classificatore Entità massima è pensato per essere il più preciso, ma trovo che usi tanta memoria (e tempo di elaborazione) che devo ridurre in modo significativo il set di dati di addestramento, quindi il risultato finale è meno accurato rispetto all'utilizzo del classificatore di Naive Bayes predefinito.

È stato suggerito di utilizzare il MEGAM. NLTK ha qualche supporto per MEGAM, ma tutti gli esempi che ho trovato sono per classificatori generali (ad esempio un classificatore di testo che utilizza un vettore di funzioni di parole), piuttosto che un tagger POS più specifico. Senza dover ricreare il mio estrattore e compilatore di feature POS (ad esempio, preferisco usare quello già in NLTK), come posso usare il classificatore MEGAM MaxEnt? Vale a dire. come posso farlo cadere in un codice MaxEnt esistente che è lungo le linee di:

maxent_tagger = ClassifierBasedPOSTagger(train=training_sentences, 
             classifier_builder=MaxentClassifier.train) 
+3

Hai letto: http://streamhacker.com/2008/11/03/part-of-speech-tagging-with-nltk-part-1/? È una buona idea per i tagger POS in generale, se guardi tutti e quattro gli articoli. – perimosocordiae

+1

Sì, ho il suo libro. Il blog ha alcuni interessanti confronti di efficienza, e potrei ancora aggiungere un tagger di Brill alla fine del classificatore (come suggerito); ma i post non sembrano menzionare MEGAM? Forse ho bisogno di guardare il codice MaxEnt NLTK e il reverse engineer o duplicarlo per usare MEGAM. – winwaed

risposta

8

Questo uno di linea dovrebbe funzionare per la formazione di un MEGAM MaxentClassifier per il ClassifierBasedPOSTagger. Naturalmente, che assume MEGAM è già installata (vai here per scaricare)

maxent_tagger = ClassifierBasedPOSTagger(train=train_sents, classifier_builder=lambda train_feats: MaxentClassifier.train(train_feats, algorithm='megam', max_iter=10, min_lldelta=0.1)) 
+3

Controlla anche train_tagger.py in https://github.com/japerk/nltk-trainer. A breve scriverò un articolo introduttivo, ma spero che i messaggi di aiuto siano sufficienti per iniziare. – Jacob

+0

Grazie Jacob - sembra funzionare! (sembra che devo ricordare a me stesso le funzioni di Python Lambda). Sì, avevo installato Megam, il mio problema era ottenere il classificatore (generico) collegato al classificatore di codifica POS. Finora i miei test hanno dato precisioni molto simili a Naive Bayes (circa l'1%). Ci vuole più tempo per costruire il classificatore, ma non tanto quanto l'algoritmo MaxEnt predefinito. Ho stampato train_tagger.py - Ne riparlero durante una pausa caffè :-) – winwaed

+1

Puoi provare ad aumentare max_iter o diminuire min_lldelta per ottenere una maggiore precisione. Questi sono solo i numeri che uso solitamente dai livelli di precisione abbastanza rapidamente. – Jacob

Problemi correlati