##単語を特徴ベクトルに変換するとは
実際に文章の中に現れる単語を機械学習のアルゴリズムに渡すためには、それを数値に変換する必要があります。テキストを数値の特徴ベクトルに変換する方法として有名なものにBoWモデルがあり、今回はそれを使ってサクッと単語からベクトルを作ります。
##Bowモデルとは
BoWモデルとはBags-of-Wordsの略で、これ自体は
- 文章から単語(token)からなる語彙を作成
- 各文章での単語の出現回数を含んだ特徴ベクトルを生成する。
というシンプルなもの。
例えば「私は犬が好きです」「彼は犬が嫌いです」という二つの文章には「私」「彼」「好き」「嫌い」という単語はどちらか一つの文章にしか出現せず、「犬」「は」「が」「です」はどちらの文章にも登場しています。
['私', '彼', 'は', '犬', 'が', '好き', '嫌い', 'です']のそれぞれの単語が、ある文章について何回出現するかを数えると、
[[1, 0, 1, 1, 1, 1, 0, 1], [0, 1, 1, 1, 1, 0, 1, 1]]
となります。
この特徴ベクトルにおける値は単語の生の出現度と考えられ、tf(t, d)と表されます。
(これは後でtf-idfというモデルを考えるときにまた出てきます。)
また今回は短いかつ似たような単語で構成された文章なので0,1がバランス良く出ていますが、基本的には一つ一つの文章が長く、かつたくさんの文章が存在すれば単語の生の出現度は低くなり、ベクトルのほとんどが0となるため、この特徴ベクトルは「疎ベクトル」とも呼ばれます。
##Pythonで特徴ベクトルを作ってみる
では実際にpython3でこの特徴ベクトルを生成してみます。ここではnumpy, sckit-learnというpythonのライブラリを使用します。
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
def create_countvectorizer_from_texts(texts):
count = CountVectorizer()
docs = np.array(texts)
bags = count.fit_transform(docs)
print(bags.toarray())
print(count.vocabulary_)
texts = ["He likes to play the guitar", \
"She likes to play the piano", \
"He likes to play the guitar, and she likes to play the piano"]
create_countvectorizer_from_texts(texts)
これを実行すると、
$ python3 feature_vector_en.py
[[0 1 1 1 0 1 0 1 1]
[0 0 0 1 1 1 1 1 1]
[1 1 1 2 1 2 1 2 2]]
{'likes': 3, 'guitar': 1, 'to': 8, 'and': 0, 'she': 6, 'the': 7, 'piano': 4, 'play': 5, 'he': 2}
最初の多次元配列がこの特徴ベクトルであり、次のディクショナリをみるとそれぞれの単語がどれだけ出現しているかを見ることができます。
次はこの特徴ベクトルから単語の重み付けをどう変え、分類に使っていくかについてです。