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 ]])