2017-01-24 16 views
2

Я пытаюсь выполнить итерацию файла, содержащего текст, и вычислить сходство косинусов между текущей строкой и запросом, который пользователь поднял. Я уже обозначил запрос и строку и сохранил объединение своих слов в набор.Правильный способ вычисления косинусной подобия двух словарно-словари в python?

Пример:

line_tokenized = ['Karl', 'Donald', 'Ifwerson'] 

query_tokenized = ['Donald', 'Trump'] 

word_set = ['Karl', 'Donald', 'Ifwerson', 'Trump'] 

Теперь я должен создать словарь каждый для линии и запроса, содержащих пары слов частоты. Я думал о чем-то IKE это:

line_dict = {'Karl': 1, 'Donald': 1, 'Ifwerson': 1, 'Trump': 0} 
query_dict = {'Karl': 0, 'Donald': 1, 'Ifwerson': 0, 'Trump': 1} 

Но косинус сходство не будет вычислен правильно, как пар ключ-значение неупорядоченными. Я наткнулся на OrderedDict(), но я не понимаю, как реализовать некоторые вещи, как это элементы хранятся в виде кортежа:

Так что мои вопросы:

  • Как я могу установить пар ключ-значение и имеют доступ к ним после этого?
  • Как я могу увеличить значение определенного ключа?
  • Или есть ли другой более простой способ сделать это?
+0

Что вы подразумеваете под «ключами-значениями являются неупорядоченными»? Как вы ожидаете, что их закажут? – bluesummers

+0

Я бы хотел, чтобы они оставались в порядке, я добавляю их в словарь. – lvcasco

+0

Я не понимаю, что вы подразумеваете под этим, я не вижу в вашем коде, к которому вы обращаетесь, у меня есть хороший ответ для вас, просто объясните мне заказ – bluesummers

ответ

0

Вам не нужно заказать словарь для Cosine similarity, простой поиск достаточно:

import math 

def cosine_dic(dic1,dic2): 
    numerator = 0 
    dena = 0 
    for key1,val1 in dic1: 
     numerator += val1*dic2.get(key1,0.0) 
     dena += va1*val1 
    denb = 0 
    for val2 in dic2.values(): 
     denb += val2*val2 
    return numerator/math.sqrt(dena*denb) 

вы просто использовать .get(key1,0.0) для поиска элемента существует, и если оно не 0.0 предполагается. В результате как dic1, так и dic2 не нужно сохранять значения с 0 в качестве значения.

Чтобы ответить на дополнительные вопросы:

Как я могу установить пар ключ-значение и иметь доступ к ним после этого?

Вы просто состояние:

dic[key] = value 

Как можно увеличить значение определенного ключа?

Если вы точно знаете, что ключ уже часть словаря:

dic[key] += 1 

иначе вы можете использовать:

dic[key] = dic.get(key,0)+1 

Или есть другие, более простой способ сделать это?

Вы можете использовать Counter, который представляет собой в основном словарь с добавленной функциональностью.

0

Использование pandas и scipy

import pandas as pd 
from scipy.spatial.distance import cosine 

line_dict = {'Karl': 1, 'Donald': 1, 'Ifwerson': 1, 'Trump': 0} 
query_dict = {'Karl': 0, 'Donald': 1, 'Ifwerson': 0, 'Trump': 1} 

line_s = pd.Series(line_dict) 
query_s = pd.Series(query_dict) 

print(1 - cosine(line_s, query_s)) 

Этот код выведет 0.40824829046386291

Я не понял, что вы имели в виду «порядок», так что я не имел дела с этим, но этот код должен быть хорошее начало для вас.