ホーム  >   ブログ  >   TF-IDFで文書内の単語の重み付け

2014-01-25

TF-IDFで文書内の単語の重み付け

  寄付で活動を支援する   一杯のコーヒーを贈る

このエントリーをはてなブックマークに追加

『いくつかの文書があったとき、それぞれの文書を特徴付ける単語はどれだろう?』こんなときに使われるのがTF-IDFという値。

TFはTerm Frequencyで、それぞれの単語の文書内での出現頻度を表します。たくさん出てくる単語ほど重要!

$\textrm{tf}(t,d)$
文書 $d$ 内のある単語 $t$ のTF値

$n_{t,d}$
ある単語 $t$ の文書 $d$ 内での出現回数

$\sum_{s \in d} n_{s,d}$
文書$d$内のすべての単語の出現回数の和

IDFはInverse Document Frequencyで、それぞれの単語がいくつの文書内で共通して使われているかを表します。いくつもの文書で横断的に使われている単語はそんなに重要じゃない!

$\textrm{idf}(t)$
ある単語 $t$ のIDF値

$N$
全文書数

$\textrm{df}(t)$
ある単語 $t$ が出現する文書の数

対数をとっているのは、文書数の規模に応じた値の変化を小さくするためなんだとか。

この2つの値を掛けたものをそれぞれの単語の重みにすれば、その値が大きいほど各文書を特徴付ける単語だと言えるんじゃないか、という話。

例えば10日分のアメリカ旅行の日記で全体を通して「アメリカ」という単語が多く登場していてもそれは当然のこと。1日目の日記を特徴づけるのは「飛行機」であって欲しいし、2日目は「ハンバーガー」であって欲しいわけです。

頻出する単語だからその文書を特徴付ける単語になる!とは限らない。そこでTF-IDFの登場。

具体例で見てみる

具体的な例として以下の記事を参考に、2つの文書『リンゴとレモンとレモン』(文書A)と『リンゴとミカン』(文書B)を考えます。

フツーって言うなぁ! Pythonでtf-idf法を実装してみた

形態素解析を行うとき、特徴語になり得るのは名詞だけだと仮定して、それ以外の品詞は無視します。つまり文書Aは [リンゴ, レモン, レモン] 、文書Bは [リンゴ, ミカン] という単語の集合。

$\textrm{tf}(\textrm{リンゴ}, \textrm{文書A}) = \frac{1}{3} = 0.33$

$\textrm{tf}(\textrm{レモン}, \textrm{文書A}) = \frac{2}{3} = 0.66$


 
$\textrm{tf}(\textrm{リンゴ}, \textrm{文書B}) = \frac{1}{2} = 0.5$

$\textrm{tf}(\textrm{ミカン}, \textrm{文書B}) = \frac{1}{2} = 0.5$

 
$\textrm{idf}(\textrm{リンゴ}) = \log{\frac{2}{2}} + 1 = 1$

$\textrm{idf}(\textrm{レモン}) = \log{\frac{2}{1}} + 1 = 1.3$

$\textrm{idf}(\textrm{ミカン}) = \log{\frac{2}{1}} + 1 = 1.3$

すると上記のようにTF値とIDF値がそれぞれ計算できて、積を求めれば、

$\textrm{tf}(\textrm{リンゴ}, \textrm{文書A}) * \textrm{idf}(\textrm{リンゴ}) = 0.33$
$\textrm{tf}(\textrm{レモン}, \textrm{文書A})*\textrm{idf}(\textrm{レモン}) = 0.858$

$\textrm{tf}(\textrm{リンゴ}, \textrm{文書B})*\textrm{idf}(\textrm{リンゴ}) = 0.5$
$\textrm{tf}(\textrm{ミカン}, \textrm{文書B})*\textrm{idf}(\textrm{ミカン}) = 0.65$

両方の文書に登場している「リンゴ」という単語は、片方にしか登場していない「レモン」や「ミカン」よりも特徴語としての重みは小さいことが数値的に分かります。

実装はRubyです。

tf_idf.rb

参考

徳永, "情報検索と言語処理", 東京大学出版会, pp. 27-28, 1999.

  シェアする

このエントリーをはてなブックマークに追加

  カテゴリ

プログラミング 自然言語処理

  あわせて読みたい

2017-06-04
Q&Aサイトにおける質問推薦、そして Incremental Probabilistic Latent Semantic Analysis
2013-10-29
「知の逆転」を読んだ
2013-07-29
はてなキーワードを使ってigo-ruby(MeCab)用の辞書をナウい感じにする

  もっと見る

最終更新日: 2022-01-18

  書いた人: たくち

たくちです。長野県出身、カナダ・バンクーバー在住のソフトウェアエンジニア。これまでB2B/B2Cの各領域で、Web技術・データサイエンス・機械学習のプロダクト化および顧客への導入支援・コンサルティング、そして関連分野のエバンジェリズムに携わってきました。現在はフリーランスとして活動を続けつつ、アフリカ・マラウイにて1年間の国際ボランティアに従事中。詳しい経歴はレジュメ を参照ください。いろいろなまちを走って、時に自然と戯れながら、その時間その場所の「日常」を生きています。ご意見・ご感想およびお仕事のご相談は [email protected] まで。

  寄付で活動を支援する   一杯のコーヒーを贈る

  免責事項

  • Amazonのアソシエイトとして、当サイトは amazon.co.jp 上の適格販売により収入を得ています。
  • 当サイトおよび関連するメディア上での発言はすべて私個人の見解であり、所属する(あるいは過去に所属した)組織のいかなる見解を代表するものでもありません。
  • 当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、個人ブログという性質上、誤情報や客観性を欠いた意見が入り込んでいることもございます。いかなる場合でも、当サイトおよびリンク先に掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。
  • その他、記事の内容や掲載画像などに問題がございましたら、直接メールでご連絡ください。確認の後、対応させていただきます。