为什么 spacy 无法在以下代码中区分两个同形异义词标记?



同形词是一个与另一个单词拼写相同但有不同声音和不同含义的单词,例如lead(在前面(/(金属(。

我试图使用spacy单词向量来比较文档,方法是对每个文档的每个单词向量求和,最后找到余弦相似度。例如,如果上面列出的两个'lead'的spacy向量具有相同的向量,则结果可能会很糟糕。

在下面的代码中,为什么两个"银行">代币之间的相似性显示为1.00

import spacy
nlp = spacy.load('en')
str1 = 'The guy went inside the bank to take out some money'
str2 = 'The house by the river bank.'
str1_tokenized = nlp(str1.decode('utf8'))
str2_tokenized = nlp(str2.decode('utf8'))
token1 = str1_tokenized[-6]
token2 = str2_tokenized[-2]
print 'token1 =  {}  token2 = {}'.format(token1,token2)
print token1.similarity(token2)

给定程序的输出为

token1=银行token2=银行

1.0

正如kntgu已经指出的,spaCy通过标记的字符而不是语义来区分标记。spaCy开发人员的sense2vec方法将代币与其POS标签连接起来,并在"lead_VERB"与"lead_NOUN"的情况下提供帮助。然而,这对你举的"银行(河岸("与"银行(金融机构("的例子没有帮助,因为两者都是名词。

SpaCy不支持任何开箱即用的解决方案,但您可以看看ELMo或BERT等上下文化的单词表示。两者都会为给定的句子生成单词向量,并将上下文考虑在内。因此,我认为两种"银行"代币的矢量将有很大不同。这两种方法都是相对较新的方法,使用起来不太舒服,但在您的用例中可能会有所帮助。对于ELMo,有一个命令行工具,可以让您为一组句子生成单词嵌入,而无需编写任何代码:https://github.com/allenai/allennlp/blob/master/tutorials/how_to/elmo.md#writing-上下文表示到磁盘

最新更新