2016-11-05 4 views
1

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

A = "Hello how are you? The weather is fine. I'd like to go for a walk.".split() 
B = "bank, weather, sun, moon, fun, hi".split(",") 

Слово в списке A составляет мое слово векторного базиса. Как вычислить оценки подобия косинуса каждого слова в B?

Что я сделал до сих пор: я могу вычислить косинус сходство двух целых списков с помощью следующей функции:

def counter_cosine_similarity(c1, c2): 
    terms = set(c1).union(c2) 
    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) 

Но как я должен интегрировать свой векторный базис, и как я могу вычислить то сходства между членами в B?

+3

Что такое 'T' ...? – trincot

+0

Вы даже делали какие-либо исследования по этому вопросу? – TuanDT

+0

Самый быстрый способ для вас - опубликовать код, который вы написали до сих пор, и запросить дополнительный ввод. – Ukimiku

ответ

1
import math 
from collections import Counter 

ListA = "Hello how are you? The weather is fine. I'd like to go for a walk.".split() 
ListB = "bank, weather, sun, moon, fun, hi".split(",") 

def cosdis(v1, v2): 
    common = v1[1].intersection(v2[1]) 
    return sum(v1[0][ch] * v2[0][ch] for ch in common)/v1[2]/v2[2] 

def word2vec(word): 
    cw = Counter(word) 
    sw = set(cw) 
    lw = math.sqrt(sum(c * c for c in cw.values())) 
    return cw, sw, lw 

def removePunctuations(str_input): 
    ret = [] 
    punctuations = '''!()-[]{};:'"\,<>./[email protected]#$%^&*_~''' 
    for char in str_input: 
     if char not in punctuations: 
      ret.append(char) 

    return "".join(ret) 


for i in ListA: 
    for j in ListB: 
     print(cosdis(word2vec(removePunctuations(i)), word2vec(removePunctuations(j)))) 
+0

Да, это все! :) Последний вопрос: чтобы получить лучший обзор, можно ли сохранить сходство в (numpy) матрице? – JohnD

+0

Большое спасибо! :) – JohnD

Смежные вопросы