Python 同义词的余弦相似性 我有些词是同义词,我想和原文相似。例如,在本例中,单词餐厅和酒吧被视为同义词

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=['cafe']与v2=['restaurant']进行比较。那么我有以下几点:

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),并且它是通过计算公共字符来完成的,因此将此比率作为概率来处理在数学上更方便,如果你需要概率的平滑版本,那么你可以使用负熵函数,使用(或模型)一些扩展值函数可能更准确。