[中級編]LLMへ至る道~トークナイザーってなんだ?~[7日目]

2023.12.07

みなさんこんにちは!クルトンです。

前日のブログでは、「自然言語処理ってなんだ?」という概要と、分散処理について触れました。

本日ご紹介する内容であるトークナイザーは、自然言語処理の中で機械学習を使う場合に必要なものとなっています。早速確認していきましょう!

トークナイザーとはなんだ?関連用語を整理!

機械学習モデルでは、入力には画像や文章であっても数値にしないといけないというお話をしてきました。また文章の数値には、ベクトルを使うというお話もしてきました。文章を数値化する(ベクトルにする)事を分散表現と言います。

ここで、分散表現にするにあたって「文章をどの単位で数値化するのか?」という話が出てきます。例えば文章が複数ある場合、句点までを一つの単位として分散表現にするのか、はたまた1語1語ずつ分散表現にするのか、といった具合にです。

実は自然言語処理を取り扱う機械学習モデルでは、それぞれが取り扱う単位が異なります。それぞれの 単位の事をトークン(token) と言います。ある一定の規則をもとに文章を分解したものの事を言います。

トークンには種類があり、以下の3つがあります。

  • 単語単位のトークン
    • 文章を単語ごとに分割する
      • 単語ごとに分かれている英語のような言語なら分割しやすい
      • 日本語のように単語ごとに分かれていない言語なら判断する機構が必要となる
    • 例: 「今日もいい天気」なら、「今日」「も」「いい」「天気」のトークンになる
  • 文字単位のトークン
    • 一文字ずつ文章を分割する
    • 例: 「こんにちは」なら「こ」「ん」「に」「ち」「は」のトークンになる
  • サブワード単位のトークン
    • 単語単位からさらに分割する
      • さらに分割したものをサブワードと呼ぶ
    • 例: 「東京オリンピック」なら「東京」「##オリンピック」のトークンになる
      • ##とついているのは前に何かのサブワードがつく事を表す

上記のようにトークンに文章を分解する事を、 トークナイゼーション(tokenization) と言います。 そして、トークナイゼーションをしてくれるものを トークナイザー(tokenizer) と言います。

つまり、文章をある一定の単位に分割してくれるのがトークナイザー(tokenizer)です。

road-to-llm-advent-calendar-2023-07-01

トークナイザー(tokenizer)ですが、さまざまな自然言語処理において使われている重要なものです。機械学習に関わるプログラミングにおいても、機械学習モデルを呼び出すコードと、機械学習モデルへ文章を入力するためにトークナイザーを呼び出すコードを書きます。

トークナイザーを実際に使ってみた

トークナイザーを実際にPythonコードで触ってみましょう。 コードの実行環境はGoogle Colab(ランタイムはCPU)です。

英語でやってみる

import nltk
from nltk.tokenize import word_tokenize

nltk.download('punkt')  # 実行の初回のみダウンロードが必要

text = "My cat is pretty cute!"
tokens = word_tokenize(text)

print(tokens)

実行結果は以下になります。

['My', 'cat', 'is', 'pretty', 'cute', '!']

確かに文章をある一定の規則に従ってトークンに出来ていますね!

日本語でやってみた

日本語のトークナイザーの一つである以下のモジュールをインストールします。

!pip install janome

次にトークナイゼーションしてみるコードです。

from janome.tokenizer import Tokenizer

# Janomeのトークナイザーを初期化
tokenizer = Tokenizer()

# 日本語のテキストをトークンに分割
text = "うちの猫が一番可愛いです。異論は認めます。皆可愛いもんね。"
tokens = [token.surface for token in tokenizer.tokenize(text)]

print(tokens)

出力結果は以下です。

['うち', 'の', '猫', 'が', '一番', '可愛い', 'です', '。', '異論', 'は', '認め', 'ます', '。', '皆', '可愛い', 'もん', 'ね', '。']

日本語でもトークンごとに分割できているのを確認できました!

