2.TF - IDF:作用:提取出来一句话中词的重要性,分成两个部分:
tf: 词频(某一类中词条出现的次数 / 该类中所有词条数目)
idf: 逆文档频率(作用:去掉逗号,的等)公式:idf = log(总文档数 / 包含词条w的文档数 + 1)
计算出来的:tf * idf = 词的重要性。
缺点:高维稀疏
在处理算法以及挖掘数据的时候,所有的数据都是以字符串的形式存在的,所以文本挖掘的时候,需要先对字符串进行数字化,从而能够进行计算,TF-IDF就是这样一种计算,能够将字符串转化成数字,从而能够更快更方便的进行计算。
是一种针对于关键词的统计分析的方法,用于评估一个词对一个文档,或者语料库的重要程度,一个词跟它在文章中出现的次数成正比,和他在语料库中出现的次数成反比,这种方法有效的提升关键词和文章的相关性。
在TF-IDF中分为两个部分,TF和IDF
TF词频,表示某个词在文章中出现的总的次数,但是这个标准通常被归一化一下,就是TF=(某个词出现的次数/该篇文档中总的词数),这样做的好处就是,比如在两个文档中,这两个文档的篇幅长度差别特别特别的打,这个时候,长文档中不常出现的词的次数可能也会比短文章中的词出现的频率高,因此,做个这样的归一化更加方便它们之间的比较。
IDF是逆文档频率,包含某个词的文档越少,那么这个词越重要,因为表示这个词区分文档的能力越强,IDF=ln(语料库中的文档总数 / 包含某个词的文档数 + 1),+1是为了防止某个词从未出现过而导致分母为0。
TF-IDF = TF * IDF 输出的值越大,证明这个词对于这个文档的重要性越大。
示例1
有很多不同的数学公式可以用来计算TF-IDF。这边的例子以上述的数学公式来计算。词频 (TF) 是一词语出现的次数除以该文件的总词语数。假如一篇文件的总词语数是100个,而词语"母牛"出现了3次,那么"母牛"一词在该文件中的词频就是3/100=0.03。一个计算文件频率 (DF) 的方法是测定有多少份文件出现过"母牛"一词,然后除以文件集里包含的文件总数。所以,如果"母牛"一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是 log(10,000,000 / 1,000)=4。最后的TF-IDF的分数为0.03 * 4=0.12。
示例2
根据关键字k1,k2,k3进行搜索结果的相关性就变成TF1*IDF1 + TF2*IDF2 + TF3*IDF3。比如文档1的term总量为1000,k1,k2,k3在文档1出现的次数是100,200,50。包含了 k1, k2, k3的文档中总量分别是 1000,10000,5000。document set的总量为10000。 TF1 = 100/1000 = 0.1 TF2 = 200/1000 = 0.2 TF3 = 50/1000 = 0.05 IDF1 = log(10000/1000) = log(10) = 2.3 IDF2 = log(10000/100000) = log(1) = 0; IDF3 = log(10000/5000) = log(2) = 0.69 这样关键字k1,k2,k3与文档1的相关性= 0.1*2.3 + 0.2*0 + 0.05*0.69 = 0.2645 其中k1比k3的比重在文档1要大,k2的比重是0.
TF-IDF的优点:
TF-IDF算法的优点是简单快速,结果比较符合实际情况。
TF-IDF算法的不足:
TF-IDF 采用文本逆频率 IDF 对 TF 值加权取权值大的作为关键词,但 IDF 的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以 TF-IDF 算法的精度并不是很高,尤其是当文本集已经分类的情况下。
在本质上 IDF 是一种试图抑制噪音的加权,并且单纯地认为文本频率小的单词就越重要,文本频率大的单词就越无用。这对于大部分文本信息,并不是完全正确的。IDF 的简单结构并不能使提取的关键词, 十分有效地反映单词的重要程度和特征词的分布情 况,使其无法很好地完成对权值调整的功能。尤其是在同类语料库中,这一方法有很大弊端,往往一些同类文本的关键词被盖。
TF-IDF算法实现简单快速,但是仍有许多不足之处:
(1)没有考虑特征词的位置因素对文本的区分度,词条出现在文档的不同位置时,对区分度的贡献大小是不一样的。
(2)按照传统TF-IDF,往往一些生僻词的IDF(反文档频率)会比较高、因此这些生僻词常会被误认为是文档关键词。
(3)传统TF-IDF中的IDF部分只考虑了特征词与它出现的文本数之间的关系,而忽略了特征项在一个类别中不同的类别间的分布情况。
(4)对于文档中出现次数较少的重要人名、地名信息提取效果不佳。
改进方法:TF-IWF
简单的调库使用:
CountVectorizer
CountVectorizer类会将文本中的词语转换为词频矩阵。
例如矩阵中包含一个元素a[i][j],它表示j词在i类文本下的词频。
它通过fit_transform函数计算各个词语出现的次数,
通过get_feature_names()可获取词袋中所有文本的关键字,
通过toarray()可看到词频矩阵的结果。
输出的结果:
TfidfTransformer
统计CountVectorizer中每个词语的tf-idf权值
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF-IDF实际上是:TF * IDF。
它们两个的输出对比:
统计数量的得到的矩阵
经过加权,也就是说TF-IDF得到的矩阵
TfidfVectorizer
其实就是CountVectorizer + TfidfTransformer组合使用
CountVectorizer会将文本中的词语转换为词频矩阵,它通过fit_transform函数计算各个词语出现的次数,通过get_feature_names()可获得所有文本的关键词,通过toarray()可看到词频矩阵的结果。
TfidfTransformer用于统计vectorizer中每个词语的TFIDF值。
而这个TfidfVectornizer就是将原始文档的集合转化为tf-idf特性的矩阵,相当于CountVectorizer配合TfidfTransformer使用的效果。
即TfidfVectorizer类将CountVectorizer和TfidfTransformer类封装在一起。