sklearnのVectorizer

sklearnのVectorizerは文を渡して、それをベクトル化してくれるものですが、sklearnに含まれているCountVectorizerとTfidfVectorizer試してみる。
まずは、適当な文の配列を用意する。

$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> corpus = [
... 'aaa bbb ccc ddd eee',
... 'aaa bbb ccc ddd',
... 'aaa bbb ccc',
... 'aaa bbb ddd eee',
... 'aaa ddd eee'
... ]

まずは、単語数を数えて、それをベクトルに変換する。

>>> from sklearn.feature_extraction.text import CountVectorizer
>>> count_vect = CountVectorizer(min_df=1)

という感じで、CountVectorizerを生成する。
そして、先ほど作った文の配列をまるっと渡す。

>>> X_count = count_vect.fit_transform(corpus)

X_countとして結果が返ってきますが、中身を確認すると、

>>> print X_count.todense()
[[1 1 1 1 1]
 [1 1 1 1 0]
 [1 1 1 0 0]
 [1 1 0 1 1]
 [1 0 0 1 1]]

という感じで、単語数を数えて配列のベクトルが得られる。
ベクトルがどの単語に対応しているかは、get_feature_namesで得られる。

>>> count_vect.get_feature_names()
[u'aaa', u'bbb', u'ccc', u'ddd', u'eee']
>>> count_vect.vocabulary_.get('ddd')
3
>>> count_vect.vocabulary_.get('bbb')
1

新規の文をベクトルにする場合は

>>> count_vect.transform(['aaa ccc eee']).toarray()
array([[1, 0, 1, 0, 1]])

とすればOK。
TFIDFを用いて、同じようにベクトルを生成するためにはTfidfVectorizerを利用する。

>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> tfidf_vect = TfidfVectorizer()
>>> X_tfidf = tfidf_vect.fit_transform(corpus)
>>> print X_tfidf.todense()
[[ 0.3592933   0.42480021  0.5049742   0.42480021  0.5049742 ]
 [ 0.41626575  0.49215996  0.58504698  0.49215996  0.        ]
 [ 0.47818893  0.56537308  0.67207785  0.          0.        ]
 [ 0.41626575  0.49215996  0.          0.49215996  0.58504698]
 [ 0.47818893  0.          0.          0.56537308  0.67207785]]
>>> tfidf_vect.get_feature_names()
[u'aaa', u'bbb', u'ccc', u'ddd', u'eee']
>>> tfidf_vect.vocabulary_.get('ddd')
3
>>> tfidf_vect.vocabulary_.get('bbb')
1
>>> tfidf_vect.transform(['aaa ccc eee']).toarray()
array([[ 0.44943642,  0.        ,  0.6316672 ,  0.        ,  0.6316672 ]])