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
risposta
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.
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
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
...
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' –
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
Grazie, questo aiuta. Quindi l'output finale sarà un elenco di tag di parole "tag POS personalizzati", giusto? –
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
Potresti fornire qualche altro esempio? Sono tutti numeri di telefono? Forse aggiungi [tag: information-extraction]? – reynoldsnlp
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? –