戳蓝色字关注我们哟!
导读:TF-IDF是NLP中的一个很基础的方法,一般不太会单独使用,但在很多应用场景确是随处可见他的身影。
1
概念
TF-IDF(term frequency-inverse document frequency)是一种帮我们完成关键词提取的统计方法。
TF指某词在文本中出现的频率。因为长文本中,词出现的次数会更高,因此这里不考虑频数而是频率。
IDF指逆向文件频率,含有某词的文档越少,则IDF越大,
其中,分母加1是为了防止含有某词的文档数为0导致计算错误。
TF-IDF的基本思想是,采用文本逆频率 IDF 对 TF 值加权,取权值大的作为关键词。如果某词在一篇文章中出现的频率高,在其他文件中出现的频率低,则认为此词有更好的区分能力,即词语重要性与它在文本中出现的次数成正比,与在所有语料中出现的频率成反比。
TF-IDF是一种词袋方法,
。
2
示例
假设有1000篇文章,“零食”一词在文章a中出现了10次,a中共有100个词,则TF=10/100=0.1,“零食”共在50篇文章中出现过,则 IDF=log(1000/51)=1.29,因此,TF-IDF=0.1*1.29=0.129。
3
典型应用
- 关键词提取 引申1:通过关键词相对词频的余弦相似度判断文章相似性。 引申2:通过关键词找到包含信息量最多的句子,生成文章摘要。
- 搜索引擎——搜索词与文章匹配度 某词中文章中的TF-IDF越高,则与该文章越匹配。
4
Python实现
将示例语料进行tf-idf计算:
代码语言:javascript复制# -*- coding: utf-8 -*-
from collections import defaultdict
import math
import operator
"""
函数说明:创建数据样本
Returns:
dataset - 实验样本切分的词条
"""
def loadDataSet():
dataset = [ ['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], # 切分的词条
['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
['stop', 'posting', 'stupid', 'worthless', 'garbage'],
['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
['quit', 'buying', 'worthless', 'dog', 'food', 'stupid'] ]
return dataset
"""
函数说明:特征选择TF-IDF算法
Parameters:
list_words:词列表
Returns:
word_tf:tf值
word_idf:idf值
word_tf_idf:tf-idf值
"""
def feature_select(list_words):
#计算tf,idf
word_tf=[]
a=[]
word_idf={}
word_doc=defaultdict(int)
for i in range(0,len(list_words)):
doc_frequency=defaultdict(int)
tmp={}
words = list(list_words[i])
for word in words:
doc_frequency[word] =1
word_doc[word] =1
a.append(doc_frequency)
for j in doc_frequency:
tmp[j]=doc_frequency[j]/sum(doc_frequency.values())
word_tf.append(tmp)
for i in word_doc:
word_idf[i]=math.log(len(list_words)/(word_doc[i] 1))
#计算每个词的TF*IDF的值
word_tf_idf=[]
for i in range(0,len(list_words)):
tmp_idf={}
for key in word_tf[i]:
tmp_idf[key]=word_tf[i][key]*word_idf[key]
word_tf_idf.append(tmp_idf)
return word_tf,word_idf,word_tf_idf
得到的结果如下:
5
优缺点
TF-IDF优点很明显,就是简单易操作。缺点主要如下:
1、依赖语料库的选取。
2、容易将生僻字的重要性放大。
3、未考虑词所在位置的不同带来的影响。
参考资料:
https://pdf.hanspub.org/CSA20130100000_81882762.pdf
https://blog.csdn.net/asialee_bird/article/details/81486700
后台回复“tfidf”获得完整代码