2015-09-23 41 views
8

Recentemente mi sono avvicinato alla PNL e ho provato a utilizzare NLTK e TextBlob per analizzare i testi. Mi piacerebbe sviluppare un'app che analizzi le recensioni fatte dai viaggiatori e quindi devo gestire un sacco di testi scritti in diverse lingue. Devo fare due operazioni principali: POS Tagging e lemmatization. Ho visto che in NLTK v'è la possibilità di scelta della lingua giusta per frasi tokenizzazione come questo:NLTK multilingue per tagging POS e Lemmatizer

tokenizer = nltk.data.load('tokenizers/punkt/PY3/italian.pickle') 

non ho trovato il modo giusto per impostare la lingua per il POS Tagging e Lemmatizer in diverse lingue ancora. Come posso impostare il corpora/dizionario corretto per testi non inglesi come italiano, francese, spagnolo o tedesco? Vedo anche che c'è la possibilità di importare i moduli "TreeBank" o "WordNet", ma non capisco come posso usarli. Altrimenti, dove posso trovare le rispettive società?

Potete darmi qualche suggerimento o riferimento? Per favore, fai attenzione che io non sia un esperto di NLTK.

Molte grazie.

risposta

3

Non è possibile passare alle funzioni di codifica e di lemmatizzazione di NLTK che consentiranno loro di elaborare altre lingue.

Una soluzione potrebbe essere quella di ottenere un corpus di formazione per ogni lingua e di addestrare i propri tagger POS con NLTK, quindi individuare una soluzione di lemmatizzazione, forse basata su dictonary, per ciascuna lingua.

Questo potrebbe essere eccessivo, in quanto esiste già una soluzione unica per entrambe le attività in italiano, francese, spagnolo e tedesco (e molte altre lingue): TreeTagger. Non è allo stato dell'arte quanto i taggatori e i lemmatizzatori POS in inglese, ma fa comunque un buon lavoro.

Quello che vuoi è installare TreeTagger sul tuo sistema ed essere in grado di chiamarlo da Python. Ecco un GitHub repo by miotto che ti permette di fare proprio questo.

Il seguente frammento mostra come verificare di aver impostato tutto correttamente. Come potete vedere, sono in grado di effettuare il tag-POS e il lemmatize in una chiamata di funzione, e posso farlo altrettanto facilmente in inglese e in francese.

>>> import os 
>>> os.environ['TREETAGGER'] = "/opt/treetagger/cmd" # Or wherever you installed TreeTagger 
>>> from treetagger import TreeTagger 
>>> tt_en = TreeTagger(encoding='utf-8', language='english') 
>>> tt_en.tag('Does this thing even work?') 
[[u'Does', u'VBZ', u'do'], [u'this', u'DT', u'this'], [u'thing', u'NN', u'thing'], [u'even', u'RB', u'even'], [u'work', u'VB', u'work'], [u'?', u'SENT', u'?']] 
>>> tt_fr = TreeTagger(encoding='utf-8', language='french') 
>>> tt_fr.tag(u'Mon Dieu, faites que ça marche!') 
[[u'Mon', u'DET:POS', u'mon'], [u'Dieu', u'NOM', u'Dieu'], [u',', u'PUN', u','], [u'faites', u'VER:pres', u'faire'], [u'que', u'KON', u'que'], [u'\xe7a', u'PRO:DEM', u'cela'], [u'marche', u'NOM', u'marche'], [u'!', u'SENT', u'!']] 

Dal momento che questa domanda viene chiesto molto (e dal momento che il processo di installazione non è super straight-forward, IMO), scriverò un post sull'argomento e aggiornare questa risposta con un link ad esso il più presto come è fatto.

EDIT: Here is the above-mentioned blog post.

4

Se siete alla ricerca di un altro tagger POS multilingue, si potrebbe desiderare di provare RDRPOSTagger: un robusto, toolkit di facile utilizzo e indipendente dal linguaggio per POS e tagging morfologica. Visualizza i risultati sperimentali inclusa la velocità delle prestazioni e l'accuratezza della codifica in 13 lingue in this paper. RDRPOSTagger ora supporta modelli POS e morfologici di etichettatura pre-formati per bulgaro, ceco, olandese, inglese, francese, tedesco, hindi, italiano, portoghese, spagnolo, svedese, thailandese e vietnamita. RDRPOSTagger supporta anche i modelli di codifica POS Universal pre-formati per 40 lingue.

In Python, è possibile utilizzare i modelli pre-addestrato per la codifica di un grezzo corpus di testi senza etichetta come:

python RDRPOSTagger.py tag PATH-TO-PRETRAINED-MODEL PATH-TO-LEXICON PATH-TO-RAW-TEXT-CORPUS

Esempio: python RDRPOSTagger.py tag ../Models/POS/German.RDR ../Models/POS/German.DICT ../data/GermanRawTest

Se si desidera programmare con RDRPOSTagger, si prega di seguire le righe di codice 92-98 nel modulo RDRPOSTagger.py nel pacchetto pSCRDRTagger. Ecco un esempio:

r = RDRPOSTagger() 
r.constructSCRDRtreeFromRDRfile("../Models/POS/German.RDR") #Load POS tagging model for German 
DICT = readDictionary("../Models/POS/German.DICT") #Load a German lexicon 
r.tagRawSentence(DICT, "Die Reaktion des deutschen Außenministers zeige , daß dieser die außerordentlich wichtige Rolle Irans in der islamischen Welt erkenne .") 

r = RDRPOSTagger() 
r.constructSCRDRtreeFromRDRfile("../Models/POS/French.RDR") # Load POS tagging model for French 
DICT = readDictionary("../Models/POS/French.DICT") # Load a French lexicon 
r.tagRawSentence(DICT, "Cette annonce a fait l' effet d' une véritable bombe . ") 
+0

Stavo provando questo tagger per thai ma non sembra funzionare. Mi dà un'intera lunga stringa come NCNM. Deve invece contenere una serie di token? – aceminer

+0

Sì, è necessario eseguire la segmentazione delle parole in tailandese prima di utilizzare il tagger. – NQD