赞
踩
TF-IDF(词频-逆文档频率)是一种用于信息检索(Information retrieval)与数据挖掘(data mining)常用的加权技术
TF-IDF是一种统计方法,用来评估单词或短语对于一个语料库的重要程度,由两部分组成:TF是词频(Term Frequency),IDF是逆文本频率指数(Inverse Document Frequency)
主要思想:单词或短语的重要性随着它在文档中出现的次数成正比,与它在整个语料库中出现的次数成反比。
简单来说:一个词语在一篇文章中出现的次数越多,在整个语料库中出现的次数越少,越能代表这篇文章。
TF(Term Frequency,词频)用来表示单词或短语在文档中出现的频率,结果一般会被归一化(使用词频处以文档总词数),来防止它偏向长文件(同一个词语在长文本中可能具有更高的词频)。
TF的公式如下:
表示词条
在文档
中出现的次数,分母是这篇文档的总词数(对这篇文档中的所有单词的频率的加和,就是这篇文档的总词数)所以,
就是词条
在文档
中出现的频率
注意:如果只用词频来表达一个词对一篇文档的重要程度显然是不合适的,因为在一篇文档里面,可能出现频率很高的词是一些没有意义的词语,真正能代表这篇文档的关键词可能只出很少的次数。
因此,为了能得到能代表这篇文章的词语,就要求这个词语能在这篇文档里面出现的多,但是在所有的文档里面出现的次数较少,这样词语才能很好的表达这篇文档的主题。
IDF(Inverse Document Frequency,逆文档频率)如果包含某一个词条的文档越少,那么这个词语的IDF值就越大,说明这个词具有代表性,所以IDF的公式如下:
表示所有的文档的数量,分子是包含这个词条
的文档的数量
注意!一般分母要加一个1,防止出现分母为0的情况。
所以TF-IDF的值就是TF的值乘上IDF的值。
TF-IDF的优缺点:容易理解且易于实现,但没有考虑词语的语义信息,无法处理一词多义和一义多词的情况。
1、没有考虑目标词的位置因素对文本的影响,当同一个词出现在文档的不同位置的时候,它们产生的影响应该是不一样的。
2、按照传统的TF-IDF,一些生僻词的IDF值会很高,这些词有可能被误认为是关键词
3、对文档中出现次数较少的重要人名、地名的提取效果不佳
一般可以使用几种方式来实现:
1、使用python手动实现
2、使用NLTK实现
3、使用gensim库实现
4、使用sklearn库实现
创建语料库:
- 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}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。