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

無料レッスン

単語を数えて重要な語を見つける

このレッスンのあとで: 単語の出現回数を数え、めずらしい語ほど大きい重みをつけることができる。

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

どの語が感想の中身を表すか

単語の袋(バッグ・オブ・ワーズ)とは、文章を、語の出現回数の表として表す方法です。数えるだけで、文章をコンピュータが比べられる数字に変えられます。

レンタサイクル店の感想には、「自転車」がほとんどの文に出てきます。「パンク」は、一部にしか出てきません。感想の中身を表すのは、どちらでしょうか。

このレッスンのゴール

メモ

単語の出現回数を数え、めずらしい語ほど大きい重みをつけることができる。

キーワード

ことばいみれい
文書数える対象になる、1つの文章感想1通
単語の袋語順を捨て、出現回数だけで表す方法
語彙すべての文書に出た、異なる語の一覧
出現回数1つの文書に、その語が出た回数
文書頻度その語が出る文書の数
TF-IDF出現回数に、めずらしさをかけた重み

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

語順を捨てて回数だけを数える

文書の中で、各語が何回出るかを数えます。順番は気にしません。語を袋に入れて混ぜるように、順番を捨てるので、単語の袋と呼びます。

すべての文書に出た語を集めた一覧が語彙です。語彙の順に回数を並べると、文書は数字の列になります。

例: 4つの感想の語の回数

文書自転車軽い安いパンク
文書1「自転車 軽い」1100
文書2「自転車 パンク パンク」1002
文書3「自転車 軽い 安い」1110
文書4「自転車 安い 安い」1020

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

端末で語の回数を数える

コマンド
docker exec jupyter python3 -c "print(__import__('collections').Counter('the bike and the helmet and the lock'.split()).most_common(2))"

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

回数を辞書で数える

コード: python
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自転車111
文書2パンク248
文書3自転車111
文書3軽い122
文書3安い122

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

文書頻度を数える

コード: python
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語を選び、その語の重みがいちばん大きい文書を探します。

見つかった文書は、その語について書いていますか。語を変えて試し、検索がなぜこの考え方で動くのかを説明しましょう。

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

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