gensim中tfidf计算方法

基本原理和思想呢,大概就是 文档中词的重要性
与 TF:每个文档中的词的频率成正比
与 IDF: 词在文档中出现的次数/总文档数 的比例成反比

但是计算的过程中有很多变体,下面就举例介绍一下 gensim中的计算过程。

调用方式

from gensim import corpora, models, similarities

corpus = [[(0, 1.0), (1, 1.0), (2, 1.0)],
          [(2, 1.0), (3, 1.0), (4, 1.0), (5, 1.0), (6, 1.0), (8, 1.0)],
          [(1, 1.0), (3, 1.0), (4, 1.0), (7, 1.0)],
          [(0, 1.0), (4, 2.0), (7, 1.0)],
          [(3, 1.0), (5, 1.0), (6, 1.0)],
          [(9, 1.0)],
          [(9, 1.0), (10, 1.0)],
          [(9, 1.0), (10, 1.0), (11, 1.0)],
          [(8, 1.0), (10, 1.0), (11, 1.0)]]

tfidf = models.TfidfModel(corpus)
vec = [(0, 1),(4,1)]

print(tfidf[vec])
>>> [(0, 0.8075244024440723), (4, 0.5898341626740045)]

步骤

1、计算 term 出现的频次
2、计算idf值
关注源码中的函数 df2idf 计算的是 idf 值。

def df2idf(docfreq, totaldocs, log_base=2.0, add=0.0):
    r"""Compute inverse-document-frequency for a term with the given document frequency `docfreq`:
    :math:`idf = add + log_{log\_base} \frac{totaldocs}{docfreq}`

    Parameters
    ----------
    docfreq : {int, float}
        Document frequency.
    totaldocs : int
        Total number of documents.
    log_base : float, optional
        Base of logarithm.
    add : float, optional
        Offset.

    Returns
    -------
    float
        Inverse document frequency.

    """
    return add + np.log(float(totaldocs) / docfreq) / np.log(log_base)

3、归一化
可以 ??gensim.mathutils.unitvec 进行查看。

代入

以开始的示例进行讲解


step1 :
	 termfreq = [(0,1),(4,1)]
step2:

	词项0, totaldocs = 9, docfreq = 2,log_base = 2
	idf  = np.log(float(totaldocs) / docfreq) / np.log(log_base) = 2.1699250014423126
	词项4, totaldocs = 9, docfreq = 3,log_base = 2
	idf  = np.log(float(totaldocs) / docfreq) / np.log(log_base) = 1.5849625007211563
	idf = [(0,2.1699250014423126),(4,1.5849625007211563 )] 
step3:
	l2 norm 归一化后 veclen = np.sqrt(np.sum(np.array([2.1699250014423126,1.5849625007211563]) ** 2)) = 2.6871324196207156
	最后得到 tfidf = [(0, 0.8075244024440723), (4, 0.5898341626740045)]

通过查看源码可以看到其他 idf 和归一化的计算方式。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RessCris

老铁门多支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值