Есть ли решение, чтобы получить оценку сходства между списками слов? - PullRequest
0 голосов
/ 28 марта 2019

Я хочу вычислить сходство между списками слов, например:

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 есть какой-то элемент, который не находится в тесте, это связано с тем, что оценка является низкой, поэтому я сделаю именно то, что сравнивается с этим тестом по сравнению со списком lista в одном, а не в двух отношениях.

Желаемый выход

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

1 Ответ

1 голос
/ 28 марта 2019

Если вы хотите получить большее значение, тем больше терминов совпадают, используйте этот код:

 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], мне нужно больше узнать о ваших наборах данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...