У меня есть несколько слов, которые являются синонимами, которые я хотел бы считать похожими на исходное слово. Например, слова 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))
Как мне получить сходство в синонимах? при сохранении контроля над тем, какие слова считаются синонимами. В настоящее время я получаю эти синонимы из базы данных.