はじめに
「自然言語処理」や「機械学習」の分野に足を踏み入れると、必ずと言っていいほど出会うTF-IDFという言葉。なんだか難しそうなアルファベットの羅列に見えますよね。
この記事は、そんなTF-IDFを 「完全に理解した」 と言えるようになることを目指すシリーズの第1弾です。
今回は、TF-IDFの「TF」の部分、Term Frequency(単語頻度) に焦点を当てます。
いきなり難しい話はしません。スーパーでリンゴを買うような身近な例から始めて、一歩ずつ数式に慣れていき、気づいたら応用的な考え方までマスターしている…そんな構成になっています。
この記事を読み終える頃には、あなたは…
- TFがなぜ重要なのかを、自分の言葉で説明できるようになる。
- TFの基本的な計算から、応用的な計算までできるようになる。
- TFだけでは何が足りないのか、次のステップ(IDF)への期待が高まる。
それでは、さっそく冒険を始めましょう!
1. TFって、そもそも何?
TFは Term Frequency の略です。日本語に訳すと 「単語の出現頻度」 。
はい、そのまんまです。本当にこれだけ。
TF = ある文書の中で、ある単語がどれくらいの頻度で出現するか
例えば、あなたが書いた2つのブログ記事(文書)があったとします。
文書A:『リンゴの魅力』
「私はリンゴが大好きです。真っ赤なリンゴは、甘くて美味しい。休日はいつもリンゴを食べています。」
文書B:『今日のランチ』
「今日のランチはパスタでした。デザートにリンゴを一つ食べました。美味しかったです。」
さて、この2つの文書で「リンゴ」という単語に注目してみましょう。
- 文書Aでは、「リンゴ」が 3回 出てきました。
- 文書Bでは、「リンゴ」が 1回 しか出てきません。
直感的に考えて、どちらが「リンゴ」について詳しく書かれた記事でしょうか?
もちろん文書Aですよね。
このように、「ある文書でたくさん出てくる単語は、その文書のテーマにとって重要そうだよね!」 というのがTFの基本的な考え方です。シンプルですが、非常に強力なアイデアです。
2. TFを計算してみよう!【数式とご対面】
「たくさん出てくれば重要」というアイデアを、コンピュータが扱えるように「数値」に落とし込んでいきましょう。ここから少しだけ数式が出てきますが、全く難しくありません。
Step 1: とにかく回数を数える(Raw Count)
一番シンプルなTFの計算方法は、単純に出現回数を数えるだけです。
$$
tf(t, d) = \text{単語tが文書dに出現した回数}
$$
-
t
は Term(単語)の頭文字です。ここでは「リンゴ」だと思ってください。 -
d
は Document(文書)の頭文字です。文書Aや文書Bのことです。
先ほどの例で計算してみましょう。
文書A:『リンゴの魅力』
「私 は リンゴ が 大好き です。真っ赤な リンゴ は、甘くて 美味しい。休日 は いつも リンゴ を 食べて います。」
(※分かち書き)
- $tf(\text{リンゴ}, \text{文書A}) = 3$
- $tf(\text{私}, \text{文書A}) = 1$
- $tf(\text{は}, \text{文書A}) = 2$
簡単ですね!これがTFの基本の「き」です。
Step 2: 文書の長さも考えてみよう(正規化)
しかし、単純な回数だけだと、少し困ったことが起きます。
次の2つの文書を比べてみてください。
文書C(短い):
「猫は可愛い。」(総単語数: 3)
$tf(\text{猫}, \text{文書C}) = 1$
文書D(長い):
「先日、道端で一匹の猫を見かけた。その猫は人懐っこく、私の足にすり寄ってきた。あまりにも可愛いので、しばらく撫でてしまった。日本の都市部では多くの猫が暮らしているが、彼らが幸せに生きていける社会であってほしいと切に願う。」(総単語数: 60くらい)
$tf(\text{猫}, \text{文書D}) = 3$
単純な回数で比較すると、$tf(\text{猫}, \text{文書D}) = 3$ の方が $tf(\text{猫}, \text{文書C}) = 1$ よりも値が大きいため、文書Dの方が「猫」に関する重要度が高い、と判断されてしまいます。
でも、文書Cはたった3単語のうち1単語が「猫」で、文書のテーマは間違いなく「猫」です。一方、文書Dは体験談の中に「猫」という単語が複数回出てきただけ、とも言えます。
この 「文書が長いだけで、単語の出現回数が多くなってしまう不公平」 を解消するために、正規化(Normalization) という考え方を導入します。
具体的には、文書の総単語数で割ってあげます。
$$
tf(t, d) = \frac{\text{単語tが文書dに出現した回数}}{\text{文書dの総単語数}}
$$
この式で、先ほどの文書CとDを再計算してみましょう。
文書C(総単語数: 3):
$$
tf(\text{猫}, \text{文書C}) = \frac{1}{3} \approx 0.33
$$
文書D(仮に総単語数: 60):
$$
tf(\text{猫}, \text{文書D}) = \frac{3}{60} = 0.05
$$
どうでしょう!文書Cの方が圧倒的にTFの値が高くなりました。
これで、文書の長さに左右されず、文書内での単語の「相対的な」重要度を測ることができるようになりましたね。
3. もっと賢く計算したい!【気づいたら応用編】
さて、文書の長さで正規化すれば、もう完璧でしょうか?
実は、もう少し考慮すべき点があります。
例えば、ある文書で「リンゴ」という単語が
- 1回出現する場合
- 10回出現する場合
- 100回出現する場合
を考えてみましょう。
出現回数が1回から10回に増えた時、「リンゴ」の重要度はグッと増した感じがします。
では、100回から101回に増えた場合はどうでしょう? 「重要度がちょっと増した」くらいで、1回から10回に増えた時ほどのインパクトはありませんよね。
つまり、単語の重要度は、出現回数に単純に比例するのではなく、だんだんとその伸びが緩やかになるはずです。これを専門用語で 「収穫逓減(しゅうかくていげん)」 と言ったりします。
この「伸びの緩やかさ」を表現するために、いくつかの応用的な計算方法があります。
応用1: 対数正規化 (Logarithmic Normalization)
「だんだん伸びが緩やかになる」グラフといえば、高校数学で習った対数(log) が使えます。
$$
tf(t, d) = \log(1 + \text{単語tが文書dに出現した回数})
$$
なぜ 1 +
をつけているかというと、もし出現回数が0回だった場合、log(0)
となってしまい計算できなくなるのを防ぐためです。($\log(1) = 0$ となるので、出現回数0ならTF値も0になり、都合が良いのです)
この式を使うと、出現回数とTF値の関係は以下のようになります。
出現回数 | $\log(1 + \text{回数})$ | TF値の伸び |
---|---|---|
1 | $\log(2) \approx 0.301$ | - |
2 | $\log(3) \approx 0.477$ | +0.176 |
10 | $\log(11) \approx 1.041$ | (ここまでの伸びが大きい) |
100 | $\log(101) \approx 2.004$ | - |
101 | $\log(102) \approx 2.008$ | +0.004 |
見てください。出現回数が100回から101回に増えても、TF値はわずか 0.004
しか増えていません。
これで、出現回数が増えすぎてもTF値が過剰に大きくならないように調整することができました。多くの自然言語処理ライブラリで、この対数を使ったTFが採用されています。
応用2: 二重正規化 (Double Normalization)
もう一つ、少しマニアックな方法を紹介します。
これは、「文書内で一番多く出てくる単語」を基準に正規化する方法です。
$$
tf(t, d) = 0.5 + 0.5 \times \frac{\text{単語tが文書dに出現した回数}}{\text{文書d内で最も頻出する単語の出現回数}}
$$
例えば、ある文書で「です」が一番多く10回出現し、「リンゴ」が5回出現したとします。
この場合、$tf(\text{リンゴ}, d)$ は $0.5 + 0.5 \times \frac{5}{10} = 0.75$ となります。
これは、文書内での単語の出現バランスをより重視したい場合に有効なことがあります。0.5
を足しているのは、値が0になるのを防ぎ、全体をなめらかにする(スムージング)ためのおまじないのようなものです。
まとめと、次へのステップ
今回はTF (Term Frequency) について、深掘りしてきました。
- TFの基本: 文書内でたくさん出てくる単語は重要!
-
計算方法:
- 単純な回数(Raw Count)
- 文書の長さで割る(Normalization) ← これが基本形!
- 伸びを緩やかにする(Logarithmic Normalizationなど) ← これが応用形!
これで、あなたもTFについては完全に理解できたはずです。
しかし、TFだけではまだ完璧ではありません。
例えば、「は」「が」「を」「です」「ます」のような単語(助詞や助動詞)は、どんな文書にもたくさん出てきます。
TFだけで判断すると、これらの単語が常に重要だと判定されてしまいます。でも、私たちが知りたいのは 「その文書を『特徴づける』単語」 のはずです。
「どの文書にも出てくる一般的な単語」の重要度を下げ、
「特定の文書にしか出てこないレアな単語」の重要度を上げる。
そんな魔法のような仕組みが、次回解説する IDF (Inverse Document Frequency) です。
TFとIDFが組み合わさった時、ついに最強の指標 「TF-IDF」 が完成します。
次回の記事で、その謎を解き明かしましょう!お楽しみに!