クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

tf-idf で単語の重みを決める

このレッスンのあとで: 単語頻度と文書頻度から、語の重みを計算し、文書の中の大事な語を選ぶことができる。

60分のレッスンコマンド1件JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

どの語が、その文書らしさを表すか

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)
模擬店10.602
文化祭20.301
お知らせ30.125
の40.0

学生が入力するセルは、このプレビューでは空白です。

idf を計算する

コマンド
docker exec jupyter python3 -c "import math; print(round(math.log10(4 / 1), 3), round(math.log10(4 / 4), 3))"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

語ごとの重みを出す

コード: python
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

語tfidftf-idf
模擬店20.6021.204
メニュー10.6020.602
と10.6020.602
文化祭10.3010.301
場所10.3010.301
の30.00.0

学生が入力するセルは、このプレビューでは空白です。

よくある間違い

注意

回数が多い語ほど大切だと考えがちです。回数が多くても、どの文書にもある語は、その文書の特徴になりません。回数と、まれさの両方を見るのが tf-idf です。

さらに挑戦: 回数を長さで割る

文書が長いほど、tf は大きくなりやすいです。tf を「回数 ÷ 文書の語の数」に変えて、best_word の答えが変わるか調べてください。

短い文書と長い文書を比べるとき、この割り算が役に立ちます。

このラボとソースについて: JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。