本篇blog是利用Python进行文章特征提取的续篇,主要介绍构建带TF-IDF权重的文章特征向量。
In [1]:
# 带TF-IDF权重的扩展词库# 在第一篇文档里 主要是利用词库模型简单判断单词是否在文档中出现。然而与单词的顺序、频率无关。然后词的频率对文档更有意义。因此本文将词频加入特征向量
In [2]:
# 1.计算单词在文档中的频率from sklearn.feature_extraction.text import CountVectorizer
In [5]:
documents=['The dog ate a sandwich, the wizard transfigured a sandwich, and I ate a sandwich']vector=CountVectorizer(stop_words='english')print(vector.fit_transform(documents).todense())print(vector.vocabulary_)
In [ ]:
# 2.逆向文档率(IDF)# 但是在对比长度不同的文档时候,问题就变得复杂了。sklearn提供了TfdfTransformer类来解决问题,#主要是对词频特征向量归一化实现不同文档向量的可比性。该类使用L2范式对特征向量进行归一化:#另外,还有对数词频调整方法(logarithmically scaled term frequencies),把词频调整到一个更小的范围,或者词频放大法(augmented term frequencies),适用于消除较长文档的差异。#归一化,对数调整词频和词频放大三支方法都消除文档不同大小对词频的影响。# 对于消除频率高但是很普通的词对文档影响,引进了 逆文档频率(inverse document frequency,IDF),用来度量文档集中单词的频率。# TfdfTransformer类默认返回TF-IDF值,其参数use_idf默认为True#sklearn提供了TfidfVectorizer类将CountVectorizer和TfdfTransformer类封装在一起。代码如下:
In [6]:
from sklearn.feature_extraction.text import TfidfVectorizerdocuments=['The dog ate a sandwich and I ate a sandwich','The wizard transfigured a sandwich']vector=TfidfVectorizer(stop_words='english')print(vector.fit_transform(documents).todense())print(vector.vocabulary_)
In [7]:
# 3. 通过哈希表来实现特征向量# 在计算文档词频和IDF值时,都是先通过建立词典,然后创建特征向量。但是如果文档集特别大,就会引起内存耗尽的问题。# 因此,可以采取利用哈希表来解决上述问题。sklearn提供了HashingVectorizer来实现,代码如下:
In [9]:
from sklearn.feature_extraction.text import HashingVectorizerdocuments=['The dog ate a sandwich and I ate a sandwich','The wizard transfigured a sandwich']vector=HashingVectorizer(n_features=5)print(vector.transform(documents).todense())
In [ ]:
#哈希技巧是无固定状态的(stateless),它把任意的数据块映射到固定数目的位置,并且保证相同的输入一定产生相同的输出,不同的输入尽可能产生不同的输出。它可以用并行,线上,流式传输创建特征向量,因为它初始化是不需要文集输入。n_features是一个可选参数,默认值是 2的20次方。#用带符号哈希函数可以把词块发生哈希碰撞的概率相互抵消掉,信息损失比信息损失的同时出现信息#冗余要好。哈希技巧的一个不足是模型的结果更难察看,由于哈希函数不能显示哪个词块映射到特征#向量的哪个位置了。# 特别感谢《Mastering Machine Learning With scikit-learn》一书。