せっかくだからトークナイザーを使って可視化してみる

日本語のトークナイザーを導入できました。せっかくなので、前日のブログでやっていたワードクラウドを実行するPythonコードにトークナイザーを入れてみましょう。

まずは日本語フォントをインストールします。

# 日本語フォントがないのでインストールする
!apt-get -y install fonts-ipafont-gothic

次に以下のコードを実行します。

from janome.tokenizer import Tokenizer
from wordcloud import WordCloud
import matplotlib.pyplot as plt

# Janomeのトークナイザーを初期化
tokenizer = Tokenizer()

# 文章の間で自前でスペースを入れるなど工夫していた部分を除去
input_text_data = """
これはワードクラウドを作成する簡単なサンプルコードです。
Pythonを使って文章を可視化すると見た目が面白いです。
機械学習の手法では無いですが自然言語処理と言われる分野は他にも様々な面白い内容があります。
ワードクラウドについてご興味持たれた方は次にMeCabやSudachiという形態素解析と呼ばれるツールを調べてみると良いかもしれないです。
"""

# トークナイゼーション
tokens = [token.surface for token in tokenizer.tokenize(input_text_data)]

# ワードクラウドの生成
wordcloud = WordCloud(width=800, height=400, background_color="white", font_path='/usr/share/fonts/opentype/ipafont-gothic/ipagp.ttf').generate(' '.join(tokens))

# 描画設定
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")

# ワードクラウドを表示
plt.show()

road-to-llm-advent-calendar-2023-07-02

「を」や「は」がよく使われているという事が可視化されたのですが、除去して表示してみます。

以下のPythonコードを実行してみてください。変更箇所はワードクラウドの実行時にストップワードというのを付け加えた点です。

from janome.tokenizer import Tokenizer
from wordcloud import WordCloud
import matplotlib.pyplot as plt

# Janomeのトークナイザーを初期化
tokenizer = Tokenizer()

# 文章の間で自前でスペースを入れるなど工夫していた部分を除去
input_text_data = """
これはワードクラウドを作成する簡単なサンプルコードです。
Pythonを使って文章を可視化すると見た目が面白いです。
機械学習の手法では無いですが自然言語処理と言われる分野は他にも様々な面白い内容があります。
ワードクラウドについてご興味持たれた方は次にMeCabやSudachiという形態素解析と呼ばれるツールを調べてみると良いかもしれないです。
"""

# トークナイゼーション
tokens = [token.surface for token in tokenizer.tokenize(input_text_data)]

# ワードクラウドで表示しないトークン(ストップワード)を定義
stopwords = ['を', 'は', 'と', 'です', 'する', 'が', 'ない', 'て', 'れる', 'な', 'これ', 'の', 'や', 'という', 'ます', 'ご', 'みる', 'た', 'れ', 'あり', 'かも', 'に']

# ワードクラウドの生成
wordcloud = WordCloud(width=800, height=400
                      ,background_color="white", font_path='/usr/share/fonts/opentype/ipafont-gothic/ipagp.ttf'
                      ,stopwords=stopwords ).generate(' '.join(tokens))

# 描画設定
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")

# ワードクラウドを表示
plt.show()

road-to-llm-advent-calendar-2023-07-03

プログラム中にも書いていますが、ストップワードというのは今回のプログラムでいうと、ワードクラウドで表示しない単語の事です。「を」や「は」以外を表示した方が面白そうだったので追加してみました。

他の題材として、歌詞や小説などをワードクラウドで可視化してみるのも面白いかもしれませんね。よければやってみてください。

終わりに

今回はトークナイザーに関する内容や実際のコード例を確認しました。 文章を一定の規則で持って単位ごとに分ける事で自然言語処理の何かしらのタスクを実行する前段階が完了したイメージです。

明日は今回学んだトークナイザーを使って、機械学習モデルを実行してみます!

本日はここまで。それでは、明日もよければご覧ください!