TF-IDF特征值
1.TF-IDF简介
内容参考百度百科
TFIDF实际上是:TF * IDF
词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率。
逆向文件频率(inverse document frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目。
这边的例子以上述的数学公式来计算。词频 (TF) 是一词语出现的次数除以该文件的总词语数。假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,那么“母牛”一词在该文件中的词频就是3/100=0.03。一个计算文件频率 (IDF) 的方法是文件集里包含的文件总数除以测定有多少份文件出现过“母牛”一词。所以,如果“母牛”一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是 lg10,000,000 / 1,000)=4。最后的TF-IDF的分数为0.03 * 4=0.12。
2.计算文本中的TF-IDF值
使用skitlearn中的TfidfTransformer函数
# coding:utf-8
import jieba
import jieba.posseg as pseg
import os
import sys
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
if __name__ == "__main__":
corpus=["我 来到 北京 清华大学",#第一类文本切词后的结果,词之间以空格隔开
"他 来到 了 网易 杭研 大厦",#第二类文本的切词结果
"小明 硕士 毕业 与 中国 科学院",#第三类文本的切词结果
"我 爱 北京 天安门"]#第四类文本的切词结果
vectorizer=CountVectorizer()#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
transformer=TfidfTransformer()#该类会统计每个词语的tf-idf权值
tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))#第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵
word=vectorizer.get_feature_names()#获取词袋模型中的所有词语
weight=tfidf.toarray()#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
for i in range(len(weight)):#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
print (u"-------这里输出第",i,u"类文本的词语tf-idf权重------")
for j in range(len(word)):
print (word[j],weight[i][j])
3.自信息熵、条件熵、联合熵、互信息
这部分内容参考书籍《从投骰子到阿尔法狗》第五章:趣谈信息熵
香农根据概率取对数后的平均值定义信息熵。如果只有一个随机变量,比如一个信息源,定义的是源的自信息熵。如果有多个随机变量,可以定义它们的条件概率、联合概率等,相对应地,也就有了条件熵、联合熵、互信息,等等,它们之间的关系如下图所示。
比如说,最简单的情况,只有两个随机变量X和Y。如果它们互相独立的话,那就只是将它们看成两个互相不影响的随机变量而已,在这种情形,图(a)中的两个圆圈没有交集,变量X和Y分别有自己的自信息熵H(X)和H(Y)。如果两个变量互相关联,则两个圆圈交叉的情况可以描述关联程度的多少。图中的条件熵H(X|Y)表示的是,在给定随机变量Y的条件下,X的平均信息量;相类似地,条件熵H(Y|X)是随机变量X被给定的条件下Y的平均信息量。联合熵H(X,Y),则是两个变量X,Y同时出现(比如同时丢硬币和骰子)的信息熵,也就是描述这一对随机变量同时发生,平均所需要的信息量。图中两个圆的交叉部分I(X ;Y)被称为互信息,是两个变量互相依赖程度的量度,或者可看作是两个随机变量共享的信息量。