文書の中で「どの単語が重要か」を、出現回数だけで決めると「です」「ます」のようなありふれた語ばかりが上位に来てしまいます。この問題を賢く解決するのがTF-IDFです。本記事では、TFとIDFという2つの部品の意味と計算の考え方をやさしく解説します。

📖 ひと言でいうと

TF-IDF(Term Frequency-Inverse Document Frequency)とは、「その文書での出現頻度(TF)」と「他の文書ではあまり使われない珍しさ(IDF)」を掛け合わせて、文書内の各単語の重要度を数値化する手法です。

例えるなら、単語の「その文書らしさ」を採点する仕組みです。どの文書にも出てくる語は、たくさん出てきても個性になりません。逆に、その文書に集中して現れる語こそが内容を特徴づけます。「よく出てくる、しかもここでしか出てこない」単語ほど高得点になるのがTF-IDFです。

🖼 1枚でわかるTF-IDF

TF-IDF(Term Frequency-Inverse Document Frequency)
  • 目的 — 文書内の単語の重要度を数値で評価する
  • TF — 単語の出現回数÷文書内の総単語数(文書内での頻度)
  • IDF — log(全文書数÷その単語を含む文書数)(珍しさ)
  • スコア — TF×IDF。ありふれた語は抑え、特徴的な語を浮き彫りに
  • 限界 — 語順・文脈は考慮しないため、同義語・多義語が苦手
つくもち屋「G検定対策」SUMMARY

📘 公式テキストの説明

テキストデータを数値化し、機械学習モデルで扱いやすくするための手法が多く存在する。その中でも、TF-IDF(Term Frequency-Inverse Document Frequency)は、文書内の単語の重要度を評価する基本的な手法として広く用いられている。TF-IDFは、各単語の出現頻度(TF)と、逆文書頻度(IDF)を組み合わせて算出される。TFは、特定の文書内での単語の出現回数を示し、頻度が高いほどその文書において重要とされる。一方、IDFは、コーパス全体における単語の出現頻度の逆数を取ったもので、一般的な単語よりも特定の文書にのみ現れる単語を高く評価する。これにより、TF-IDFは、文書全体で頻繁に出現する一般的な単語の影響を抑えつつ、特定の文書に特徴的な単語を浮き彫りにすることが可能となる。具体的な計算方法として、TFは「単語の出現回数」を「文書内の総単語数」で割った値で求められる。IDFは「全文書数」を「特定の単語を含む文書数」で割った値の対数を取ることで算出される。これらを掛け合わせることで、TF-IDF値が得られる。TF-IDFは、情報検索やテキスト分類など、多様な自然言語処理のタスクで活用されている。例えば、文書の特徴抽出や、文書間の類似度計算などにおいて、その有用性が認められている。Pythonなどのプログラミング言語では、scikit-learnライブラリのTfidfVectorizerクラスを用いることで、TF-IDFの計算を容易に実装することができる。ただし、TF-IDFにはいくつかの制約も存在する。例えば、単語の位置情報や文脈を考慮しないため、同義語や多義語の処理が難しい。また、文書の長さによってTF値が影響を受ける可能性があるため、適切な正規化が必要となる場合がある。これらの点を踏まえ、TF-IDFは自然言語処理の基本的な手法として理解しつつ、他の手法と組み合わせて活用することが望ましい。

長い説明ですが、構造は単純です。①TF=その文書の中でどれだけ頻繁に出るか、②IDF=コーパス(文書集合)全体でどれだけ珍しいか、③この2つの掛け算がTF-IDF値。あとは計算式(TF=出現回数÷総単語数、IDF=log(全文書数÷その単語を含む文書数))と、限界(文脈を見ない)を押さえれば完成です。

🔍 しっかり理解する

TF:その文書の中でよく出る単語は重要

TF(Term Frequency)は文書内での単語の出現頻度です。計算は「その単語の出現回数÷文書内の総単語数」。総単語数で割るのは、長い文書ほど出現回数が自然と増えてしまうのをならすためです。たとえば100語の記事に「ワクチン」が5回出てくれば、TF=5÷100=0.05です。ある文書で何度も使われる単語は、その文書の主題に関わっている可能性が高い——これがTFの発想です。

IDF:どの文書にもある単語は価値が低い

しかしTFだけでは、「です」「ます」「こと」のような、どんな文書にも大量に出てくる語が高スコアになってしまいます。そこでIDF(Inverse Document Frequency:逆文書頻度)の出番です。計算は「log(全文書数÷その単語を含む文書数)」。多くの文書に出てくる語ほど分母が大きくなり、値は小さくなります。極端な話、全文書に出てくる語はlog(1)=0となり、重要度への寄与がゼロになります。逆に、ごく一部の文書にしか出てこない語は高い値を持ちます。「珍しさ」に応じた重み付けです。

