微信公众号:王了个博
专注于大数据技术,人工智能和编程语言
个人既可码代码也可以码文字。欢迎转发与关注
什么是TF-IDF
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜寻结果中出现的顺序
简介
TF-IDF实际上是:TF * IDF。主要思想是:如果某个词或短语在一篇文章中出现的频率高(即TF高),并且在其他文章中很少出现(即IDF高),则认为此词或者短语具有很好的类别区分能力,适合用来分类。
通俗理解TF-IDF就是:TF刻画了词语t对某篇文档的重要性,IDF刻画了词语t对整个文档集的重要性。
名词解释和数学算法
TF是词频(Term Frequency)
表示词条在文本中出现的频率
公式
IDF是逆向文件频率(Inverse Document Frequency)
某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力
公式
解释
分子|D|:语料库中的文件总数
分母:包含词语的文件数目(即文件数目)如果该词语不在语料库中,就会导致分母为零
TF-IDF实际上是:TF * IDF
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
公式:TF-IDF=TF*IDF
TF-IDF应用举例
有很多不同的数学公式可以用来计算TF-IDF。这边的例子以上述的数学公式来计算。词频 (TF) 是一词语出现的次数除以该文件的总词语数。假如一篇文件的总词语数是100个,而词语“中国”出现了8次,那么“中国””一词在该文件中的词频就是8/100=0.08。一个计算文件频率 (IDF) 的方法是文件集里包含的文件总数除以测定有多少份文件出现过“中国””一词。所以,如果“中国””一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是 lg(10,000,000 / 1,000)=4。最后的TF-IDF的分数为0.08 * 4=0.32
TF-IDF应用
搜索引擎
关键词提取
文本相似性
文本摘要
代码实现
1. 引入依赖
1import numpy as np
2import pandas as pd
2. 定义数据和预处理
1docA = "The cat sat on my bed"
2docB = "The dog sat on my knees"
3
4bowA = docA.split(" ")
5bowB = docB.split(" ")
6bowA
7
8# 构建词库
9wordSet = set(bowA).union(set(bowB))
10wordSet
输出效果:{'The', 'bed', 'cat', 'dog', 'knees', 'my', 'on', 'sat'}
3. 进行词数统计
1# 用统计字典来保存词出现的次数
2wordDictA = dict.fromkeys( wordSet, 0 )
3wordDictB = dict.fromkeys( wordSet, 0 )
4
5# 遍历文档,统计词数
6for word in bowA:
7 wordDictA[word] += 1
8for word in bowB:
9 wordDictB[word] += 1
10
11pd.DataFrame([wordDictA, wordDictB])
输出效果
4. 计算词频TF
1def computeTF( wordDict, bow ):
2 # 用一个字典对象记录tf,把所有的词对应在bow文档里的tf都算出来
3 tfDict = {}
4 nbowCount = len(bow)
5
6 for word, count in wordDict.items():
7 tfDict[word] = count / nbowCount
8 return tfDict
9
10tfA = computeTF( wordDictA, bowA )
11tfB = computeTF( wordDictB, bowB )
12tfA
输出效果
{
'cat': 0.16666666666666666,
'on': 0.16666666666666666,
'sat': 0.16666666666666666,
'knees': 0.0,
'bed': 0.16666666666666666,
'The': 0.16666666666666666,
'my': 0.16666666666666666,
'dog': 0.0
}
5. 计算逆文档频率idf
1def computeIDF( wordDictList ):
2 # 用一个字典对象保存idf结果,每个词作为key,初始值为0
3 idfDict = dict.fromkeys(wordDictList[0], 0)
4 N = len(wordDictList)
5 import math
6
7 for wordDict in wordDictList:
8 # 遍历字典中的每个词汇,统计Ni
9 for word, count in wordDict.items():
10 if count > 0:
11 # 先把Ni增加1,存入到idfDict
12 idfDict[word] += 1
13
14 # 已经得到所有词汇i对应的Ni,现在根据公式把它替换成为idf值
15 for word, ni in idfDict.items():
16 idfDict[word] = math.log10( (N+1)/(ni+1) )
17
18 return idfDict
19
20idfs = computeIDF( [wordDictA, wordDictB] )
21idfs
输出效果
{
'cat': 0.17609125905568124,
'on': 0.0,
'sat': 0.0,
'knees': 0.17609125905568124,
'bed': 0.17609125905568124,
'The': 0.0,
'my': 0.0,
'dog': 0.17609125905568124
}
6. 计算TF-IDF
1def computeTFIDF( tf, idfs ):
2 tfidf = {}
3 for word, tfval in tf.items():
4 tfidf[word] = tfval * idfs[word]
5 return tfidf
6
7tfidfA = computeTFIDF( tfA, idfs )
8tfidfB = computeTFIDF( tfB, idfs )
9
10pd.DataFrame( [tfidfA, tfidfB] )
输出效果
TF-IDF的理论依据及不足
TF-IDF算法是建立在这样一个假设之上的:对区别文档最有意义的词语应该是那些在文档中出现频率高,而在整个文档集合的其他文档中出现频率少的词语,所以如果特征空间坐标系取TF词频作为测度,就可以体现同类文本的特点。另外考虑到单词区别不同类别的能力,TF-IDF法认为一个单词出现的文本频数越小,它区别不同类别文本的能力就越大。因此引入了逆文本频度IDF的概念,以TF和IDF的乘积作为特征空间坐标系的取值测度,并用它完成对权值TF的调整,调整权值的目的在于突出重要单词,抑制次要单词。但是在本质上IDF是一种试图抑制噪音的加权 ,并且单纯地认为文本频数小的单词就越重要,文本频数大的单词就越无用,显然这并不是完全正确的。IDF的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以TF-IDF法的精度并不是很高。
此外,在TF-IDF算法中并没有体现出单词的位置信息,对于Web文档而言,权重的计算方法应该体现出HTML的结构特征。特征词在不同的标记符中对文章内容的反映程度不同,其权重的计算方法也应不同。因此应该对于处于网页不同位置的特征词分别赋予不同的系数,然后乘以特征词的词频,以提高文本表示的效果。
至此,TF-IDF统计算法介绍完了
机器学习未完待续 ……欢迎关注
微信公众号:王了个博
人要去的地方,除了远方,还有未来
欢迎关注我,一起学习,一起进步!
领取专属 10元无门槛券
私享最新 技术干货