自然言語処理の基本技術を学んで、テキストデータの理解を深めましょう。
はじめに
インターネット上には、ニュース記事、ブログ、SNSの投稿など、膨大な量のテキストデータが存在します。これらの情報の中から「特定の文書で、どの単語が特に重要か」を客観的に評価したいと考えたことはありませんか?
今回解説する「TF-IDF」は、まさにそのための技術です。TF-IDFは自然言語処理(NLP)や情報検索の分野で古くから使われている基本的な手法で、文書中に含まれる単語の重要度を数値化することができます。 この記事では、TF-IDFの仕組みから具体的な計算方法、活用例まで、初心者の方にも分かりやすく解説していきます。
TF-IDFの概要
TF-IDF(ティーエフ・アイディーエフ)は、Term Frequency – Inverse Document Frequency の略です。 その名の通り、「TF」と「IDF」という2つの指標を掛け合わせることで、単語の重要度を算出します。
ある文書内でたくさん出現するけれど、他の多くの文書ではあまり出現しない単語は、その文書を特徴づける重要な単語である。
この考え方を実現するために、「TF」と「IDF」がそれぞれ以下の役割を担っています。
- TF (Term Frequency): ある文書内での単語の出現頻度。
- IDF (Inverse Document Frequency): ある単語が、どれだけ多くの文書で使われているか(レア度)。
それでは、それぞれを詳しく見ていきましょう。
TF (Term Frequency) とは?
TFは「単語の出現頻度」を意味し、特定の文書の中で、ある単語がどれくらいの割合で出現するかを示します。 ある単語が文書内で何度も使われていれば、その文書にとって重要である可能性が高い、という考え方に基づいています。
計算式は以下の通りです。
計算例
例えば、以下のような短い文書があったとします。
この文書の総単語数は12語です。(読点や句点も1語とカウントする場合)
この中で「リンゴ」という単語は2回出現しています。したがって、「リンゴ」のTF値は以下のようになります。
TF(“リンゴ”) = 2 / 12 ≈ 0.167
IDF (Inverse Document Frequency) とは?
IDFは「逆文書頻度」と訳され、ある単語がどれだけ珍しいか、つまり「レア度」を示す指標です。 「です」「ます」や「私」のような、どの文書にも頻繁に登場する一般的な単語は、特定の文書の特徴を表す上では重要度が低いと考えられます。 IDFは、そうした単語の重みを下げる役割を果たします。
IDFは、その単語が出現する文書が少ないほど値が大きくなります。 計算式は以下の通りです。
※ 分母に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値を単純に掛け合わせることで求められます。
この計算により、「ある文書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(果物)」を区別できません。また、「犬が人を噛んだ」と「人が犬を噛んだ」を同じように扱ってしまいます。
- 単語の出現順序を無視する: 文章の構造やニュアンスを捉えることができません。
- 表記揺れに弱い: 「コンピュータ」と「コンピューター」を別の単語として認識してしまいます。
これらの課題を克服するため、近年ではWord2VecやBERTといった、単語の意味や文脈をベクトルで表現する、より高度な分散表現モデルが開発され、主流となりつつあります。
しかし、TF-IDFはそのシンプルさ、計算の速さ、そして解釈のしやすさから、今でも多くの場面でベースラインモデルとして、あるいは大規模データの前処理段階で有効な手法として活用されています。
まとめ
TF-IDFは、文書中の単語の重要度を「文書内での出現頻度(TF)」と「文書全体での珍しさ(IDF)」の2つの観点から評価する、シンプルかつ効果的な手法です。
- 特定の文書内で頻繁に出現する単語は重要度が高い(TF)
- 多くの文書で共通して使われる単語は重要度が低い(IDF)
- この2つを掛け合わせることで、文書を特徴づける単語を抽出できる
検索エンジンや文書分類など、様々な応用先があり、自然言語処理を学ぶ上で欠かせない基礎知識の一つです。より高度な技術が登場した現在でも、その価値は失われていません。この機会にぜひ、TF-IDFの考え方をマスターしてみてください。