Google検索について学んでいます。次に続く第2回目です。
Chatbot:Google検索の仕組みpython,TF-IDF,CosineSimilarity 1/3
次の文書に基づいています。
I.出現回数(Term Frequency)
ドキュメントは次の3つです。
document1 = [‘the’, ‘game’, ‘of’, ‘life’, ‘is’, ‘a’, ‘game’, ‘of’, ‘everlasting’, ‘learning’]
document2 = [‘the’, ‘unexamined’, ‘life’, ‘is’, ‘not’, ‘worth’, ‘living’]
document3 = [‘never’, ‘stop’, ‘learning.’]
文書はそのままでは集計できませんので、数的処理できるよう工夫します。
まず、単語にわけ、文書内の出現回数を数えます。
source:Tf-Idf and Cosine similarity
特定の語の出現数が多いほうが、その語について詳しく述べた文書だと思われるかもしれませんが、そうではありません。
ふつう、文書が長ければ長いほど語の出現数は多くなります。単に出現数だけを比較すれば、より長い文章の方が優先されることになります。
そこで、文書の総語数で割って、文書の長さに関係なく比較できるようにします。
例えば、Document1とDocument3にlearningが一度出現していますが、Document1の総語数は10語です。Document3の総語数は3語です。後者の方が、文書内でのlearningの重要度は高いと考えられます。
それぞれの語の出現回数を文書の総語数で割ると次のようになります。
source:Tf-Idf and Cosine similarity
文書の大きさを勘案したことで、各文書における語の重要度を適切に比較できえるようになりました。このようにデータを比較可能な数値に変換することを規格化(Normalization)と言います。
II: Inverse Document Frequency (IDF)
文書の総語数に対する語の出現回数を算出することで、どの文書でその語が多く出現しているのか比較することができるようになりました。
しかし、実際の検索ではあまり役立ちません。
例えば、”the life is worth living”という文で検索をかけたとき、ふつう、”the”や”is”は”life”と”living”ほど重要な単語ではないので、”life”と”living”に重点をおいて文書を見つけ出したいでしょう。
このような検索を可能にするためには、全ての語を同等に扱うのではなく、「重要な単語」は評価を高くし、「重要でない単語」は評価を低くする必要があります。
何を重要とするかの基準はいろいろ考えられますが、多くの文書で使われている語は重要度が低いとするのは簡単に計算できるよい方法です。
常識的にも、ほとんどの文書で含まれている語、日本語で言えば、「は」や「そして」、「しかし」などは情報量が低いです。だれもがよく言う「がんばります」や「こんにちは」で検索することはないでしょう。つまり、ありふれた語ほど情報量は少ないのです。
そこで、たくさんの文書で出現する語は評価を低く、あまり現れない語は評価を高くします。Inverse Document Frequencyでは、これを次の式で計算します。
IDF(game) = 1 + log(Total Number Of Documents / Number Of Documents with term game in it)
1は、文書数が少ない場合に極端に数値が小さくなるのを防ぐために加えられます。ですから、文書数が多い場合は不要です。たぶん、そうだと思います?
自然対数をとっています。私のようは数学が不得意は対数というと難しく感じますが、ここでは、文書数が多くなった時に極端に数字が大きくならないように調整しているとわかれば十分です。
したがって、多くの文書をチェックしてその語が含まれていないと数値が高くなりますが、文書数の増加と比べて、増加の割合はゆるやかです。
Pythonのライブラリmathで算出しましたので、比較してください。
III.TF×IDF
いろいろ説明していると混乱するかもしれませんが、”life learning”で検索をかけて関連文書を選び出す場合を考えています。
Iの出現回数(Term Frequency)だけでは、文の中でのその語の重要性を測るには不十分なので、TFにIIで算出したInverse Document Frequency (IDF)を乗じます。
例えば、lifeのTFは0.1、IDFは1.405507153ですから、 次の計算になります。
TF*IDF = は 0.1*1.40550715 = 0.140550715
lifeとlearningの各文書におけるTF*IDFは次のようになります。
source:Tf-Idf and Cosine similarity
これらの数値をベクトルとして扱い、ベルトル間の類似性を計算し、適切な文書を選び出します。これを実現するのがCosine Similarityですが、これについては次回に学びます。
Cosineというと三角関数ですが、数学が苦手な方は、もう無理という気分になるかもしれませんが、逆に三角関数ってこういうところに使われいるのだとわかって、数学に関心を持てるかもしれません。