从头开始计算IDF

问题描述

我正在尝试从头开始计算IDF值,以便我可以了解它在幕后的工作方式,但仍然无法获得预期的结果。

我有一套这样的文件

docs = {'d1' :'t3 t3 t3 t6 t6','d2' :'t1 t2 t3 t3 t6','d3' :'t3 t3 t4 t5','d4' :'t4 t5 t6 t6','d5' :'t1 t2 t3 t5'}

我应该计算一个名为query_sum_idf的值,该值代表请求中发送的令牌的IDF总和,在这种情况下为['t5','t2']

在这种情况下,期望值为1.4271 ± 1.0e-04,但是在开发微积分时,这是我所做的,并且得到了不同的结果: math.log10(5 / float(3)) + math.log10(5 / float(2)) = 0.6197,其中5是文档总数,3是所有文档中t5的计数,最后2是{{ 1}}。

如您所见,结果有所不同,所以我要问是否遗漏了一些东西。

解决方法

那里有有趣的问题。

我尝试自己完成此任务,并在Wikipedia上查找了IDF的常见定义。我这样计算IDF:

import math
def idf(docs,term):
    count = 0
    for key,doc in docs.items():
        if term in doc: count += 1
    return math.log(len(docs)/count)

问题是,您使用的是log10而不是自然对数。即使在Wiki上,也未定义使用哪个log。希望我能帮上忙。