Python 同义词的余弦相似性 我有些词是同义词,我想和原文相似。例如,在本例中,单词餐厅和酒吧被视为同义词
为了在这种情况下应用余弦相似性,我决定在两个向量中保留相同的单词,但如果一个单词被视为同义词,那么我会在计数器中减去一个“惩罚”。在这个场景中,我必须将原来的v1=['cafe']与v2=['restaurant']进行比较。那么我有以下几点:Python 同义词的余弦相似性 我有些词是同义词,我想和原文相似。例如,在本例中,单词餐厅和酒吧被视为同义词,python,machine-learning,nlp,cosine-similarity,Python,Machine Learning,Nlp,Cosine Similarity,为了在这种情况下应用余弦相似性,我决定在两个向量中保留相同的单词,但如果一个单词被视为同义词,那么我会在计数器中减去一个“惩罚”。在这个场景中,我必须将原来的v1=['cafe']与v2=['restaurant']进行比较。那么我有以下几点: v1=Counter({'cafe': 1}) v2=Counter({'cafe': 0.65}) #0.65 because word restaurant is synonym 然而,如果我应用这个策略,我最终得到的相似性为1.0(0.65/0.
v1=Counter({'cafe': 1})
v2=Counter({'cafe': 0.65}) #0.65 because word restaurant is synonym
然而,如果我应用这个策略,我最终得到的相似性为1.0(0.65/0.65)。我需要得到低于1.0的相似度,因为餐厅不是同一个词,而是同义词
我通过以下方式实现了余弦相似性:
from collections import Counter
def get_cosine(vec1, vec2):
intersection = set(vec1.keys()) & set(vec2.keys())
numerator = sum([vec1[x] * vec2[x] for x in intersection])
sum1 = sum([vec1[x] ** 2 for x in list(vec1.keys())])
sum2 = sum([vec2[x] ** 2 for x in list(vec2.keys())])
denominator = math.sqrt(sum1) * math.sqrt(sum2)
if not denominator:
return 0.0
else:
return float(numerator) / denominator
v1=Counter({'cafe': 1})
v2=Counter({'cafe': 0.65})
print(get_cosine(v1, v2))
如何在同义词中获得相似性?同时控制哪些单词被视为同义词。目前,我正在从数据库中获取这些同义词。您无法计算余弦相似性,例如,使用相似性比率(0.65,1),我们计算两个单词之间的余弦相似性,以获得以下比率(即0.65),这是通过计算常用字符作为初始步骤来完成的,因此将此比率视为概率在数学上更加方便,如果您需要概率的平滑版本,然后你可以使用负熵这样的函数,使用(或模型)一些扩展值函数可能更准确。你不能计算余弦相似性,使用相似比(0.65,1),例如,我们计算两个单词之间的余弦相似度以获得以下比率(即0.65),并且它是通过计算公共字符来完成的,因此将此比率作为概率来处理在数学上更方便,如果你需要概率的平滑版本,那么你可以使用负熵函数,使用(或模型)一些扩展值函数可能更准确。