当前位置:   article > 正文

gensim中tfidf计算方法_gesim中计算tfidf的实现

gesim中计算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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

步骤

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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)]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/354432
推荐阅读
相关标签
  

闽ICP备14008679号