Есть ли какое-либо решение для получения оценки сходства между списками слов?

#python #numpy #math #similarity #cosine-similarity

#python #numpy #математика #сходство #косинусное сходство

Вопрос:

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

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

Комментарии:

1. Где исходный код для Counter ?

2. @Aaron Digulla только что отредактировал, теперь вы можете проверить код

3. Почему вы используете Counter ? Он просто сообщает вам, как часто каждое слово появляется в списке. Итак, в вашем случае это будет 1 для каждого термина. Как это помогает определить «расстояние»?

4. @Aaron Digulla иногда я хочу test = [‘address’,’адрес’] для сравнения со списками_a и list_b поэтому для меня address- это адрес местоположения, поэтому оценка должна быть выше, когда я сравниваю тест со list_b, но что мне нужно сделать в этом cas, чтобы получить правильный результирующий адрес в list_b, чтобы это означало, что частота адреса высока в list_b.

5. Это не вопрос о python или numpy . Вам нужно определить, в математически строгом смысле, что такое «сходство» для вашей текущей цели. Затем вы можете реализовать это на python или любом другом языке программирования.

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