どの語が感想の中身を表すか
単語の袋(バッグ・オブ・ワーズ)とは、文章を、語の出現回数の表として表す方法です。数えるだけで、文章をコンピュータが比べられる数字に変えられます。
レンタサイクル店の感想には、「自転車」がほとんどの文に出てきます。「パンク」は、一部にしか出てきません。感想の中身を表すのは、どちらでしょうか。
このレッスンのゴール
メモ
単語の出現回数を数え、めずらしい語ほど大きい重みをつけることができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 文書 | 数える対象になる、1つの文章 | 感想1通 |
| 単語の袋 | 語順を捨て、出現回数だけで表す方法 | |
| 語彙 | すべての文書に出た、異なる語の一覧 | |
| 出現回数 | 1つの文書に、その語が出た回数 | |
| 文書頻度 | その語が出る文書の数 | |
| TF-IDF | 出現回数に、めずらしさをかけた重み |
学生が入力するセルは、このプレビューでは空白です。
語順を捨てて回数だけを数える
文書の中で、各語が何回出るかを数えます。順番は気にしません。語を袋に入れて混ぜるように、順番を捨てるので、単語の袋と呼びます。
すべての文書に出た語を集めた一覧が語彙です。語彙の順に回数を並べると、文書は数字の列になります。
例: 4つの感想の語の回数
| 文書 | 自転車 | 軽い | 安い | パンク |
|---|---|---|---|---|
| 文書1「自転車 軽い」 | 1 | 1 | 0 | 0 |
| 文書2「自転車 パンク パンク」 | 1 | 0 | 0 | 2 |
| 文書3「自転車 軽い 安い」 | 1 | 1 | 1 | 0 |
| 文書4「自転車 安い 安い」 | 1 | 0 | 2 | 0 |
学生が入力するセルは、このプレビューでは空白です。
端末で語の回数を数える
docker exec jupyter python3 -c "print(__import__('collections').Counter('the bike and the helmet and the lock'.split()).most_common(2))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
回数を辞書で数える
doc = ["自転車", "パンク", "パンク"]
counts = {}
for word in doc:
if word in counts:
counts[word] = counts[word] + 1
else:
counts[word] = 1
print(counts)
# doc を ["自転車", "安い", "安い"] に変えて実行してください。
めずらしい語ほど大切にする
「自転車」はどの感想にも出るので、感想を区別する手がかりになりません。「パンク」は1つの感想にしか出ないので、その感想の中身を表します。
その語が出る文書の数を文書頻度と言います。文書頻度が小さいほど、めずらしい語です。
重みは、回数にめずらしさをかけて出す
重みは、出現回数に「文書の数 ÷ 文書頻度」をかけて出します。めずらしい語ほど、この割り算の値が大きくなります。
これが TF-IDF の考え方です。本物の計算は、さらに対数を使います。ここでは割り算だけで考えます。
4つの文書で割り算をする
docker exec jupyter python3 -c "print([4 / n for n in [4, 2, 2, 1]])"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: 文書2と文書3の重み
| 文書 | 語 | 回数 | 4 ÷ 文書頻度 | 重み |
|---|---|---|---|---|
| 文書2 | 自転車 | 1 | 1 | 1 |
| 文書2 | パンク | 2 | 4 | 8 |
| 文書3 | 自転車 | 1 | 1 | 1 |
| 文書3 | 軽い | 1 | 2 | 2 |
| 文書3 | 安い | 1 | 2 | 2 |
学生が入力するセルは、このプレビューでは空白です。
文書頻度を数える
docs = [
["自転車", "軽い"],
["自転車", "パンク", "パンク"],
["自転車", "軽い", "安い"],
["自転車", "安い", "安い"],
]
word = "パンク"
df = 0
for doc in docs:
if word in doc:
df = df + 1
print("文書頻度:", df)
print("文書の数 ÷ 文書頻度:", len(docs) / df)
# word を "軽い" に変えて、もう一度実行してください。
よくある間違い
注意
回数が多い語ほど大切だと考えがちです。「自転車」は4つの文書すべてに出ますが、どの感想の中身も表しません。回数は、めずらしさと合わせて見ます。
さらに挑戦: 重みで文書を探す
自分で5つの短い感想を書き、語に切って、重みの表を作ってください。1語を選び、その語の重みがいちばん大きい文書を探します。
見つかった文書は、その語について書いていますか。語を変えて試し、検索がなぜこの考え方で動くのかを説明しましょう。