2015-12-05 11 views
10

Sto provando a fare tagging POS utilizzando il modulo spaCy in Python.Tag POS con spaCy

Ecco il mio codice per lo stesso

from spacy.en import English, LOCAL_DATA_DIR 
import spacy.en 
import os 

data_dir = os.environ.get('SPACY_DATA', LOCAL_DATA_DIR) 
nlp = English(parser=False, tagger=True, entity=False) 


def print_fine_pos(token): 
    return (token.tag_) 

def pos_tags(sentence): 
    sentence = unicode(sentence, "utf-8") 
    tokens = nlp(sentence) 
    tags = [] 
    for tok in tokens: 
     tags.append((tok,print_fine_pos(tok))) 
    return tags 

a = "we had crispy dosa" 
print pos_tags(a) 

uscita:

[(We , u'PRP'), (had , u'VBD'), (crispy , u'NN'), (dosa, u'NN')] 

Qui restituisce croccante come un sostantivo, invece di un aggettivo. Tuttavia, se uso una frase di prova come

a="we had crispy fries" 

Riconosce che croccante è un aggettivo. Ecco l'output:

[(we , u'PRP'), (had , u'VBD'), (crispy , u'JJ'), (fries, u'NNS')] 

Penso che il motivo principale per cui non è stato croccanti etichettato come aggettivo nel primo caso è stato perché dosa è stato etichettato come 'NN', mentre patatine fritte è stato taggato come 'NNS' nel secondo Astuccio.

C'è un modo in cui posso essere definito croccante come aggettivo anche nel secondo caso?

risposta

20

TL;DR: You should accept the occasional error.

Dettagli:

tagger di Spacy è statistica, il che significa che i tag si ottiene sono il suo migliore stima sulla base dei dati è stato mostrato durante l'allenamento. Immagino che quei dati non contengano la parola dosa. Il tagger doveva indovinare e indovinato. Non c'è un modo semplice per correggere il suo output, perché non sta usando regole o qualcosa che puoi modificare facilmente. Il modello è stato addestrato su un corpus standard di inglese, che potrebbe essere molto diverso dal tipo di lingua che lo sta usando per (dominio). Se il tasso di errore è troppo alto per i tuoi scopi, puoi ri-addestrare il modello usando dati specifici del dominio. Questo sarà molto laborioso però. Chiediti cosa stai cercando di ottenere e se il tasso di errore del 3% nel tagging PoS è il peggiore dei tuoi problemi.

In generale, non è necessario giudicare le prestazioni di un sistema statistico caso per caso. L'accuratezza dei moderni tagger PoS inglesi è around 97%, che è all'incirca uguale alla media umana. Avrai inevitabilmente degli errori. Tuttavia, gli errori del modello non saranno gli stessi degli errori umani, in quanto i due hanno "imparato" come risolvere il problema in un modo diverso. A volte il modello viene confuso da cose che tu e io consideriamo ovvi, ad es. il tuo esempio. Ciò non significa che sia complessivamente negativo, o che il tagging PoS sia il tuo vero problema.

+0

+1, nessun modello è perfetto: vedere anche http://stackoverflow.com/questions/30821188/python-nltk-pos-tag-not-returning-the-correct-part-of-speech-tag – alvas

+0

Tuttavia , c'è un modo per utilizzare il corpus del tagger StanfordPOS per eseguire spaCy? – pd176

+1

Non penso che guadagneresti molto facendo così. I modelli pre-costruiti di IIRC Stanford sono stati addestrati sulla Penn Tree Bank, che è possibile scaricare e utilizzare per addestrare spacy. Non riesco a trovare alcuna informazione su cosa sia addestrato il tagger di spacy, ma non sarei sorpreso se fosse lo stesso. – mbatchkarov

Problemi correlati