在python中计算两个wordfrequencydictionary的余弦相似度的正确方法?

2024-06-02 09:39:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图遍历一个包含文本的文件,并计算当前行和用户所引发的查询之间的余弦相似性。我已经将查询和行标记化,并将它们的单词联合保存到一个集合中。在

示例:

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

query_tokenized = ['Donald', 'Trump']

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

现在我必须为行和查询分别创建一个字典,其中包含词频对。我想过这样的事情:

^{pr2}$

但是由于键值对是无序的,因此余弦相似度将无法正确计算。我遇到了OrderedDict(),但我不明白如何实现某些东西,因为它的元素是以元组形式存储的:

所以我的问题是:

  • 如何设置键值对并在以后访问它们?在
  • 如何增加某个密钥的值?在
  • 或者还有其他更简单的方法吗?在

Tags: 文件用户标记文本示例linekarlquery
2条回答

使用pandasscipy

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

我不明白你所说的“订单”是什么意思,所以我还没有处理过这个问题,但是这段代码对你来说应该是个好的开始。在

您不需要为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 += val1*val1
    denb = 0
    for val2 in dic2.values():
        denb += val2*val2
    return numerator/math.sqrt(dena*denb)

您只需使用.get(key1,0.0)来查找元素是否存在,如果不存在,则假定为0.0。因此,dic1和{}都不需要以0作为值来存储值。在

回答您的其他问题:

How can I set the key-value pairs and have access to them afterwards?

你只需声明:

^{pr2}$

How can I increment the value of a certain key?

如果您确定密钥已经是字典的一部分:

dic[key] +=  1

否则,您可以使用:

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

Or is there any other more easier way to do this?

您可以使用Counter,它基本上是一个具有一些附加功能的字典。在

相关问题 更多 >