2015-11-15 31 views
5

Ho un documento con dati taggati nel formato Hi here's my [KEYWORD phone number], let me know when you wanna hangout: [PHONE 7802708523]. I live in a [PROP_TYPE condo] in [CITY New York]. Voglio formare un modello basato su un set di questi tipi di documenti con tag e quindi utilizzare il mio modello per taggare nuovi documenti. È possibile in NLTK? Ho esaminato gli script chunking e NLTK-Trainer, ma questi hanno un insieme limitato di tag e corpora, mentre il mio set di dati contiene tag personalizzati.Training Tagger con tag personalizzati in NLTK

+0

tag BIO chunk sembra essere giusta direzione, vedi http: //lingpipe-blog.com/2009/10/14/coding-chunkers-as-taggers-io-bio-bmewo-and-bmewo/. Dipende da come codifichi il tuo input, potresti aver bisogno di un classificatore a grana fine per taggare l'identificazione di 'PHONE' o' KEYWORD' dopo il chunking. – alvas

+0

Potresti fornire qualche altro esempio? Sono tutti numeri di telefono? Forse aggiungi [tag: information-extraction]? – reynoldsnlp

+0

No, i dati sono variati, includono numeri di telefono, indirizzi, nomi, date, ecc. Per i tag BIO chunk, ci sono alcuni esempi di codice che posso dare un'occhiata? –

risposta

1

Il problema che si sta cercando di risolvere è chiamato più comunemente, Named Entity Recognition (NER). Esistono molti algoritmi che possono aiutarti a risolvere il problema, ma la nozione più importante è che devi convertire i tuoi dati di testo in un formato adatto per i tagger di sequenza. Ecco un esempio del formato BIO:

I  O 
love O 
Paris B-LOC 
and O 
New B-LOC 
York I-LOC 
.  O 

Da lì, si può scegliere di formare qualsiasi tipo di classificatore, come Naive Bayes, SVM, MaxEnt, CRF, ecc Attualmente l'algoritmo più popolare per i quali Multi -la sequenza di classificazione dei token è CRF. Sono disponibili strumenti che ti consentono di addestrare un modello BIO (sebbene originariamente previsto per il chunking) da un file utilizzando il formato mostrato sopra (ad esempio YamCha, CRF++, CRFSuite, Wapiti). Se si utilizza Python, è possibile esaminare scikit-learn, python-crfsuite e PyStruct oltre a NLTK.

+1

La toolbox NLTK utilizza un formato a tre colonne: 'word tag-tag POS BIO'. Non farà male aggiungere un passaggio di codifica POS alla pipeline di elaborazione. – alexis

4

Come già scritto da @AleksandarSavkov, questo è essenzialmente un task di riconoscimento di entità con nome (NER), o più in generale un compito di chunking, come già sapete. Come farlo è coperto bene in chapter 7 del libro NLTK. Vi consiglio di ignorare le sezioni su tag regexp e utilizzare l'approccio nella sezione 3, Developing and evaluating chunkers. Include esempi di codice che è possibile utilizzare letteralmente per creare un chunker (il ConsecutiveNPChunkTagger). La tua responsabilità è quella di selezionare funzionalità che ti offrano buone prestazioni.

È necessario trasformare i dati nel formato IOB previsto dall'architettura NLTK; si aspetta una parte dei tag vocali, quindi il primo passo dovrebbe essere quello di eseguire l'input attraverso un tagger POS; nltk.pos_tag() eseguirà un lavoro abbastanza decente (una volta rimosso il markup come [KEYWORD ...]) e non sarà necessario installare alcun software aggiuntivo. Quando il corpus è nel seguente formato (word - POS-tag - IOB-tag), si è pronti a formare un sistema di riconoscimento:

Hi NNP O 
here RB O 
's POS O 
my PRP$ O 
phone NN B-KEYWORD 
number NN I-KEYWORD 
, , O 
let VB O 
me PRP O 
... 
+0

Grazie, non sono a conoscenza del passaggio dopo l'esecuzione del mio input tramite il tagger POS. Come inserisco i miei tag personalizzati? Forse ho frainteso quello che intendevi denunciando markup come 'KEYWORD' –

+1

Ho appena visto il tuo commento ... questa risposta arriva quasi tardi come il tuo commento, mi dispiace! Quello che intendevo per "stripping off markup" è che il tagger POS funziona con testo semplice tokenizzato; dovrai rimuovere le etichette del blocco dal tuo corpo, renderizzare token e taggare il testo con NLTK, quindi inserire di nuovo i blocchi (cosa che potresti fare anche nel formato IOB, poiché è ciò che ti servirà alla fine). Se ancora non sai come fare, posso modificare la mia risposta per spiegare di più. – alexis

+0

Grazie, questo aiuta. Quindi l'output finale sarà un elenco di tag di parole "tag POS personalizzati", giusto? –