Spacy引理与'English'类和en_core_web_sm的结果不同

时间:2019-06-07 02:03:05

标签: python spacy

我想知道为什么从这两种语言模型(spacy.lang.en.English和en_core_web_sm)中得到不同的词素化结果。

根据文档,在加载en_core_web_sm模型时,这应该告诉spacy使用语言“ en”并初始化spacy.lang.en.English,所以我不明白为什么限制词规则会改变。如何从英语模型中获得引理,但如何从en_core_web_sm中获得标签和POS?

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 :(得分:0)

正如您正确指出的,spacy.lang.en.Englishen_core_web_sm是两个不同的模型。这两个模型可能会在POS中用不同的方式标记单词。而且,由于单词的引理还取决于其POS标签,因此两个模型可能会返回不同的词素化。

要使用English中的引理和en_core_web_sm中的POS

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)])