感想を読む前に、まず切り分ける
トークン化とは、文章をコンピュータが数えられる小さな単位に分ける作業です。自然言語処理(人間の言葉をコンピュータで扱う技術)は、すべてここから始まります。
レンタサイクル店に、毎日たくさんの感想が届きます。人がすべて読むのは大変です。まず文章を切り分けて、数えられる形にします。
このレッスンのゴール
メモ
文章をトークンに分け、記号や書き方をそろえて整えることができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 自然言語処理 | 人間の言葉をコンピュータで扱う技術 | |
| トークン | 文章を切り分けた、数えるための1つの単位 | |
| トークン化 | 文章をトークンに分ける作業 | |
| 正規化 | 書き方の違いをそろえること | ABC を ABC にする |
| ストップワード | どの文にもあり、数えても役に立たない語 | は、の、です |
| 文字バイグラム | 隣り合う2文字の組 | 電車が → 電車・車が |
学生が入力するセルは、このプレビューでは空白です。
日本語には単語の区切りがない
英語は空白で単語が分かれます。日本語には空白がないので、どこで切るかを決める必要があります。
辞書をもとに単語へ切る道具(形態素解析器)を使う方法があります。もっと単純に、決まった数の文字で切る方法もあります。
同じ文を3通りに切る
| 切り方 | 「電車が遅れます」の結果 | トークンの数 |
|---|---|---|
| 1文字ずつ | 電・車・が・遅・れ・ま・す | 7 |
| 2文字ずつ(文字バイグラム) | 電車・車が・が遅・遅れ・れま・ます | 6 |
| 単語(辞書で切る) | 電車・が・遅れ・ます | 4 |
学生が入力するセルは、このプレビューでは空白です。
文字バイグラムを自分で作る
sentence = "電車が遅れます"
# 2文字ずつに切ります。
pairs = []
for n in range(len(sentence) - 1):
pairs.append(sentence[n:n + 2])
print(pairs)
print(len(pairs), "トークン")
# sentence を自分の一文に変えて、もう一度実行してください。
切る前に書き方をそろえる
同じ意味でも、書き方が違えば別のトークンになります。全角の「ABC」と半角の「ABC」は、別のものとして数えられます。大文字と小文字も同じです。
切る前に書き方をそろえることを、正規化と言います。記号や空白も、ここで取り除きます。
そろえずに切るとどうなるか
docker exec jupyter python3 -c "print('Late Bus, LATE bus.'.lower().split())"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: そろえる前と後
| そろえ方 | トークン | 種類の数 |
|---|---|---|
| 小文字にして空白で切る | late・bus,・late・bus. | 3 |
| 記号も取り除く | late・bus・late・bus | 2 |
学生が入力するセルは、このプレビューでは空白です。
記号を取り除いてそろえる
import unicodedata
text = "ABC店は、月曜日が休みです!"
# 取り除きたい記号です。
marks = "、。!? "
result = ""
for ch in text:
if ch not in marks:
result = result + ch
# 全角の英数字を半角にそろえます。
result = unicodedata.normalize("NFKC", result)
print(result)
# marks に "店" を足すと、結果はどう変わりますか。
よくある間違い
注意
トークンは、いつも1つの単語のことだと考えがちです。実際は、仕事に合わせて決める単位です。単語のことも、1文字のことも、単語の一部のこともあります。
どの文にもある語は除くことがある
「は」「の」「です」は、どの文にも出てきます。数えても、文の中身は分かりません。このような語をストップワードと言い、数える前に除くことがよくあります。
ただし、除いてはいけない場合もあります。「行く」と「行かない」では、「ない」が意味を変えます。
例: ストップワードを除く
| 段階 | 「自転車はとても乗りやすいです」のトークン |
|---|---|
| 切った後 | 自転車・は・とても・乗り・やすい・です |
| ストップワードを除く | 自転車・とても・乗り・やすい |
学生が入力するセルは、このプレビューでは空白です。
さらに挑戦: 3文字ずつに切る
課題の bigrams を書きかえて、3文字ずつ(文字トライグラム)に切る関数を作ってください。「電車が遅れます」は、いくつのトークンになりますか。
2文字と3文字で、同じ文の似ている度合いがどう変わるかを、次の回で測ります。