TFを計算
出現回数÷文書内の総単語数
IDFを計算
log(全文書数÷その単語を含む文書数)
掛け合わせる
TF-IDF値=TF×IDF
特徴語がわかる
検索・分類・類似度計算に利用

掛け算で「その文書ならではの単語」が浮かび上がる

TF-IDF=TF×IDFなので、高スコアになるのは「その文書ではよく出るのに、他の文書ではめったに出ない」単語です。各文書を「単語ごとのTF-IDF値を並べたベクトル」として表現すれば、機械学習モデルの入力(特徴量)になり、文書同士のベクトルの近さを測れば類似文書の検索もできます。情報検索、テキスト分類、文書の要約語(キーワード)抽出など、応用範囲は広く、Pythonではscikit-learnのTfidfVectorizerクラスで手軽に計算できます。

ただし限界もあります。TF-IDFは単語の位置や文脈をまったく見ないため、「車」と「自動車」が同じ意味だとはわかりませんし(同義語)、「金」が金属か金銭かも区別できません(多義語)。意味を捉えたい場面では、word2vecなどの分散表現や文脈依存モデルと組み合わせて使われます。

💡 具体例で考える

ニュース記事のキーワード抽出

1,000本のニュース記事があるとします。ある記事に「大谷翔平」が8回出てきて、この語を含む記事が全体で20本なら、TFもIDFも高く、TF-IDF値は大きくなります。一方「試合」は同じ記事に10回出てきても、スポーツ記事の大半に登場するためIDFが低く、スコアは伸びません。結果として「この記事は大谷翔平についての記事だ」という特徴づけが自動でできます。タグ付けや関連記事のレコメンドの土台になる、実務でも定番の使い方です。

数字で確かめる小さな計算例

全部で1,000文書のコーパスを考えます。ある100語の文書に「量子」が4回出現し、「量子」を含む文書が全体で10文書だとしましょう。TF=4÷100=0.04、IDF=log(1000÷10)=log(100)です。一方「情報」が同じ文書に10回出ても(TF=0.1)、1,000文書中900文書に出てくるならIDF=log(1000÷900)でほぼ0に近く、TF-IDF値は「量子」の方が大きくなります。出現回数では負けている「量子」が重要度で勝つ——これがTF-IDFの狙いどおりの動きです。

⚠️ よくある誤解・紛らわしい用語

💡 ポイント
  • BoW(Bag-of-Words)との違い — BoWは単語の出現回数をそのまま数えるだけで、どの文書にもある語も高い値になります。TF-IDFはIDFで「珍しさ」の重み付けを加えた発展形です。
  • IDFの向きに注意 — 「多くの文書に出る語ほどIDFは小さい(重要度が下がる)」が正しい向きです。逆に説明した誤答が作られやすいポイントです。
  • word2vecとの違い — TF-IDFは頻度統計に基づく重み付けで、単語の意味の近さは表現できません。意味をベクトル空間で捉えるのは分散表現(word2vecなど)の役割です。
  • 「TFは出現回数そのもの」ではない — 計算式上は総単語数で割った割合です。文書の長さの影響をならす正規化が入っている点も覚えておきましょう。

📝 試験でのポイント

💡 ポイント
  • 「TF=文書内での出現頻度」「IDF=単語の珍しさ(逆文書頻度)」「両者の掛け算で重要度を算出」という構造を選択肢から特定できるようにしましょう。
  • 計算式(TF=出現回数÷総単語数、IDF=log(全文書数÷その単語を含む文書数))の穴埋めや正誤判定が想定されます。
  • 「一般的な単語の影響を抑え、特定の文書に特徴的な単語を浮き彫りにする」という目的の記述が定番の正解パターンです。
  • 限界(語順・文脈を考慮しない、同義語・多義語が苦手)を問う出題や、BoW・単語埋め込みとの対比も要注意です。

📚 まとめ

💡 ポイント
  • TF-IDFは、文書内の単語の重要度をTF(文書内の出現頻度)とIDF(コーパス全体での珍しさ)の掛け算で評価する基本手法です。
  • ありふれた単語の影響を抑え、その文書に特徴的な単語を浮き彫りにできます。
  • 情報検索・テキスト分類・文書間の類似度計算などに広く使われ、scikit-learnで簡単に実装できます。
  • 語順や文脈は考慮しないため、同義語・多義語の扱いは苦手で、分散表現など他の手法と組み合わせて使われます。