文本分类四之权重策略:TF-IDF方法
接下来,目的就是要将训练集所有文本文件(词向量)统一到同一个词向量空间中。在词向量空间中,事实上不同的词,它的权重是不同的,它对文本分类的影响力也不同,为此我们希望得到的词向量空间不是等权重的空间,而是不同权重的词向量空间。我们把带有不同权重的词向量空间叫做“加权词向量空间”,也有的技术文档将其称为“加权向量词袋”,一个意思。
计算文本的权重向量,应该选择一个有效的权重方案,最流行的方案是TF-IDF权重策略。其含义是词频逆文档频率,也就是说:如果某个词或者短语在一篇文章中出现的频率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF-IDF的假设是,高频率词应该具有高权重,除非他也是高文档频率。逆文档频率就是使用词条的文档频率来抵消该词的词频对权重的影响,从而得到一个较低的权重。
即使测试集出现了新的词汇(不是停用词),即使新的文本数据有新的词汇,只要它不是训练集生成的TF-IDF词向量空间中的词,都不予考虑。这就实现了所有文本词向量空间“大一统”,也只有这样,大家才在同一个世界里。才能进行下一步的研究。
词频的定义(百度百科)
在一份给定的文件里,词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被正规化,以防止它偏向长的文件。同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。
逆向文件频率(inverse document frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。
下面将训练集所有文本文件(词向量)统一到同一个TF-IDF词向量空间中(或者叫做用TF-IDF算法计算权重的有权词向量空间)。这个词向量空间最终存放在train_word_bag/tfdifspace.dat中。也就是大量的训练集数据成功的构建了一个TF-IDF词向量空间,空间的各个词都是出自这个训练集(去掉了停用词)中,各个词的权值也都一并保存了下来,叫做权重矩阵。需要注意的是,权重矩阵是一个二维矩阵,a[i][j]表示,第i个词在第j个类别中的IF-IDF值。
代码实现
1.导入所需的Scikit-Learn包
import sys
import os
from sklearn.datasets.base import Bunch #引入Bunch类
import cPickle as pickle #引入持久化类
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer #向量转换类
from sklearn.feature_extraction.text import TfidfVectorizer #向量生成类
#配置UTF-8输出环境
reload(sys)
sys.setdefaultencoding('utf-8')
2.读取和写入Bunch对象的函数
#读取Bunch对象
def readbunchobj(path):
file_obj=open(path,"rb")
bunch=pickle.load(file_obj)
file_obj.close()
return bunch
#写入Bunch对象
def writebunchobj(path,bunchobj):
file_obj=open(path,"wb")
pickle.dump(bunchobj,file_obj)
file_obj.close()
3.从训练集生成TF-IDF向量的词袋
#读取文件
#读取停用词表
stopword_path="train_word_bag/hlt_stop_words.txt"
stpwrdlst=readfile(stopword_path).splitlines()
#导入分词后的词向量Bunch对象
path="train_word_bag/train_set.dat" #词向量空间保存路径
bunch=readbunchobj(path)
#构建TF-IDF词向量空间对象
tfidfspace=Bunch(target_name=bunch.target_name,label=bunch.label,filenames=bunch.filenames,tdm=[],vocabulary={})
#使用Tfidfvectorizer初始化向量空间模型
vectorizer=TfidfVectorizer(stop_words=stpwrdlst,sublinear_tf=True,max_df=0.5)
transformer=TfidfTransformer()
#文本转换为词频矩阵,单独保存字典文件
tfidfspace.tdm=vectorizer.fit_transform(bunch.contents)
tfidfspace.vocabulary=vectorizer.vocabulary_
4.持久化TF-IDF向量词袋
#创建词袋的持久化
space_path="train_word_bag/tfdifspace.dat" #词向量词袋保存路径
writebunchobj(space_path,tfidfspace)
运行之后,将训练集数据转换为TF-IDF词向量空间中的实例,保存在train_word_bag/tfdifspace.dat中,具体来说,这个文件里面有两个我们感兴趣的东西,一个是vocabulary,即词向量空间坐标,一个是tdm,即训练集的TF-IDF权重矩阵。