tf-idfとタームベクトル

勉強会の行くと各種のアルゴリズムの話が出るが、いつもなんとなくの理解になってしまっているので、一度ちゃんと知識にしておこう。
そんな訳で今日はtf-idfとかから。
ただWebから適当に集めると多すぎるので、お勉強として集合知インアクションからの抜粋が主です。

タームベクトル

用語整理
  • ターム(term):文書に現れる語
  • フレーズ:連続した複数のターム
タームベクトルって?

まず、文書を表現する時に用いる方法の一つにベクトル空間モデルってのがあります。文書中にたくさん出てくるタームに相対的に重み付けをします。タームベクトルってのは、その重み付けされたターム群のこと。なんとなくそういうのがわかると文書がどんな感じかなってのがわかりそうですよね。

重み付けってどうするのさ

さて、タームベクトルってのがなんとなーくわかったところで、肝心の重み付けって部分です。ここでtf-idfってアルゴリズムが出てきます。
そのまま書いてしまうと、

ターム頻度(tf)と逆頻出頻度(idf)の積

なんですが、僕らパンピーには簡単ではありません。
数式とかは無視して言葉だけで理解しようとするなら、
まずターム頻度ってのは単純にテキストの中にどれだけの頻度でその単語が出現するかってこと。まあ同じ単語がたくさん出てくればそのテキストとの関係は強いよねってこと。
ただ、例えばF1のフェラーリが大好きな僕がフェラーリの最近の記事から重要な用語を抽出しようとした時、おそらくブッチギリは「フェラーリ」でしょう。だって、もとからフェラーリで集めてるんだもん。その中から、「アロンソ」だとか「F2010」だとかのそんなにたくさん出てこない(いや、きっとたくさん出てるけどね。)語を目立たせるために必要なのがidfなんですね。

さて、idfってのをここ一週間のF1のフェラーリ関連の記事をn、その全文書の中から特定のターム(アロンソとか)が現れた回数をn_{i}とするとidfってのはこんな式になるらしい。
idf_{i} =  \log \left(\frac{n}{n_{i}}\right)
ちなみに全部の記事にアロンソが出てきた場合は\log\left(1\right)で0になっちゃいます。つまり、全部の記事に出てくる文書は僕にとっては重要な単語じゃないって事ですね。
まあ式自体は単純で、出現頻度が少ない程値は大きくなります。
そして、例えば今日のフェーラリのニューステキストの中から単語を全部抜き出して、それぞれの出現頻度(tf)を算出し、それぞれのidfとの積をとり一番大きい値になったのが今日のトップキーワードとなる訳ですね。

とはいいつつも

実際はidfを出すための情報もたくさん必要だし、ニューステキストから単語を抜き出してくるってのも一苦労なわけで。
もう少し知識だけ入れたら実際にプログラムにしてみよう。