Косинусное сходство с синонимами - PullRequest
1 голос
/ 10 июля 2020

У меня есть несколько слов, которые являются синонимами, которые я хотел бы считать похожими на исходное слово. Например, слова restaurant и bar считаются синонимами в этом примере.

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

Как мне получить сходство в синонимах? при сохранении контроля над тем, какие слова считаются синонимами. В настоящее время я получаю эти синонимы из базы данных.

1 Ответ

0 голосов
/ 10 июля 2020

Вы не можете вычислить косинусное сходство , используя коэффициент подобия (0,65, 1), мы вычисляем косинусное сходство между двумя словами, чтобы получить следующее соотношение (т.е. 0,65 ), например, и это делается путем подсчета общих символов в качестве начального шага, поэтому будет более математически удобно для обработки этого соотношение как вероятность , и в случае, если вам нужна гладкая версия вероятности, вы можете использовать такую ​​функцию, как отрицательная энтропия , это может быть более точным использовать (или модель ) некоторую функцию расширенного значения.

...