是否有任何解决方案来获得单词列表之间的相似性得分?

问题描述 投票:0回答:1

我想计算单词列表之间的相似度,例如:

import math,re
from collections import Counter

test = ['address','ip']
list_a = ['identifiant', 'ip', 'address', 'fixe', 'horadatee', 'cookie', 'mac', 'machine', 'network', 'cable']
list_b = ['address','city']

def counter_cosine_similarity(c1, c2):
    terms = set(c1).union(c2)
    print(c2.get('ip',0)**2)
    dotprod = sum(c1.get(k, 0) * c2.get(k, 0) for k in terms)
    magA = math.sqrt(sum(c1.get(k, 0)**2 for k in terms))
    magB = math.sqrt(sum(c2.get(k, 0)**2 for k in terms))
    return dotprod / (magA * magB)

counter1 = Counter(test)
counter2 = Counter(list_a)
counter3 = Counter(list_b)
score = counter_cosine_similarity(counter1,counter2)
print(score) # output : 0.4472135954999579
score = counter_cosine_similarity(counter1,counter3)
print(score) # output : 0.4999999999999999

对我而言,这不是我想得到的分数,分数必须相反,因为list_a包含地址和ip所以它是100%的测试匹配我知道余弦相似性在这种情况下与test和list_a进行比较所以因为有list_a上的一些元素没有在测试中,因为分数很低,所以我会做的就是将这个测试与list_a进行比较,而不是以两种方式进行比较。

期望的输出

score = counter_cosine_similarity(counter1,counter2)
print(score) # output : score higher than list_b = 1.0 may be
score = counter_cosine_similarity(counter1,counter3)
print(score) # output : score less the list_a = 0.5 may be
python numpy math similarity cosine-similarity
1个回答
1
投票

如果您想要更高的值,则更多的术语相同,请使用以下代码:

 score = len(set(test).intersection(set(list_x)))

这将告诉你两个列表有多少常用术语。如果你想重复得分更高,那就试试吧

 commonTerms = set(test).intersection(set(list_x))
 counter = Counter(list_x)
 score = sum((counter.get(term) for term in commonTerms)) #edited

如果您需要将分数缩放到[0..1],我需要了解有关您的数据集的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.