TF-IDFとは?単語の重み付けの仕組みとコサイン類似度・ベクトル検索での使い方を実装目線で解説
TF-IDFは、ある単語が一つの文書の中でどれだけその文書を特徴づけているかを数値化する、単語の重み付け手法です。文書によく出てくる単語ほど値を大きくし、どの文書にもまんべんなく現れる「の」「する」のようなありふれた単語ほど値を小さくすることで、その文書らしさを表す単語を浮かび上がらせます。読み方は「ティーエフ・アイディーエフ」で、Term Frequency(単語頻度)とInverse Document Frequency(逆文書頻度)という二つの指標を掛け合わせた名前です。本記事では、TFとIDFがそれぞれ何を測るのか、文書をベクトルに変換して類似度を測る流れ、疎ベクトルという性質とBM25や埋め込みベクトルへの発展、そしてscikit-learnのTfidfVectorizerでの実装判断までを、実装する側の目線で整理します。
目次
まとめ:TF-IDFの要点と、テキストを数値化する重み付けの結論
TF-IDFの核心は、単語の重みを「その文書内での多さ(TF)」と「コーパス全体での珍しさ(IDF)」の掛け算で決める点にあります。ある文書に何度も出てくる単語はTFが高くなり、その一方で全文書に共通して現れる単語はIDFが低くなるため、両者を掛けると、特定の文書だけに集中して現れる単語ほど大きな重みを得る仕組みです。この重みを単語ごとに並べると、一つの文書が数値の並び、つまりベクトルとして表現でき、文書同士の似ている度合いをコサイン類似度などで機械的に測れるようになります。
実装する側の結論を先に述べます。TF-IDFは、計算が軽く、なぜその文書が選ばれたのかを単語の重みとして人が追える、扱いやすい手法です。キーワード抽出や、語がそのまま一致する検索、テキスト分類の特徴量づくりでは、今も現実的な第一候補になります。ただしTF-IDFは単語の表記が一致することを前提とするため、「自動車」と「クルマ」のように意味は同じでも文字が違う語を結び付けられません。言い換えや文脈の含みまで捉えたい検索では、意味をベクトルに埋め込む手法に軍配が上がります。したがって実務では、まずTF-IDFで土台を組み、語彙のずれや意味の近さが精度を左右する場面で埋め込みベースの検索へ切り替える、という段階的な設計が現実的な落としどころになります。TF-IDFの理解は、その先の検索技術を選び分ける物差しにもなると考えてください。
TF-IDFとは何か、TFとIDFという二つの指標が測るものの違い
TF-IDFは、単語頻度と逆文書頻度という二つの数字の掛け算です。まずはそれぞれが何を測っているのかを分けて押さえると、なぜこの掛け算がその文書らしい単語を選び出せるのかが見えてきます。
TF(単語頻度)が測る、その文書の中での単語の目立ち具合と偏り
TFは、一つの文書の中である単語が何回登場するかを表す指標です。単純な出現回数をそのまま使う場合もあれば、文書の長さによる差をならすため、文書内の総単語数で割った割合を用いる場合もあります。長い文書ほどどの単語も回数が増えてしまうので、割合にそろえておけば文書間の比較が公平になるという工夫です。考え方は素直で、ある文書の中で何度も繰り返される単語は、その文書の主題に関わっている見込みが高い、という前提に立ちます。技術文書で「コンテナ」という語が何度も出てくれば、その文書はコンテナについて書かれている、と推し量れるわけです。ただしTFだけを見ると、「する」「これ」「ため」のような、どんな文書にも大量に現れる単語が上位を占めてしまいます。この偏りを打ち消す役目を担うのが、次のIDFです。
IDF(逆文書頻度)とTF-IDFの計算、ありふれた語の重みを下げる仕組み
IDFは、ある単語がコーパス(対象とする文書全体の集まり)の中で、どれだけ珍しいかを測る指標です。全文書のうちその単語を含む文書の割合が小さいほど、値が大きくなります。式としては、全文書数を、その単語が現れる文書数で割った比の対数で表すのが基本形です。多くの文書に共通して現れる「の」「です」のような単語は分母が大きくなり、対数を取るとIDFはほぼゼロに近づきます。逆に、一部の専門的な文書だけに現れる単語はIDFが大きく残ります。そしてTF-IDFは、このTFとIDFを単語ごとに掛け合わせた値です。ある文書内で頻繁に出てきて(TFが高い)、なおかつ他の文書ではあまり見かけない(IDFが高い)単語ほど、大きな重みを得ます。結果として、どの文書にもあるありふれた語は自動的に抑えられ、その文書を特徴づける固有の語だけが際立ちます。この、二つの視点で単語をふるいにかける発想が、TF-IDFがテキストの特徴量として長く使われてきた理由です。
TF-IDFの仕組みと、文書をベクトル化して類似度を測る流れ
単語ごとの重みが出せると、次は文書そのものを数値の集まりとして扱えます。ここでは文書をベクトルに変換する考え方と、その性質、さらに新しい検索手法との関係を見ていきます。
Bag-of-Wordsによる文書のベクトル化と、コサイン類似度での比較
TF-IDFで文書を表すときは、まず語の順序を無視して「どの単語が何回出たか」だけに注目するBag-of-Words(単語の袋)という捉え方を土台にします。コーパスに登場する全単語をあらかじめ列に並べ、一つの文書について各単語のTF-IDF値をその列に埋めていくと、文書が一本のベクトルになります。全語彙が数万語あれば、ベクトルの次元も数万になりますが、一つの文書に出てくる単語はそのうちごく一部なので、大半の要素はゼロです。このように、ほとんどの要素がゼロで埋まったベクトルを疎ベクトル(スパースベクトル)と呼びます。文書がベクトルになれば、二つの文書がどれだけ似ているかは、ベクトル同士の向きの近さで測れます。ここで広く使われるのが、ベクトルのなす角度のコサインで類似度を評価するコサイン類似度による類似検索の考え方です。TF-IDFで文書をベクトル化し、コサイン類似度で近さを測る、という組み合わせが、文書検索や類似記事の抽出における古典的な骨格になります。
TF-IDFが抱える限界と、BM25・埋め込みベクトルへの発展
TF-IDFは強力な一方で、割り切りゆえの限界も抱えます。最大の弱点は、単語の表記が一致しないと関連を捉えられない点です。「パソコン」と「PC」、「解約」と「退会」のように、意味が重なっても文字が違えば別の単語として扱われ、類似度に寄与しません。また、語の並びや文脈を捨てているため、「犬が猫を追う」と「猫が犬を追う」を区別できない、といった限界もあります。こうした弱点を部分的に補う発展形が二方向あります。一つは、検索の分野で定番となっているBM25です。TF-IDFの考え方を引き継ぎつつ、単語頻度が一定以上で頭打ちになる調整や、文書の長さによる補正を加え、検索での順位付けにより向く形へ洗練させた手法です。もう一つが、単語や文の意味を低次元の密ベクトルへ写す埋め込み(エンベディング)で、これは表記の違う同義語も近い位置に配置できます。疎ベクトルであるTF-IDFと、意味を捉える密ベクトルは役割が異なり、両者を組み合わせるハイブリッド検索や、候補を絞ってから並べ替える段構えも実務では一般的です。この疎と密の使い分けや並べ替えの考え方は、ベクトル検索とリランキングの違いを整理した記事で役割の分担が見えてきます。
企業がTF-IDFを導入する際の採用判断とscikit-learn実装の勘所
ここからは技術解説から一歩進め、実装者がTF-IDFとどう向き合うべきかを示します。要点は、TF-IDFと埋め込み検索の使い分けと、scikit-learnでの実装の勘所の二つです。順に見ていきます。
TF-IDFを採用すべき場面と、密ベクトル検索へ切り替えるべき場面の見極め
TF-IDFを採用する判断は、語がそのまま一致することが検索の主目的で、なぜその結果が返ったのかを説明したい場面で正解になります。製品名や型番、専門用語のように表記が固定された語を引き当てる社内検索、文書からの特徴語の抜き出し、テキスト分類の特徴量づくりでは、計算が軽く、外部モデルへの依存もなく、単語の重みで根拠を追えるTF-IDFが手堅い選択です。データ量が限られ、まず動く検索を短期間で用意したい初期段階でも、実装の速さが効きます。一方で、利用者が入力する言葉と文書側の言葉がそろわない場面、つまり言い換えや同義語、質問文からの検索が精度を左右するなら、密ベクトルによる埋め込み検索へ切り替えるのが妥当です。社内の問い合わせにナレッジで答えるような用途では、表記のゆれを吸収できる意味ベースの検索が効きます。実務では、まずTF-IDFやBM25で語の一致による土台を作り、意味の近さが必要な部分に埋め込み検索を重ねる二段構えが現実的です。こうした検索とLLMを組み合わせて社内文書に基づく回答を生成する仕組みは、RAG(検索拡張生成)の仕組みを解説した記事で全体像がつかめます。自社の文書検索や生成AIの構築で、TF-IDFによる語一致検索と埋め込み検索のどちらを土台に据えるべきか、あるいは両者をどう組み合わせるかの設計から任せたい場合は、社内文書検索と生成AIの受託開発を手がける一創のRAG構築支援にご相談ください。用途とデータ量に応じた検索方式の選定から運用までを支援します。
scikit-learnのTfidfVectorizerでの実装とパラメータの勘所
実装では、PythonのscikitlearnにあるTfidfVectorizerが標準的な入口になります。文書の一覧を渡すだけで、語彙の作成からTF-IDF値の計算、疎ベクトルへの変換までをまとめて処理してくれます。ただし日本語では、単語の切れ目を空白で区切る英語と違い、あらかじめ形態素解析で文を単語へ分ける前処理が要る点に注意が必要です。MeCabやJanomeといった解析器で分かち書きにしてから渡すのが一般的な流れになります。パラメータでまず触れておきたいのは、極端に多くの文書に現れる語を捨てるmax_df、逆に出現が少なすぎる語を捨てるmin_df、そして単語頻度の効きすぎを対数でならすsublinear_tfです。ノイズになりがちな高頻度語や、たまたま一度きり現れた語を語彙から除くと、ベクトルの無駄な膨らみを抑えられます。IDFのゼロ割りを避けるスムージングは既定で有効になっており、通常はそのままで差し支えありません。実装後は、各文書で重みの大きい単語を並べてみると、その文書を特徴づける語が意図どおり選ばれているかを目で検証でき、前処理やパラメータの調整の手がかりになります。数値をうのみにせず、抽出された特徴語が業務の感覚と合うかを確かめながら進めてください。
TF-IDFの仕組み・実装と企業導入に関してよくある質問と回答
TF-IDFでよく検索される疑問に、実装目線で簡潔に答えます。
TF-IDFとは何をするための指標ですか?
文書の中の各単語に、その文書らしさを表す重みを付けるための指標です。ある文書によく出てくる単語(TFが高い)で、かつ他の文書にはあまり出てこない単語(IDFが高い)ほど大きな値になります。これにより、どの文書にもあるありふれた語を抑え、その文書を特徴づける固有の語を選び出せる点が持ち味です。キーワード抽出や文書検索、テキスト分類の特徴量づくりに用いられます。
TFとIDFはそれぞれ何を表していますか?
TF(単語頻度)は、一つの文書の中でその単語がどれだけ多く出てくるかを表します。IDF(逆文書頻度)は、その単語がコーパス全体でどれだけ珍しいかを表し、多くの文書に共通する語ほど小さく、一部の文書だけに現れる語ほど大きくなる指標です。TF-IDFは、この二つを掛け合わせた値で、文書内での多さと全体での珍しさを同時に反映します。
TF-IDFとコサイン類似度はどう関係しますか?
TF-IDFは文書を単語の重みの並び、つまりベクトルに変換する手法で、コサイン類似度はそのベクトル同士がどれだけ似た向きかを測る指標です。TF-IDFで各文書をベクトル化し、コサイン類似度でベクトル間の角度の近さを計算することで、二つの文書の似ている度合いを数値で比べられます。文書検索や類似記事の抽出では、この二つを組み合わせて使うのが古典的な形です。
TF-IDFと埋め込みベクトルはどちらを使うべきですか?
語がそのまま一致する検索や、根拠を説明したい用途、計算資源を抑えたい場面ではTF-IDFが向きます。一方、言い換えや同義語、質問文からの検索など、表記が違っても意味が近いものを結び付けたい場面では、埋め込みベクトルによる意味ベースの検索が向く選択です。実務では、まずTF-IDFで語一致の土台を作り、意味の近さが必要な部分に埋め込み検索を重ねる組み合わせもよく取られます。
日本語でTF-IDFを使うときの注意点はありますか?
英語は単語が空白で区切られますが、日本語は単語の切れ目が明示されないため、そのままでは単語ごとに分けられません。MeCabやJanomeなどの形態素解析器で文を単語へ分ける分かち書きの前処理をしてから、TF-IDFの計算に渡す必要があります。助詞や記号をどこまで語として残すかによって結果が変わるため、前処理の設計が精度を左右します。
関連記事
- コサイン類似度とは?計算式・仕組みと類似検索での実装を実装目線で解説:TF-IDFでベクトル化した文書の近さを測る計算を詳しく知りたい方はこちら。
- ベクトル検索とリランキングの違いとそれぞれの役割:疎ベクトルと密ベクトルの使い分けや並べ替えの考え方を整理したい方へ。
- RAGとは?仕組みとLLM・ファインチューニングとの違い・企業での導入例を解説:検索とLLMを組み合わせて社内文書に答えさせる仕組みを知りたい方へ。
- スクレイピングとは?クローリング・APIとの違いと実装・法務の判断を解説:TF-IDFにかける前段のテキストデータ収集を検討したい方へ。