TF-IDFとは?文書の重要度を数値化する仕組みをわかりやすく解説

自然言語処理の基本技術を学んで、テキストデータの理解を深めましょう。

はじめに

インターネット上には、ニュース記事、ブログ、SNSの投稿など、膨大な量のテキストデータが存在します。これらの情報の中から「特定の文書で、どの単語が特に重要か」を客観的に評価したいと考えたことはありませんか?

今回解説する「TF-IDF」は、まさにそのための技術です。TF-IDFは自然言語処理(NLP)や情報検索の分野で古くから使われている基本的な手法で、文書中に含まれる単語の重要度を数値化することができます。 この記事では、TF-IDFの仕組みから具体的な計算方法、活用例まで、初心者の方にも分かりやすく解説していきます。

TF-IDFの概要

TF-IDF(ティーエフ・アイディーエフ)は、Term Frequency – Inverse Document Frequency の略です。 その名の通り、「TF」と「IDF」という2つの指標を掛け合わせることで、単語の重要度を算出します。

TF-IDFの基本的な考え方:
ある文書内でたくさん出現するけれど、他の多くの文書ではあまり出現しない単語は、その文書を特徴づける重要な単語である。

この考え方を実現するために、「TF」と「IDF」がそれぞれ以下の役割を担っています。

  • TF (Term Frequency): ある文書内での単語の出現頻度。
  • IDF (Inverse Document Frequency): ある単語が、どれだけ多くの文書で使われているか(レア度)。

それでは、それぞれを詳しく見ていきましょう。

TF (Term Frequency) とは?

TFは「単語の出現頻度」を意味し、特定の文書の中で、ある単語がどれくらいの割合で出現するかを示します。 ある単語が文書内で何度も使われていれば、その文書にとって重要である可能性が高い、という考え方に基づいています。

計算式は以下の通りです。

TF (t, d) = (文書dにおける単語tの出現回数) / (文書dの総単語数)

計算例

例えば、以下のような短い文書があったとします。

「私はリンゴが好きです。私の家にはリンゴがたくさんあります。」

この文書の総単語数は12語です。(読点や句点も1語とカウントする場合)
この中で「リンゴ」という単語は2回出現しています。したがって、「リンゴ」のTF値は以下のようになります。

TF(“リンゴ”) = 2 / 12 ≈ 0.167

IDF (Inverse Document Frequency) とは?

IDFは「逆文書頻度」と訳され、ある単語がどれだけ珍しいか、つまり「レア度」を示す指標です。 「です」「ます」や「私」のような、どの文書にも頻繁に登場する一般的な単語は、特定の文書の特徴を表す上では重要度が低いと考えられます。 IDFは、そうした単語の重みを下げる役割を果たします。

IDFは、その単語が出現する文書が少ないほど値が大きくなります。 計算式は以下の通りです。

IDF (t) = log( 全文書数 / (単語tが出現した文書数 + 1) )

※ 分母に1を加えるのは、ある単語が出現する文書数が0になるのを防ぐ(ゼロ除算エラーの回避)ためです。対数(log)を取るのは、値のスケールを調整し、値が急激に大きくなりすぎるのを防ぐためです。

計算例

全部で100件の文書があるとします。

  • リンゴ」という単語が、10件の文書に出現した場合:
    IDF(“リンゴ”) = log(100 / (10 + 1)) ≈ log(9.09) ≈ 0.958
  • です」という単語が、90件の文書に出現した場合:
    IDF(“です”) = log(100 / (90 + 1)) ≈ log(1.09) ≈ 0.037

このように、出現する文書が少ない「リンゴ」の方が、多くの文書で使われる「です」よりもIDF値が高くなり、より重要な単語として扱われることがわかります。

TF-IDFスコアの計算と活用例

計算方法

最終的なTF-IDFスコアは、これまで計算したTF値とIDF値を単純に掛け合わせることで求められます。

TF-IDF (t, d) = TF (t, d) * IDF (t)

この計算により、「ある文書d内での単語tの重要度」を数値化できます。このスコアが高いほど、その単語は「その文書を特徴づける重要な単語」であると判断できます。

活用例

TF-IDFは、そのシンプルさと有効性から、様々な分野で応用されています。

活用分野概要
検索エンジン ユーザーが入力した検索クエリと関連性の高いWebページを順位付けするために利用されます。初期の検索エンジンにおける重要な技術の一つでした。
キーワード抽出 ニュース記事や論文から、内容を代表する重要なキーワードを自動的に抜き出すことができます。
文書分類・クラスタリング 文書をTF-IDFを用いてベクトル化し、機械学習モデルに入力することで、「スポーツ」「経済」「政治」などのカテゴリに自動で分類します。
文書の類似度計算 二つの文書のTF-IDFベクトルを比較することで、内容がどれだけ似ているかを数値化できます。 類似記事の推薦などに活用されます。

Python (scikit-learn)での実装例

Pythonの機械学習ライブラリである`scikit-learn`を使えば、TF-IDFを簡単に計算できます。

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
# 分析対象の文書
documents = [ 'リンゴは赤くて美味しい果物です。', 'バナナは黄色くて甘い果物です。', '今日の夕食は美味しいカレーライスです。'
]
# TfidfVectorizerのインスタンスを作成
# 日本語を扱うため、事前にMecab等で分かち書きしておくことが望ましいですが、
# ここでは簡易的に文字単位(char)で分析します。
vectorizer = TfidfVectorizer(analyzer='char_wb', ngram_range=(2,2))
# TF-IDFを計算
tfidf_matrix = vectorizer.fit_transform(documents)
# 結果をデータフレームで表示
feature_names = vectorizer.get_feature_names_out()
df_tfidf = pd.DataFrame(tfidf_matrix.toarray(), columns=feature_names, index=['文書1', '文書2', '文書3'])
print(df_tfidf.round(2))

このコードは、文書群から単語(ここでは文字の組み合わせ)のTF-IDF値を算出し、どの単語が各文書で重要視されているかを行列として表示します。

TF-IDFの限界と発展

TF-IDFは強力な手法ですが、いくつかの弱点も存在します。

  • 単語の意味や文脈を考慮できない: 「Apple(企業名)」と「apple(果物)」を区別できません。また、「犬が人を噛んだ」と「人が犬を噛んだ」を同じように扱ってしまいます。
  • 単語の出現順序を無視する: 文章の構造やニュアンスを捉えることができません。
  • 表記揺れに弱い: 「コンピュータ」と「コンピューター」を別の単語として認識してしまいます。

これらの課題を克服するため、近年ではWord2VecBERTといった、単語の意味や文脈をベクトルで表現する、より高度な分散表現モデルが開発され、主流となりつつあります。

しかし、TF-IDFはそのシンプルさ、計算の速さ、そして解釈のしやすさから、今でも多くの場面でベースラインモデルとして、あるいは大規模データの前処理段階で有効な手法として活用されています。

まとめ

TF-IDFは、文書中の単語の重要度を「文書内での出現頻度(TF)」と「文書全体での珍しさ(IDF)」の2つの観点から評価する、シンプルかつ効果的な手法です。

検索エンジンや文書分類など、様々な応用先があり、自然言語処理を学ぶ上で欠かせない基礎知識の一つです。より高度な技術が登場した現在でも、その価値は失われていません。この機会にぜひ、TF-IDFの考え方をマスターしてみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です