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