TF-IDF (Term Frequency – Inverse Document Frequency)
1. 概要
A. 定義
文書集合(コーパス)の中である単語が特定の文書をどれだけよく代表するかを数値化する重み付け手法である。一つの文書で頻繁に出現し(TF)、文書全体では稀にしか出現しない(IDF)単語ほど高い重みを与える。
TF-IDFは、情報検索(IR)とテキストマイニングにおいて文書を数値ベクトルへ変換するために考案された、古典的でありながら今なお強力な重み算定方式である。コンピュータは自然言語の文をそのまま扱えないため、各単語に「この単語がこの文書でどれだけ重要か」を表す実数値を与え、文書をベクトル空間の一点として表現しなければならない。TF-IDFはこの値を文書内部の頻度(局所情報)とコーパス全体での希少性(大域情報)という異なる二つの軸の積で決める点において、単純な頻度計算と決定的に区別される。
B. 登場背景と必要性
文書をベクトルで表現する最も単純な方法は、単語の出現頻度をそのまま数えるBoW(Bag-of-Words)モデルである。しかしこの方式は致命的な歪みを生む。英語の「the/of/and」や日本語の助詞「は・が・の」のようなストップワード(stopword)はほとんどすべての文書に大量に出現するため、頻度だけで見るとこうしたありふれた単語がまるで文書を代表する重要語のように見えてしまう。実際にはこうした単語こそ文書を区別するうえで何の情報も持たないにもかかわらずである。
TF-IDFはこの問題を「多くの文書にあまねく現れるありふれた単語は弁別力がない」という明快な直観で解決する。すべての文書に均等に現れる単語は特定の文書を他の文書と区別するのに役立たないためIDFで重みを削り、逆に特定の文書だけに集中して現れる単語には大きな重みを乗せる。その結果、各文書を特徴づける特徴語(keyword)が自然に浮かび上がる。計算が単純で速く、結果を人が直観的に解釈できるという利点により、TF-IDFは検索エンジンのランキング、文書分類、キーワード抽出、推薦の長年の標準手法として定着した。
C. 主な活用分野
TF-IDFは文書を特徴語ベクトルへ変える汎用の前処理であるため、活用範囲が広い。検索エンジンはクエリ語のTF-IDFスコアの和で文書順位を付け、文書分類・スパムフィルタはこのベクトルをナイーブベイズ・SVMのような分類器の入力特徴として使う。キーワード・タグの自動抽出は文書からTF-IDF上位の単語を取り出して要約タグとして提示し、コンテンツベース推薦は文書間のコサイン類似度で「似た記事」を探す。このように一つの重み算式が検索・分類・抽出・推薦を貫く共通基盤となる点が、TF-IDFの持続的な生命力を説明する。
この手法が1970年代以降、情報検索の事実上の標準となった背景には「重要度を学習なしに統計だけで近似できる」という実用性がある。ディープラーニング以前の時代には大規模な学習データも計算資源も不足していたため、単語の重要度を別途のモデル学習なしに頻度集計だけで算出するTF-IDFは非常に魅力的な選択肢であった。また結果が「この文書でこの単語がなぜ重要か」を頻度と希少性という二つの数字で説明できるため、検索結果の根拠を求める実務環境によく合った。こうした透明性と軽量性は、今日でもTF-IDFを廃棄させない核心的な理由である。
2. 構成要素と計算式
TF-IDFは二つの要素の積で定義され、各項が異なる方向から単語の重要度を調整する。以下の概念図は、二つの軸がどのように結合して最終的な重みと文書ベクトルを作るかの全体構造を示す。
flowchart LR
subgraph local["局所情報"]
T1["文書d内の単語tの頻度"] --> T2["TF正規化·ログスケール"]
end
subgraph global["大域情報"]
D1["単語tが出た文書数df"] --> D2["IDF = log(N/df)"]
end
T2 --> W["TF-IDF = TF × IDF"]
D2 --> W
W --> VEC["文書別の単語重みベクトル"]
VEC --> USE["類似度·ランキング·分類"]
各項の定義と直観的な意味は次のとおりである。TF(Term Frequency)は一つの文書の中で単語がどれだけ頻繁に使われたかを測る局所的重要度である。IDF(Inverse Document Frequency)はその単語がコーパス全体でどれだけ希少かを測る大域的弁別力であり、Nを全文書数、df(t)を単語tが出現した文書数とすると、IDF(t) = log(N / df(t))で定義される。最終的な重みはこの二つの積である。
| 項目 | 定義 | 直観的意味 |
|---|---|---|
| TF(t,d) | 文書dにおける単語tの出現頻度(または正規化頻度) | この文書でどれだけ頻繁に使われたか → 局所的重要度 |
| IDF(t) | log( N / df(t) )、N=全文書数、df=tが出現した文書数 | コーパス全体でどれだけ希少か → 弁別力 |
| TF-IDF | TF(t,d) × IDF(t) | 局所頻度 × 大域希少度 |
IDFにログをかける理由は二つある。第一に、N/dfは文書数が多いとき過度に大きくなるため、ログでその増加を緩やかに抑えてTFとスケールの均衡を取る。第二に、単語がありふれるほど(df↑)値が滑らかに小さくなり、すべての文書に出れば(df=N)log 1 = 0となって弁別力のない単語の重みが自然に0へ消去される。
二つの項を足さずに掛ける理由も原理から出る。特徴語になるには「この文書で頻繁に出ながら(TFが高い)同時に他の文書では稀でなければならない(IDFが高い)」。二つのうちどちらかでも0に近ければ特徴語としての価値がないため、二つの条件を同時に満たすときにのみ大きな値が出る掛け算が論理的に正しい。足し算なら一方が0でも他方の値がそのまま残り「ありふれているがこの文書に多く出た単語」が過大評価される問題が生じる。
実務ではいくつかの変形が使われる。TFには頻度をそのまま使わず、ログスケーリング(1 + log TF)や最大頻度に対する正規化を適用する場合が多い。同じ単語が3回出たからといって1回出た文書より正確に3倍重要とは見なしにくいため、頻度の限界効用逓減(飽和)を反映するためである。IDFにもdfが0のときの分母爆発を防ぐため分母に1を足す平滑化(smoothing)、すなわちlog(N / (1 + df)) + 1の形の変形が広く使われる。scikit-learnのTfidfVectorizerが既定で採用したのもまさにこの平滑化・正規化変形であり、実装ごとに細部の式が少しずつ異なるため、値の絶対的な大きさより相対的な順位に意味を置くのが安全である。
3. 計算過程(例)
計算はTFとIDFをそれぞれ求めたうえで掛ける単純な流れである。以下のプロセス図は、生のコーパスから最終的な重みベクトルまでの段階を詳細に示す。
flowchart TD
P0["生のコーパス"] --> P1["前処理: トークン化·ストップワード除去·語幹抽出"]
P1 --> P2["文書別のTF計算"]
P1 --> P3["単語別のdf集計 → IDF = log(N/df)"]
P2 --> P4["TF-IDF = TF × IDF"]
P3 --> P4
P4 --> P5["文書 = 単語重みベクトル"]
P5 --> P6["コサイン類似度·クエリマッチング"]
前処理段階が結果の品質を左右する点をまず強調しておく。トークン化で文を単語単位に切り、ストップワードを除去し、語幹・見出し語抽出で活用形を一つに統一したうえでこそ、TF・dfの集計が意味を持つ。この段階が不十分だと「走る/走った/走れ」が互いに異なる単語として数えられ、同じ意味の頻度が散らばり、その分だけ特徴語の重みが低く評価される。
具体的な数値で原理を確認しよう。全文書がN=3個であり、単語「AI」がこのうち2個の文書に出現(df=2)する状況を仮定する。
- IDF(AI) = log(3/2) = log(1.5) ≈ 0.176(底を10とした常用対数を基準。問題でlog値が与えられればそのまま使う。)
- 文書1で「AI」が3回出現(TF=3)したなら → TF-IDF = 3 × 0.176 ≈ 0.528
- 同じ文書1で「そして」のようなストップワードが5回出たが三つの文書すべてに出現(df=3)するなら → IDF = log(3/3) = log 1 = 0、したがってTF-IDF = 5 × 0 = 0
この対比がTF-IDFの核心を露わにする。頻度がより高いストップワード(「そして」、TF=5)の重みが0になり、頻度の低い特徴語(「AI」、TF=3)の重みが0.528として生き残る。まさに「ありふれた単語は特徴語ではない」という原理が式として実装される地点である。もしある単語が三つの文書のうち一つの文書だけに出れば(df=1)IDF = log(3/1) = log 3 ≈ 0.477で最大の弁別力を得る。このようにdfが小さいほど(希少なほど)IDFが大きくなり、dfがNに近いほど(ありふれているほど)IDFが0へ収束する単調減少の関係が成り立つ。
このように各文書を単語別のTF-IDF値のベクトルで表現すれば、二つの文書ベクトルがなす角度で類似度を測るコサイン類似度や、クエリ語ベクトルと文書ベクトルの内積で計算するクエリ-文書マッチングスコアを算出できる。コサイン類似度を使う理由は文書長の影響を除くためである。単純な内積は長い文書ほど値が大きくなるが、ベクトルを正規化したうえで角度だけを見れば「どれだけ同じ方向を指しているか」、すなわち単語構成の類似性だけを純粋に比較できる。検索エンジンがクエリに対して文書を順位付けし、ニュースクラスタリングが似た記事をまとめ、推薦システムが類似文書を探す基本原理は、すべてこのベクトル-類似度計算に根ざしている。
4. 特徴と限界、代替
TF-IDFの強みは学習が不要な統計的方式であるため計算が軽く速く、各単語の重みがなぜそうなったかを人が解釈できる点にある。しかし根本的な限界は、単語を互いに独立した原子的記号としてのみ扱うため意味(semantics)をまったく理解できない点である。
| 区分 | 内容 | 理由 |
|---|---|---|
| 長所 | 単純·高速、解釈容易、特徴語抽出効果 | 統計的頻度ベースで学習不要 |
| 限界 | 意味·文脈·語順を反映しない | 単語を原子的トークンとしてのみ扱う |
| 限界 | 同義語·多義語を処理できない | 「車」と「自動車」を別の単語と見る |
| 限界 | 高次元の疎(sparse)ベクトル | 語彙数だけ次元、ほとんど0 |
| 代替 | Word2Vec·BERTなどの埋め込み | 文脈·意味を密ベクトルで学習 |
たとえば「川の橋」の「はし」と「箸を持つ」の「はし」はまったく異なる意味だが、TF-IDFは綴りが同じという理由で完全に同じ単語として扱い文脈を区別できない(多義語の問題)。逆に「自動車」と「車」は事実上同じ意味であるのに別の単語として扱い、類似度を正しく捉えられない(同義語の問題)。また「猫が鼠を追った」と「鼠が猫を追った」は単語構成が同じためTF-IDFベクトルが同一だが意味は正反対である。これはTF-IDFが語順(word order)と文構造を完全に無視するという根本的限界を露わにする。
また語彙辞書の大きさだけベクトル次元が大きくなるが、一つの文書にはそのうちごく一部の単語しか現れないため、ほとんどの要素が0の高次元の疎ベクトル(sparse vector)が作られ、メモリ・計算効率が落ちる。数万〜数十万次元のベクトルで実際に値のある要素は数百個に過ぎないことが多い。こうした意味・文脈・次元の問題を克服するため、単語を数百次元の低次元の密ベクトル(dense vector)として学習し意味の近い単語どうしをベクトル空間で近くに配置する埋め込み(Word2Vec, GloVe)と、文脈に応じて同じ単語も異なるベクトルで表現する文脈埋め込み(BERT, トランスフォーマー)が登場した。
5. 深化:BM25とRAGハイブリッド検索
TF-IDFは古びた手法のように見えるが、その直系の子孫と派生手法は今なお最前線で使われている。最も代表的なのがBM25(Okapi BM25)である。BM25はTFの無限増加を防ぐ頻度飽和(term frequency saturation)項と、長い文書が単に長いという理由で有利にならないようにする文書長正規化を導入してTF-IDFの弱点を精緻に補った。このおかげでBM25はElasticsearch・OpenSearch・Luceneのような主流検索エンジンの既定のランキング関数として採用されており、多くの情報検索ベンチマークで純粋な頻度ベース手法の強力な基準線(baseline)の役割を果たす。
BM25には二つの調整パラメータがある。頻度飽和の度合いを定めるk₁(通常1.2〜2.0)と、文書長正規化の強度を定めるb(通常0.75)である。k₁が大きいほど単語が複数回出たときの追加の重みが長く保たれ、bが1に近いほど文書長に対する罰点が強くなる。このようにTF-IDFが固定の掛け算式であったのと違い、BM25はコーパスの特性に合わせてランキング挙動を調律できる点が実務採用の大きな理由である。
近年、生成AIのRAG(Retrieval-Augmented Generation)パイプラインでTF-IDF/BM25系が再び注目を集めている。意味ベースのベクトル(埋め込み)検索は同義語・文脈をよく捉えるが固有名詞・製品コード・数字のような正確なキーワードマッチングには弱く、逆にBM25はキーワードマッチングに強いが意味を知らない。たとえばユーザーが「エラーコード ORA-00942」をクエリすると埋め込み検索は「データベースエラー」のような類似意味の文書へ漂流しうるが、BM25は正確にそのコードを含む文書を拾い上げる。そこで二つの方式をともに回しスコアをRRF(Reciprocal Rank Fusion)のような手法で融合するハイブリッド検索(hybrid search)が事実上の標準となった。各自の弱点を相互補完して検索精度を高める戦略であり、LLMが根拠文書を正確に見つけてくるようにする実務の核心技術である。
実際の産業適用を見ると、大規模な電子商取引・技術文書検索システムは商品名・型番・条文番号のように正確一致が決定的なフィールドにBM25を、自然言語クエリの意図把握に埋め込みを配置したうえで二つの結果を融合する。社内ナレッジベースのチャットボットも社内規程・マニュアルの固有用語を取りこぼさないためにキーワード検索を結合するのが一般的である。このようにTF-IDFの後裔は単独手法としては退いたが、ハイブリッド構成の一つの軸として依然として必須の構成要素であり続けている。
6. 考慮事項および示唆点
- 前処理が品質を左右する:トークン化・ストップワード除去・語幹抽出(stemming)・見出し語抽出(lemmatization)・正規化の品質がTF-IDFの結果を決める。特に韓国語は膠着語の特性上、助詞・語尾が付くため形態素解析が必ず先行すべきであり、これを疎かにすると同じ単語が複数の形態に散らばって重みが歪む。
- 今なお有効な基盤技術:意味埋め込みが発展しても、TF-IDF/BM25は学習データ・GPUが不要で解釈可能であり、信頼できる基準線である。コールドスタートの状況や小規模コーパス、説明可能性が重要なドメインでは、むしろ埋め込みより実用的でありうる。
- ハイブリッドが大勢:キーワード検索(BM25)と意味検索(埋め込み)は代替材ではなく補完材である。RAG・エンタープライズ検索では二つを結合したハイブリッド構造が精度・コストのいずれでも有利であるため、技術士の観点では「何で代替するか」ではなく「どう組み合わせるか」を設計するのが正しい。
- コスト·拡張性のトレードオフ:TF-IDFはインデックス・クエリのコストが低く増分更新が容易な一方、埋め込みはモデル推論・ベクトルDB運用のコストが大きい。コーパス規模、クエリ量、遅延(latency)要求、説明可能性要求を総合して手法を選ぶべきである。
- ドメイン特化の余地:ストップワード辞書・重みの変形・フィールド別の重み付け(タイトル vs 本文)をドメインに合わせて調整すれば、TF-IDF/BM25の性能を大きく引き上げられるため、調律可能で透明なアルゴリズムであること自体が実務的な強みとなる。
- 評価·検証の重要性:どの重み変形と前処理の組み合わせが最善かはドメインごとに異なるため、精度(Precision)・再現率(Recall)・NDCGのような検索品質指標で必ず定量検証すべきである。「理論上よく見える」調律が実際のクエリログでは性能を下げる場合が多いため、A/Bテストとオフライン評価を併用するのが技術士の観点からの実務原則である。
参考資料
- scikit-learn — TfidfVectorizer / Text feature extraction: https://scikit-learn.org/stable/modules/feature_extraction.html#tfidf-term-weighting
- Elasticsearch — Practical BM25: https://www.elastic.co/blog/practical-bm25-part-2-the-bm25-algorithm-and-its-variables
- Wikipedia — tf–idf: https://en.wikipedia.org/wiki/Tf%E2%80%93idf
一言まとめ: TF-IDFは*TF(文書内の頻度)× IDF(log N/df)*で単語の重要度を計算し、特定の文書に頻繁に・全体には稀に現れる特徴語に高い重みを与える手法であり、ありふれた単語を自動的に0へ消去する利点があるが意味・文脈を反映できないため埋め込み・BM25へ発展し、今日ではRAGハイブリッド検索で意味検索と併用される核心的な基準線技術である。