学习sklearn之文本特征提取

2016.9.27

有关特征的提取,scikit-learn给出了很多方法,具体分成了图片特征提取和文本特征提取。文本特征提取的接口是sklearn.feature_extraction.text,那么接下来学习里面封装的函数。

CountVectorizer

先看官方说明,发现CountVectorizer()的配置参数多的吓人,幸好在例程页面有提到很多的参数的默认设置已经设置的很好了,不需要怎么改动。

那么就先看例程

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(min_df=1)

corpus = [
 			'This is the first document.',
    		'This is the second second document.',
    		'And the third one.',
			'Is this the first document?',
		]
X = vectorizer.fit_transform(corpus)
feature_name = vectorizer.get_feature_names()

print feature_name
print X.toarray()

程序的结果为

[u'and', u'document', u'first', u'is', u'one', u'second', u'the', u'third', u'this']
[[0 1 1 1 0 0 1 0 1]
 [0 1 0 1 0 2 1 0 1]
 [1 0 0 0 1 0 1 1 0]
 [0 1 1 1 0 0 1 0 1]]

可见程序将corpus生成了一个字典,如feature_name,而X则是把corpus里面的每一行根据字典生成了词频向量。

如果将其用来作用于汉语语料的时候,需要配置一下token_pattern参数,因为默认的token_pattern参数会过滤掉只有一个字符长度的词。如下:

vectorizer = CountVectorizer(min_df=1)

corpus = [
			'I am a boy',
			u'我 爱 北京 天安门'
		]
X = vectorizer.fit_transform(corpus)
feature_name = vectorizer.get_feature_names()

print feature_name

//结果是:[u'am', u'boy', u'\u5317\u4eac', u'\u5929\u5b89\u95e8']
//自动将‘I,a,我,爱’这些单个长度的词过滤掉了

在英文中单个长度的词往往属于停用词范围,所以过滤掉属于默认设置,对结果影响不大。可是在中文文本处理中,有一些单个长度的词,比如“爱”,“恨”都有着很明显的感情色彩。如果在做情感分析中,这些信息都十分重要。

为了不过滤单个词可以设置

vectorizer = CountVectorizer(min_df=1, token_pattern='(?u)\\b\\w+\\b')

上面提取的特征全部都是单个词,同样可以提取连词,如下:

bigram_vectorizer = CountVectorizer(ngram_range=(1, 2), token_pattern=r'(?u)\b\w+\b', min_df=1)
analyze = bigram_vectorizer.build_analyzer()
for f in analyze('我 爱 北京 天安门'):
	print f

//结果是:	 我
			爱
			北京
			天安门
			我 爱
			爱 北京
			北京 天安门

至于还有很多参数的配置,比如去除停用词这些,具体需要就具体看文档配置。

TfidfTransformer和TfidfVectorizer

具体来说,TfidfTransformer的作用已经不是在特征提取了,而是特征加权。 而文本特征权重的计算方法有许多,scikit-learn貌似也只提供了TF-TDF这一种。

关于TfidfTransformer给出的例程尤其简单,这里就不进行讲述。

TfidfVectorizer则是CountVectorizerTfidfTransformer的结合版本。

一般在文本特征处理过程中,本来正常的流程就是先用CountVectorizer来提取特征,然后就用TfidfTransformer来计算特征的权重。而TfidfVectorizer则是把两者的功能合在一起,连参数也都是两者的参数合在一起,所以可以方便的直接使用TfidfVectorizer。但是如果想在CountVectorizer来提取特征后想处理特征,比如降维之类的,这样直接使用TfidfVectorizer就不行了。关于文本特征的选择处理在博客学习sklearn之文本特征选择中有说明。

(完)

如果这篇文章对你很有帮助,你可以犒劳一下WO

打赏