トークナイゼーション

テキストをトークン (単語やサブワードなどの処理単位) に分割する処理。

トークナイゼーション (tokenization) は、テキストを処理の基本単位であるトークンに分割する処理です。自然言語処理 (NLP) や大規模言語モデル (LLM) の入力前処理として不可欠な工程であり、分割の粒度や方式によって後続の処理精度が大きく左右されます。トークンの単位は単語、サブワード、文字、バイトなど目的に応じて選択され、同じテキストでもトークナイザの種類によって分割結果が異なります。

トークナイゼーションの代表的な手法には、単語単位の分割、サブワード分割、文字単位の分割があります。単語単位の分割は英語のようにスペースで区切られる言語では直感的ですが、未知語 (語彙に含まれない単語) を扱えない問題があります。この課題を解決するのがサブワード分割で、BPE (Byte Pair Encoding)、WordPiece、SentencePiece、Unigram などのアルゴリズムが広く使われています。BPE は頻出する文字列のペアを繰り返し結合して語彙を構築する手法で、GPT シリーズのトークナイザ (tiktoken) に採用されています。自然言語処理とトークンの書籍でトークナイゼーションの手法を体系的に学べます。

日本語のトークナイゼーションは英語と比べて格段に複雑です。日本語にはスペースによる単語区切りがないため、形態素解析器 (MeCab、Sudachi、Janome など) を用いて単語境界を推定する必要があります。さらに、LLM 向けには SentencePiece のような言語非依存のサブワードトークナイザが使われることが多く、日本語の漢字やひらがなが細かいサブワードに分割されます。たとえば「東京都」は「東京」「都」や「東」「京」「都」のように分割される場合があり、トークナイザの語彙サイズによって結果が変わります。

実務でトークナイゼーションが特に重要になるのは、LLM の利用コスト管理です。ChatGPT や Claude などの API は入出力のトークン数に基づいて課金されるため、同じ内容でもトークン数が少ないプロンプトのほうがコストを抑えられます。日本語は英語に比べてトークン効率が悪い (同じ意味の文章でもトークン数が多くなる) 傾向があり、日本語 1 文字が 1〜3 トークンに分割されることも珍しくありません。このため、日本語でのプロンプト設計ではトークン数を意識した文章の簡潔化が重要です。LLM トークナイザの書籍で最新の手法を習得できます。

よくある誤解として、「文字数 = トークン数」と考えてしまうケースがあります。実際には英語では 1 単語が 1〜2 トークン程度ですが、日本語では 1 文字が複数トークンになることがあり、文字数とトークン数は一致しません。また、トークナイザはモデルごとに異なるため、GPT-4 と Claude では同じテキストでもトークン数が異なります。トークン数を正確に把握するには、各モデル専用のトークナイザを使って事前に計算する必要があります。

文字数カウントとの関連では、テキストの「長さ」を測る尺度として文字数、バイト数、トークン数の 3 つが実務で使い分けられています。SNS の投稿制限は文字数、データベースのカラムサイズはバイト数、LLM の入出力制限はトークン数で管理されます。文字数カウントツールにトークン数の推定機能を備えることで、LLM ユーザーがプロンプトの長さを事前に確認でき、API の利用コストを最適化できます。