トークン化#

トークン化(tokenization)とは、文を適当な単位に分割すること。分割された文の構成要素のことをトークン(token)と呼ぶ。

自然言語処理においては、文章を計算可能な形状にするためにトークンへと分割し、対応するidを割り振っていく。

ニューラルネットワークなどのアルゴリズムで作られるモデルにとって訓練時に見かけなかったトークンは未知語と呼ばれ、予測時には無視するか未知語を表す特定のidにマッピングされ、元の文字列の情報を損失してしまう。そのため、トークン化に際しては未知語を可能な限り少なくすることが望ましい。

トークン化の方法は主に

  1. 単語分割(単語単位に分割する)

  2. サブワード分割(単語をさらにサブワード単位に分割する)

  3. 文字分割(文字単位に分割する)

の3種類の分割方法がある。

単語分割#

英語ならスペースで区切ればよい

日本語の場合、形態素という単位に分割する形態素解析という技術を使う。

サブワード分割#

例えば

["東京タワー", "大阪大学", "東京大学"]

といった語彙があるとき、サブワードの語彙は次のようなものが考えられる。

["東京", "大阪", "##タワー", "##大学"]

地名と「##タワー」「##大学」を組み合わせれば元の語彙を表現できる。

OpenAIのTokenizerを使うとTokenが可視化されてイメージが付きやすい(ただし英語のみ)

形態素解析#

形態素解析は、形態素(意味の最小単位)に分割する方法。おおむね単語分割のようになる。

MeCabが有名だが、MeCab本体を入れる必要があるし、本体の更新がしばらく止まっている。

Sudachiは本体の実装がまだあり、SudachiPyだけ入れればすぐ使えるので使いやすそう

from sudachipy import tokenizer
from sudachipy import dictionary

tokenizer_obj = dictionary.Dictionary().create()

# Multi-granular Tokenization

mode = tokenizer.Tokenizer.SplitMode.C
[m.surface() for m in tokenizer_obj.tokenize("国家公務員", mode)]
# => ['国家公務員']

mode = tokenizer.Tokenizer.SplitMode.B
[m.surface() for m in tokenizer_obj.tokenize("国家公務員", mode)]
# => ['国家', '公務員']