どの語が、その文書らしさを表すか
tf-idf とは、ある語が、ある文書にとってどれだけ特別かを表す重みです。文書の中で何回も出て、ほかの文書にはあまり出ない語ほど、大きな値になります。
「の」は、どの文書にも何回も出ます。でも、「模擬店」という語は、文化祭の文書だけに出ます。検索では、後の語のほうが、手がかりになります。
このレッスンのゴール
メモ
単語頻度と文書頻度から、語の重みを計算し、文書の中の大事な語を選ぶことができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 単語頻度(tf) | 1つの文書の中で、語が出てくる回数 | |
| 文書頻度(df) | 語を含む文書が、全部で何枚あるか | |
| 逆文書頻度(idf) | 文書頻度が小さいほど大きくなる数 | log10(文書数 ÷ df) |
| tf-idf | 単語頻度に、逆文書頻度をかけた重み | |
| 対数 | 桁の数のように、大きな数をゆるやかに増やす計算 | log10(100) は 2 |
学生が入力するセルは、このプレビューでは空白です。
回数を数えるだけでは、「の」が勝つ
文書の中で語が出る回数を、単語頻度(tf)と言います。回数が多い語は、その文書の話題に関係がありそうです。
ところが、「の」のような語は、どんな文書でも多く出ます。回数だけで比べると、「の」がいつも1位になってしまいます。
例: 4枚の文化祭のお知らせ
| 番号 | 文書(単語の間に空白を入れてあります) |
|---|---|
| 1 | 文化祭 の 日程 の お知らせ |
| 2 | 文化祭 の 模擬店 の メニュー と 模擬店 の 場所 |
| 3 | 試験 の 日程 の お知らせ |
| 4 | 体育館 の 場所 の お知らせ |
学生が入力するセルは、このプレビューでは空白です。
多くの文書にある語は、手がかりが弱い
語を含む文書の数を、文書頻度(df)と言います。df が大きい語は、どの文書にもある語で、手がかりになりません。
逆文書頻度(idf)は、文書数を df で割り、10を底とする対数をとった数です。df が小さいほど大きく、すべての文書にある語は 0 になります。
例: 4枚での逆文書頻度
| 語 | 含む文書の数(df) | idf = log10(4 ÷ df) |
|---|---|---|
| 模擬店 | 1 | 0.602 |
| 文化祭 | 2 | 0.301 |
| お知らせ | 3 | 0.125 |
| の | 4 | 0.0 |
学生が入力するセルは、このプレビューでは空白です。
idf を計算する
docker exec jupyter python3 -c "import math; print(round(math.log10(4 / 1), 3), round(math.log10(4 / 4), 3))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
語ごとの重みを出す
import math
docs = [
"駅 の 近く の 店".split(),
"駅 の 図書館".split(),
"傘 の 店".split(),
]
for word in ["の", "駅", "傘"]:
df = 0
for words in docs:
if word in words:
df = df + 1
print(word, df, round(math.log10(len(docs) / df), 3))
# docs に「傘 の 駅」を足して、各語の重みが変わるか確かめてください。
tf と idf をかけると、大事な語が残る
tf-idf は、単語頻度(tf)に、逆文書頻度(idf)をかけた数です。何回も出て、しかも、ほかの文書に少ない語ほど、大きくなります。
「の」は、tf が大きくても、idf が 0 なので、0 になります。
例: 文書2の tf-idf
| 語 | tf | idf | tf-idf |
|---|---|---|---|
| 模擬店 | 2 | 0.602 | 1.204 |
| メニュー | 1 | 0.602 | 0.602 |
| と | 1 | 0.602 | 0.602 |
| 文化祭 | 1 | 0.301 | 0.301 |
| 場所 | 1 | 0.301 | 0.301 |
| の | 3 | 0.0 | 0.0 |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
回数が多い語ほど大切だと考えがちです。回数が多くても、どの文書にもある語は、その文書の特徴になりません。回数と、まれさの両方を見るのが tf-idf です。
さらに挑戦: 回数を長さで割る
文書が長いほど、tf は大きくなりやすいです。tf を「回数 ÷ 文書の語の数」に変えて、best_word の答えが変わるか調べてください。
短い文書と長い文書を比べるとき、この割り算が役に立ちます。