TF-IDF(词频-逆文档频率)介绍与python实现

TF-IDF(term frequency—inverse document frequency)

TF-IDF介绍

TF-IDF(词频-逆文档频率)是一种用于信息检索(Information retrieval)与数据挖掘(data mining)常用的加权技术

TF-IDF是一种统计方法,用来评估单词或短语对于一个语料库的重要程度,由两部分组成:TF是词频(Term Frequency)IDF是逆文本频率指数(Inverse Document Frequency)

主要思想:单词或短语的重要性随着它在文档中出现的次数成正比,与它在整个语料库中出现的次数成反比

简单来说:一个词语在一篇文章中出现的次数越多,在整个语料库中出现的次数越少,越能代表这篇文章。

 

TF介绍:

TF(Term Frequency,词频)用来表示单词或短语在文档中出现的频率,结果一般会被归一化(使用词频处以文档总词数),来防止它偏向长文件(同一个词语在长文本中可能具有更高的词频)。

TF的公式如下:

n_{i,j} 表示词条  t_{i}  在文档  d_{j}  中出现的次数,分母是这篇文档的总词数(对这篇文档中的所有单词的频率的加和,就是这篇文档的总词数)所以,  tf_{i,j}  就是词条  t_{i}  在文档  d_{j}  中出现的频率

 

注意:如果只用词频来表达一个词对一篇文档的重要程度显然是不合适的,因为在一篇文档里面,可能出现频率很高的词是一些没有意义的词语,真正能代表这篇文档的关键词可能只出很少的次数。

因此,为了能得到能代表这篇文章的词语,就要求这个词语能在这篇文档里面出现的多,但是在所有的文档里面出现的次数较少,这样词语才能很好的表达这篇文档的主题。

IDF介绍

IDF(Inverse Document Frequency,逆文档频率)如果包含某一个词条的文档越少,那么这个词语的IDF值就越大,说明这个词具有代表性,所以IDF的公式如下:

\left | D \right |表示所有的文档的数量,分子是包含这个词条t_{i}的文档的数量

注意!一般分母要加一个1,防止出现分母为0的情况。

 

所以TF-IDF的值就是TF的值乘上IDF的值。

TF-IDF的优缺点:容易理解且易于实现,但没有考虑词语的语义信息,无法处理一词多义和一义多词的情况。

TF-IDF的不足:

1、没有考虑目标词的位置因素对文本的影响,当同一个词出现在文档的不同位置的时候,它们产生的影响应该是不一样的。

2、按照传统的TF-IDF,一些生僻词的IDF值会很高,这些词有可能被误认为是关键词

3、对文档中出现次数较少的重要人名、地名的提取效果不佳

python实现

一般可以使用几种方式来实现:

1、使用python手动实现

2、使用NLTK实现

3、使用gensim库实现

4、使用sklearn库实现

1、使用python手动实现:

创建语料库:

corpus=['this is the first document',
'this is the second second document',
'and the third one',
'is this the first document']
words_list = []
for i in range(len(corpus)):
    words_list.append(corpus[i].split())
print(words_list)

结果是一个包含了所有分了词的句子的列表:

[['this', 'is', 'the', 'first', 'document'], 
['this', 'is', 'the', 'second', 'second', 'document'], 
['and', 'the', 'third', 'one'], 
['is', 'this', 'the', 'first', 'document']]

统计一下词语的数量

from collections import Counter
count_list=[]
for i in range(len(words_list)):
    count = Counter(words_list[i])
    count_list.append(count)
print(count_list)

结果如下:

[Counter({'this': 1, 'is': 1, 'the': 1, 'first': 1, 'document': 1}), 
Counter({'second': 2, 'this': 1, 'is': 1, 'the': 1, 'document': 1}), 
Counter({'and': 1, 'the': 1, 'third': 1, 'one': 1}), 
Counter({'is': 1, 'this': 1, 'the': 1, 'first': 1, 'document': 1})]

定义TF和IDF函数

 

import math
def tf(word,count):
    return count[word]/sum(count.values())

def idf(word,count_list):
    n_contain = sum([1 for count in count_list if word in count])
    return math.log(len(count_list)/(1+n_contain))

def tf_idf(word,count,count_list):
    return tf(word,count)*idf(word,count_list)

 输出结果:

for i,count in enumerate(count_list):
    print("第{}个文档的TF-IDF统计信息为:".format(i+1))
    sources = {word: tf_idf(word, count, count_list) for word in count}
    print(sources)

 

第1个文档的TF-IDF统计信息为:
{'this': 0.0, 'is': 0.0, 'the': -0.044628710262841945, 'first': 0.05753641449035617, 'document': 0.0}
第2个文档的TF-IDF统计信息为:
{'this': 0.0, 'is': 0.0, 'the': -0.03719059188570162, 'second': 0.23104906018664842, 'document': 0.0}
第3个文档的TF-IDF统计信息为:
{'and': 0.17328679513998632, 'the': -0.05578588782855243, 'third': 0.17328679513998632, 'one': 0.17328679513998632}
第4个文档的TF-IDF统计信息为:
{'is': 0.0, 'this': 0.0, 'the': -0.044628710262841945, 'first': 0.05753641449035617, 'document': 0.0}

 

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值