TF-IDFを勉強し実装してみる

さっそく、文章検索等では古典的な手法であるTF-IDFを勉強してみることにしました。TF-IDFは、文章に含まれる単語の発生頻度(TF)と、比較対象全体の文章での単語のレア度(IDF)を乗じて、数値化できるようにしたものだそうです。文章の意味は機械は理解しないけれども、TF-IDFを使って多次元でベクトル化(後述)した膨大な学習データから近いものを選ぶというときに、それなりの精度が出せるという特徴があるとのことです。

学習データの例としては、以下のようなものを想定しています。質問と回答の1:1のデータを、1万点ほど集めるのが目標です。一人でデータを作ってるので、まだまだ不足してます。ユーザーの皆様からの、学習データ提供を募っています

LokSoundはアナログで動かせますか?

この文章を、まずは形態素解析に掛けて、”分かち書き”します。使ったのは、TinySegmenterという画期的に小さな形態素解析エンジンです。相当に有名なエンジンです。

LokSound|は|アナログ|で|動かせ|ますか|?

分かち書きすると、文章が単語ごとに分割されます。TinySegmenterは、精度はベストではないですが、処理スピードや軽量な点で、バランスが取れているので、このまま使っていこうと思ってます。

次に、この分かち書きしたデータから、Stop Words に該当する助詞・品詞を除去していきます。これは、”意味を成さない言葉”を排除して、学習データを軽量化するために使用します。”は”とか”で”とかは、単独では何も意味を成さないですし、TF-IDFでは、言葉のつながりの意味は無視するアルゴリズムなので、効率化のためにStop Words を使用して文章のスリム化を行います。

Stop Words には以下を選定しました。

だ|き|する|え|み|た|ど|ます|?|!|。|、|,|.|・|/|ある|あり|ん|ませ|が|の|を|に|へ|と|より|から|で|や|ば|と|ても|でも|から|ので|が|けれど|けれども|のに|て|で|し|ながら|たり|だり|なり|つつ|ものの|ところで|は|も|こそ|さえ|でも|だって|しか|ばかり|など|まで|だけ|ほど|きり|ぎり|くらい|ぐらい|なり|やら|か|だの|なんて|ずつ|とか|すら|な|なあ|や|よ|わ|こと|な|ぞ|ぜ|とも|か|の|ね|ねえ|さ|かしら|もの|ものか

StopWordに引っかかる分かち書きした単語は、完全一致で除去するように処理します。そうすると先ほどの言葉は以下のように変換されました。

LokSound,アナログ,動かせ,ますか

次にTFをこの文章に掛けます。単語の数は4つで、全て1つずつしか含まれないので以下のようになります。

LokSound :0.25
アナログ :0.25
動かせ :0.25
ますか :0.25

IDFは、全文章に探索を掛けます。以下のように、たくさんのDCCやオープンサウンドデータに関するFAQの質問文を用意して、IDFを求めます。

計算した結果は以下の通りです。

LokSound : 2.637608789400797
アナログ : 3.8903717578961645
動かせ : 3.8903717578961645
ますか : 2.504077396776274

“LokSound”というキーワードのIDFは2.63となり、実はこの値は、”オープンサウンドデータ”と同じくらいになってます。つまり、よく出てくる言葉で、あまり重要度は高くないという数値結果になってます。とはいえ、60個程度の文章では、レア度はそれほど大きく変化はありません・・・。

最後にTF-IDFという言葉通り、TFとIDFの数値を掛けます。

LokSound : 2.637608789400797*0.25=0.659402197
アナログ : 3.8903717578961645*0.25=0.972592939
動かせ : 3.8903717578961645*0.25=0.972592939
ますか : 2.504077396776274*0.25=0.626019349

という事で、TF-IDFのアルゴリズムは実装できたので、次は、文章のベクトル化と、文章同士の近さ(類似度)を数値で表現する、コサイン類似度を実装して、評価していきたいと思います。

ベクトル化は、2つの文章の単語を、それぞれTF-IDFして求めるものです。そのあと、cosΘが外積と内積で求まることを利用して、1に近いほど類似していると判定する仕組みです。

とりあえず、35文章に「LokSoundはDCC用ですが、アナログの模型にも使用できますか?」という文章を比較させたところ、以下のような類似度の数値が出ました。1.0に近い数値ほど、似ていると機械が判定していることになります。類似度をすべて計算し、ベスト4の文章を並べました。

“オープンサウンドデータはアナログで動かせますか?LokSound,ロックサウンド,ESU”
→類似度: 0.29020261213640164

“LokSoundはアナログで動かせますか?”
→類似度: 0.2723745578371107

“鉄道模型とは何ですか”
→類似度: 0.20578152752675852

“オープンサウンドデータは、ESU以外のメーカーのデコーダに書き込みできますか”
→類似度: 0.1706526228267105

この技術は、DCCやデジタル鉄道模型の自動サポートシステムに使用する予定です。つきましては、DCCに知見を持つ皆様からの、学習データ(質問と、その解答)の提供を心よりお待ちします。

学習用データの提供フォーム

タイトルとURLをコピーしました