2015-12-05 11 views
10

Próbuję zrobić tagowanie POS za pomocą modułu spaCy w Pythonie.POS tagging using spaCy

Oto mój kod dla tego samego

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) 

wyjściowa:

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

Tu zwraca chrupiące jako rzeczownika zamiast przymiotnika. Jednak jeśli użyję zdania testowego, takiego jak

a="we had crispy fries" 

Uznaje, że chrupiący jest przymiotnikiem. Oto wynik:

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

Myślę, że głównym powodem, chrupiące nie został oznaczony jako przymiotnik w pierwszym przypadku było to, dosa zostało oznaczone jako „NN”, podczas gdy frytki został oznaczony jako „NNS” w sekundę walizka.

Czy jest jakikolwiek sposób, abym stał się chrupiący, aby został oznaczony jako przymiotnik również w drugim przypadku?

Odpowiedz

20

TL;DR: You should accept the occasional error.

Szczegóły:

tagger Spacy jest statystyczny, co oznacza, że ​​tagi dostać to jego najlepszy szacunek na podstawie danych, które zostało pokazane podczas treningu. Zgaduję, że te dane nie zawierają słowa dosa. Tagger musiał zgadywać i pomylił się. Nie ma prostego sposobu na poprawienie wyników, ponieważ nie używa reguł ani niczego, co można łatwo zmodyfikować. Model został przeszkolony na standardowym korpusie języka angielskiego, który może być zupełnie inny niż język, w którym go używasz (domena). Jeśli wskaźnik błędów jest zbyt wysoki dla twoich celów, możesz ponownie przeszkolić model, używając danych specyficznych dla domeny. Będzie to jednak bardzo pracochłonne. Zadaj sobie pytanie, co próbujesz osiągnąć i czy 3% błędów w tagowaniu PoS jest najgorszym z twoich problemów.

Ogólnie rzecz biorąc, nie należy oceniać wydajności systemu statystycznego w każdym indywidualnym przypadku. Dokładność nowoczesnych znaczników angielskich PoS to around 97%, czyli mniej więcej tyle samo, co przeciętny człowiek. Z pewnością pojawią się błędy. Jednak błędy modelu nie będą takie same jak błędy ludzkie, ponieważ obaj "nauczyli się", jak rozwiązać problem w inny sposób. Czasami model staje się zdezorientowany przez rzeczy, które Ty i ja uważamy za oczywiste, np. twój przykład. Nie oznacza to, że ogólnie jest źle lub że tagowanie PoS jest Twoim prawdziwym problemem.

+0

+1, żaden model nie jest idealny: patrz również http://stackoverflow.com/questions/30821188/python-nltk-pos-tag-not-returning-trect-correct-part-of-speech-tag – alvas

+0

Czy istnieje sposób, w jaki mogę używać korpusu z tagger'a StanfordPOS do uruchamiania spaCy? – pd176

+1

Nie sądzę, byś zyskał wiele, robiąc to. Modele IIRC Stanforda zostały przećwiczone w Penn Tree Bank, który można pobrać i wykorzystać do szkolenia spacy. Nie mogę znaleźć żadnych informacji na temat tego, w jaki sposób trenujący spacy jest przeszkolony, ale nie byłbym zaskoczony, gdyby to było to samo. – mbatchkarov