概述
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的公式如下:
表示词条 在文档 中出现的次数,分母是这篇文档的总词数(对这篇文档中的所有单词的频率的加和,就是这篇文档的总词数)所以, 就是词条 在文档 中出现的频率
注意:如果只用词频来表达一个词对一篇文档的重要程度显然是不合适的,因为在一篇文档里面,可能出现频率很高的词是一些没有意义的词语,真正能代表这篇文档的关键词可能只出很少的次数。
因此,为了能得到能代表这篇文章的词语,就要求这个词语能在这篇文档里面出现的多,但是在所有的文档里面出现的次数较少,这样词语才能很好的表达这篇文档的主题。
IDF介绍
IDF(Inverse Document Frequency,逆文档频率)如果包含某一个词条的文档越少,那么这个词语的IDF值就越大,说明这个词具有代表性,所以IDF的公式如下:
表示所有的文档的数量,分子是包含这个词条的文档的数量
注意!一般分母要加一个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}
最后
以上就是现代白开水为你收集整理的TF-IDF(词频-逆文档频率)介绍与python实现TF-IDF(term frequency—inverse document frequency)的全部内容,希望文章能够帮你解决TF-IDF(词频-逆文档频率)介绍与python实现TF-IDF(term frequency—inverse document frequency)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复