Простая лемма отличается от результатов класса «английский» и en_core_web_sm - PullRequest
0 голосов
/ 07 июня 2019

Мне интересно, почему я получаю разные результаты лемматизации от этих двух языковых моделей: spacy.lang.en.English и en_core_web_sm.

В соответствии с документацией, при загрузке модели en_core_web_sm это должно сказать spacy использоватьязык "en" и инициализация spacy.lang.en.English, поэтому я не понимаю, почему меняются правила лемматизации.Как я могу получить леммы от английской модели, но тег и POS от en_core_web_sm?

from spacy.lang.en import English
nlp = English()
doc = nlp('nonlinearities')
print('English nlp: ', [(token.lemma_, token.lemma, token.tag_, token.pos_) for token in doc])

nlp = spacy.load('en_core_web_sm', disable = ['ner'])
doc = nlp('nonlinearities')
print('loaded model nlp: ', [(token.lemma_, token.lemma, token.tag_, token.pos_) for token in doc])

Вот вывод:

English nlp:  [('nonlinearity', 3011504801575762058, '', '')]
loaded model nlp:  [('nonlinearitie', 2964900603636025371, 'NNS', 'NOUN')]

1 Ответ

0 голосов
/ 07 июня 2019

Как вы правильно заметили, spacy.lang.en.English и en_core_web_sm - две разные модели. Эти две модели могут помечать слова по-разному А поскольку лемма слова также зависит от его POS-тега, две модели могут возвращать разные лемматизации.

Использовать лемму из English и POS из en_core_web_sm

nlp = English()
sentence = 'nonlinearities is none'
doc1 = nlp(sentence)
print('English nlp: ', [(token.lemma_, token.lemma, token.tag_, token.pos_) for token in doc1])

nlp = spacy.load('en_core_web_sm', disable = ['ner'])
doc2 = nlp(sentence)
print('loaded model nlp: ', [(token.lemma_, token.lemma, token.tag_, token.pos_) for token in doc2])

print('Mixed nlp: ', [(doc1[i].lemma_, doc1[i].lemma, token.tag_, token.pos_) for i, token in enumerate(doc2)])
doc2 = nlp('nonlinearities is none')
print('loaded model nlp: ', [(token.lemma_, token.lemma, token.tag_, token.pos_) for token in doc2])

print('Mixed nlp: ', [(doc1[i].lemma_, doc1[i].lemma, token.tag_, token.pos_) for i, token in enumerate(doc2)])
...