我正在尝试遍历包含文本的文件,并计算当前行与用户引发的查询之间的余弦相似度。我已经对查询和行进行了标记,并将其单词的并集保存到集合中。
示例:
line_tokenized = ['Karl', 'Donald', 'Ifwerson']
query_tokenized = ['Donald', 'Trump']
word_set = ['Karl', 'Donald', 'Ifwerson', 'Trump']
现在我必须为行和查询创建一个字典,包含字频对。我想到了一件事:
line_dict = {'Karl': 1, 'Donald': 1, 'Ifwerson': 1, 'Trump': 0}
query_dict = {'Karl': 0, 'Donald': 1, 'Ifwerson': 0, 'Trump': 1}
但由于键值对无序,因此无法正确计算余弦相似度。我遇到OrderedDict()
,但我不明白如何实现某些东西,因为它的元素存储为元组:
所以我的问题是:
答案 0 :(得分: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
,它基本上是一个带有一些附加功能的字典。
答案 1 :(得分: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
我不明白你的“订单”是什么意思所以我没有处理过,但这段代码对你来说应该是一个好的开始。