TF-IDFを勉強して説明してみた


Googleで「TF-IDF」と検索し、表示された10件から分かったことをまとめました。その10件以外のページは(基本的には)読んでいません。


この記事を書くために検索したときは、以下の10件が表示されていました。

  1. tf-idf – Wikipedia
  2. 特徴抽出と TF-IDF – Qiita
  3. TF-IDFを使って企業紹介ページから各企業の特徴語を抽出してみた – Qiita
  4. TF-IDF Cos類似度推定法 – Qiita
  5. TF-IDFで文書内の単語の重み付け | takuti.me
  6. TF-IDF で文書をベクトル化。python の TfidfVectorizer を使ってみる | コード7区
  7. tf-idfとは – IT用語辞典 Weblio辞書
  8. TF-IDFと情報量(エントロピー)の関連性を計算する | Accel Brain; Media
  9. tf-idf法 – 技術メモ(仮)
  10. Atrae Tech Blog — 文章から特徴が分かる?TF-IDFについて

では、始めましょう。


TF-IDFの目的

TF-IDFは、文中に含まれる単語の特徴を算出する計算方法の1つです。TF-IDFを使用すると、特定の文にしか出現しない特徴的な単語を発見できます。また、少し応用すると、2つの文の類似度を算出することもできます。

元々は、人の考え方を機械でも再現しようとしているのだと思いますので、まずは人の考え方を確認しておきましょう。

上で紹介した記事10件のタイトルをご覧ください。4番目のタイトルだけに「Cos類似度推定法」と書かれていますね。私は、この記事だけ、ちょっと特別なことが書いてありそうだな、と考えました。私がこのように考えたのは、「Cos類似度推定法」という語句が、他の10件と比較して、非常に「特徴的」と感じることができたためです。

TF-IDFは、『「特徴的」と感じる単語』を、機械で計算するための方法とも言えるでしょう。

では、具体的に、どのような計算方法なのか紹介します。

TF-IDFの計算方法

tfとidfを計算して、その積を求めます。

文書は、$$d_1、d_2、d_3、…$$と存在し、単語は、$$t_1、t_2、t_3、…$$と存在することとします。

$$tf_{i,j} = {{文書d_jにおける単語t_iの出現回数} \over {\sum_{k}^{} {{文書d_jにおける単語t_kの出現回数}}}}$$

$$idf_i = \log { 総文書数 \over {単語t_iを含む文書数}}$$

$$\text{TF-IDF} = tf_{i,j} \times idf_i$$

tfは文書内での単語の重要性を表します。文書内で繰り返し登場する単語は数値が大きくなり「文書内で重要な単語」と解釈でき、文書内であまり登場しない単語は数値が小さくなり「文書内で些細な扱いの単語」と解釈できます。

idfは複数文書内での希少性を表します。複数文書内で希少な単語は数値が大きくなり「その文書を特徴づける単語」と解釈できます。

それでは、TF-IDFの意味を考えてみましょう。TF-IDFが大きくなる単語は、tfが大かつidfが大な単語です。このような単語は、1文書内で重要でその文書を特徴づける単語(=一部の文章で詳細に説明されている単語。つまり特徴的)と考えられます。

また、TF-IDFが小さくなる単語は、tfが小かつidfが小な単語です。このような単語は、1文書内であまり登場せず、複数文書内でも一般的に使われている(=取るに足らない単語)となります。

以上のことから、TF-IDFは『「特徴的」と感じる』という感覚を数値化したものと言えるでしょう。

応用例

文書に登場する単語1つ1つに対して、TF-IDFの値を計算します。

次に、文書に登場する単語のTF-IDFの値を「文書を特徴付けるベクトル」として捉えると、類似度の判定など様々な計算に応用できます。

具体例があったほうが分かりやすいため、以下のページから例を引用します。

WEB+DB PRESS (ウェブDBプレス) Vol.100「文書の表現」(P.30)をやってみた

出現単語:私, Ruby, Python, 好き, 機械学習

文書1:私はRubyとPythonではRubyが好きです
0.08, 0.44, 0.08, 0.08, 0.00

文書2:私は機械学習をしている
0.20, 0.00, 0.00, 0.00, 0.20

文書3:機械学習をするのでPythonが好きです
0.00, 0.00, 0.14, 0.14, 0.14

「0.08, 0.44, 0.08, 0.08, 0.00」を文書1を特徴付けるベクトルとして捉え、「0.20, 0.00, 0.00, 0.00, 0.20」を文書2を特徴付けるベクトルとして捉えるという考え方です。

Cos(コサイン)類似度の計算

文書の類似度を計算する計算方法の1つです。文書の類似度を計算するために、2つの文書を特徴付けるベクトルの内積を求めます。(途中説明を大幅に割愛して…)この内積の値の大小で、「文書を特徴付けるベクトル」が似ているかどうか(=文書が似ているかどうか)を表す指標にしようという考え方です。この値を、Cos類似度と呼びます。

上記の例の文書間のCos類似度を計算すると、以下のようになります。

文書1と文書2のCos類似度:$$0.08×0.20+0.44×0.00+0.08×0.00+0.08×0.00+0.00×0.20=0.016$$
文書1と文書3のCos類似度:$$0.08×0.00+0.44×0.00+0.08×0.14+0.08×0.14+0.00×0.14=0.0224$$
文書2と文書3のCos類似度:$$0.20×0.00+0.00×0.00+0.00×0.14+0.00×0.14+0.20×0.14=0.028$$

(「強いていえば」というレベルですが)文書2と文書3が最も類似しているということになりました。

その他の応用例

クラスタリングや文書要約、検索などのアルゴリズムでしばしば登場するようです。

プログラムによるTF-IDFの計算

TF-IDFは、有名で簡単な計算方法のようで、PythonとRubyでの実装例が紹介されていました。

言語 実装例
Python scikit-learnライブラリのTfidfVectorizerクラス
Ruby tf_idf.rb