この間記事に書いた自然言語の前処理の記事の続きとしてベクトライズを行いたいと思います。
https://qiita.com/fumifumitaro/items/c613d033ebc94c5e608d
ベクトライズとは
文書をベクトルで表現することです。
コンピューターで単語をそのままの意味で読み込むことができないので、
ベクトルに直してあげて、そのベクトルからコンピューターでは解釈を行います。
「王」-「男」+「女」≒「女王」
ベクトル表現で上記のような計算式に基づいて単語関係を割り出すことが可能だったりします。
TfidfVectorizerとは
今回行うTfidfVectorizerとは、TFとIDFの二つの指標に基づいてベクトル化を行うことを指します。
細かい説明は別に譲りますがざっくりこの二つを説明します。
TF (Term Frequency)
直訳すると単語の出現頻度となります。
つまり文章中にその単語がどのくらい出てくるかを表す指標となります。
IDF (Inverse Document Frequency)
こちらの直訳は単語が文書にてどのぐらい出てこないかという感じですかね。
単語の出現頻度が低いほどレア度が高いということでこちらの指標は高くなります。
上記二つを掛け合わせたものがTF-IDFとなります。
つまり、
単語の出現頻度 × 単語のレア度
を計算するのがTfidfVectorizerの役割です。
やってみよう
前回書いた記事で前処理した結果を使っています。
# TfidfVectorizerのインスタンス化
vectorizer = TfidfVectorizer(max_features=1000)
# fit_transformメソッドにてベクトライズ実行、本来リストを渡すのですが今は一文でのテストのため[]づけで代入
tf_idfs = vectorizer.fit_transform([sentence]).toarray()
print(tf_idfs)
# [0.10259784 0.41039134 0.10259784 0.10259784 0.10259784 0.10259784
# 0.10259784 0.10259784 0.20519567 0.10259784 0.10259784 0.10259784
# 0.10259784 0.10259784 0.10259784 0.10259784 0.10259784 0.30779351
# 0.10259784 0.10259784 0.10259784 0.10259784 0.20519567 0.10259784
# 0.10259784 0.10259784 0.10259784 0.10259784 0.10259784 0.10259784
# 0.10259784 0.10259784 0.20519567 0.10259784 0.10259784 0.10259784
# 0.10259784 0.10259784 0.10259784 0.20519567 0.10259784 0.10259784
# 0.10259784 0.10259784 0.10259784 0.10259784 0.10259784 0.10259784
# 0.10259784 0.10259784 0.10259784 0.10259784 0.10259784 0.10259784
# 0.10259784 0.10259784 0.10259784 0.10259784 0.10259784 0.10259784]
実は一瞬です。
ほとんどの項目をTfidfVectorizerがやってくれていますので。
ベクトルにはなりましたがこれだとよくわからないので整形して
以下に結果を表示します。
# データフレームに格納
tf_idfs = pd.DataFrame(tf_idfs)
# 読み取った単語をカラムとして入力、インスタンス化したvectorizerが単語を保存してくれています(お利口さん!)
tf_idfs.columns = vectorizer.get_feature_names()
print(tf_idfs.dict())
以下が出力結果
{'beside': {0: 0.10259783520851541},
'billie': {0: 0.41039134083406165},
'body': {0: 0.10259783520851541},
'broncho': {0: 0.10259783520851541},
'bunch': {0: 0.10259783520851541},
'carefully': {0: 0.10259783520851541},
'cattle': {0: 0.10259783520851541},
'certain': {0: 0.10259783520851541},
'city': {0: 0.20519567041703082},
'closely': {0: 0.10259783520851541},
'comment': {0: 0.10259783520851541},
'connects': {0: 0.10259783520851541},
'country': {0: 0.10259783520851541},
'couple': {0: 0.10259783520851541},
'cowpuncher': {0: 0.10259783520851541},
'crowd': {0: 0.10259783520851541},
'del': {0: 0.10259783520851541},
'donald': {0: 0.30779350562554625},
'expectant': {0: 0.10259783520851541},
'field': {0: 0.10259783520851541},
'fifty': {0: 0.10259783520851541},
'gazing': {0: 0.10259783520851541},
'glass': {0: 0.20519567041703082},
'goat': {0: 0.10259783520851541},
'halted': {0: 0.10259783520851541},
'hand': {0: 0.10259783520851541},
'handed': {0: 0.10259783520851541},
'horseman': {0: 0.10259783520851541},
'inspected': {0: 0.10259783520851541},
'let': {0: 0.10259783520851541},
'like': {0: 0.10259783520851541},
'little': {0: 0.10259783520851541},
'look': {0: 0.20519567041703082},
'make': {0: 0.10259783520851541},
'maybe': {0: 0.10259783520851541},
'mexico': {0: 0.10259783520851541},
'minute': {0: 0.10259783520851541},
'monte': {0: 0.10259783520851541},
'number': {0: 0.10259783520851541},
'pachuca': {0: 0.20519567041703082},
'plain': {0: 0.10259783520851541},
'quesco': {0: 0.10259783520851541},
'railroad': {0: 0.10259783520851541},
'reached': {0: 0.10259783520851541},
'real': {0: 0.10259783520851541},
'rider': {0: 0.10259783520851541},
'river': {0: 0.10259783520851541},
'scrutinized': {0: 0.10259783520851541},
'soldier': {0: 0.10259783520851541},
'stood': {0: 0.10259783520851541},
'summit': {0: 0.10259783520851541},
'thought': {0: 0.10259783520851541},
'twenty': {0: 0.10259783520851541},
'upon': {0: 0.10259783520851541},
'vaquero': {0: 0.10259783520851541},
'way': {0: 0.10259783520851541},
'wind': {0: 0.10259783520851541},
'without': {0: 0.10259783520851541},
'word': {0: 0.10259783520851541},
'would': {0: 0.10259783520851541}}
以上です、記事を読んでいただいた方々ありがとうございました。
参考になれば幸いです。