2015-12-05 17 views
10

Ich versuche POS-Tagging mit dem SpaCy-Modul in Python zu machen.POS-Tagging mit spaCy

Hier ist mein Code für die gleiche

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) 

Ausgang:

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

Hier gibt es knusprige als Substantiv anstelle eines Adjektivs. Allerdings, wenn ich einen Testsatz wie

a="we had crispy fries" 

verwenden Es erkennt, dass knusprig ist ein Adjektiv. Hier ist die Ausgabe:

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

Ich denke, der Hauptgrund, warum knusprig nicht als Adjektiv im ersten Fall markiert wurde, weil Dosa markiert wurde als ‚NN‘ während Pommes wurde markiert als ‚NNS‘ in der zweiten Fall.

Gibt es eine Möglichkeit, knusprig zu werden, um auch im zweiten Fall als Adjektiv markiert zu werden?

Antwort

20

TL;DR: You should accept the occasional error.

Details:

Tagger Spacy der ist statistisch, was bedeutet, dass die Tags Sie sind die beste Schätzung basierend auf den Daten erhalten sie während des Trainings gezeigt wurde. Ich würde vermuten, dass diese Daten das Wort dosa nicht enthalten. Der Tagger musste raten und falsch geraten haben. Es gibt keine einfache Möglichkeit, die Ausgabe zu korrigieren, da es keine Regeln oder etwas verwendet, das Sie einfach ändern können. Das Modell wurde auf einem Standardkorpus von Englisch trainiert, das sich ziemlich von der Art der Sprache unterscheiden kann, für die Sie es verwenden (Domäne). Wenn die Fehlerrate für Ihre Zwecke zu hoch ist, können Sie das Modell mit domänenspezifischen Daten neu trainieren. Dies wird jedoch sehr mühsam sein. Fragen Sie sich, was Sie erreichen möchten und ob eine Fehlerquote von 3% beim PoS-Tagging das schlimmste Ihrer Probleme ist.

Im Allgemeinen sollten Sie die Leistung eines statistischen Systems nicht von Fall zu Fall beurteilen. Die Genauigkeit von modernen englischen PoS-Taggern ist around 97%, was in etwa dem menschlichen Durchschnitt entspricht. Sie werden unweigerlich einige Fehler bekommen. Die Fehler des Modells werden jedoch nicht mit den menschlichen Fehlern übereinstimmen, da die beiden "gelernt" haben, wie das Problem auf andere Weise gelöst werden kann. Manchmal wird das Modell durch Dinge verwirrt, die Sie und ich für offensichtlich halten, z. Ihr Beispiel. Dies bedeutet nicht, dass es insgesamt schlecht ist, oder dass PoS-Tagging Ihr wirkliches Problem ist.

+0

+1, kein Modell ist perfekt: siehe auch http://stackoverflow.com/questions/30821188/python-nltk-pos-tag-not-returning-the-correc-part-of-speech-tag – alvas

+0

Allerdings Kann ich den Corpus von StanfordPOS tagger zum Laufen von spaCy benutzen? – pd176

+1

Ich glaube nicht, dass du dadurch viel gewinnen würdest. IIRC Stanfords vorgefertigte Modelle wurden auf der Penn Tree Bank trainiert, die du herunterladen und zum Training von Spacy verwenden kannst. Ich kann keine Informationen darüber finden, auf welchem ​​Spacys Tagger trainiert wird, aber ich wäre nicht überrascht, wenn es dasselbe wäre. – mbatchkarov