同形异义词是一个拼写与另一个单词相同的单词,但是具有不同的声音和不同的含义,例如, lead (位于最前面) / 铅 (一种金属)。
我试图通过使用零散的单词向量将每个文档的每个单词向量求和,然后最终找到余弦相似度,从而相互比较文档。例如,如果spacy向量对于上面列出的两个'lead'具有相同的向量,则结果可能不好。
在下面的代码中,为什么两个'bank'之间的相似性 令牌显示为 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)
给定程序的输出是
令牌1 =银行令牌2 =银行
1.0
答案 0 :(得分:2)
正如kntgu指出的那样,spaCy通过标记的字符而不是语义来区分标记。 spaCy开发人员的sense2vec方法将令牌与POS标签连接在一起,在'lead_VERB'与'lead_NOUN'的情况下可以提供帮助。但是,这对于您的“银行(河岸)”与“银行(金融机构)”的示例无济于事,因为两者都是名词。
SpaCy不支持任何开箱即用的解决方案,但是您可以查看上下文化的单词表示形式,例如ELMo或BERT。两者都会考虑上下文,为给定的句子生成单词向量。因此,我假设两个“ bank”令牌的向量都将大不相同。 两种方法都是相对较新的方法,使用起来不太舒适,但可能会对您的用例有所帮助。对于ELMo,有一个命令行工具可让您为一组句子生成单词嵌入,而无需编写任何代码:https://github.com/allenai/allennlp/blob/master/tutorials/how_to/elmo.md#writing-contextual-representations-to-disk