Dance with Agents

「走る」も「走った」も「走」から始まっていた——LLMの区切り方は、日本語と英語で正反対だった

ミディアム専門用語を名前のまま使います。初出で解説を添えるので、順に読めば追えます深掘り日本語処理手元で測る

『LLMは日本語を単語に割っていない』で割ってみせたのは、「有名人には詳しく」という名詞と助詞の並びでした。では、活用する語はどう割られるのか。

活用というのは、「走る・走った・走らない・走ります」のように、同じ動詞が用途によって形を変えることです。日本語では動詞と形容詞が活用し、名詞は活用しません。

割ってみたところ、日本語と英語で正反対の結果になりました。


測るのは、意味ベクトルではなく文章の刻み方

『「喜ぶ」と「嬉しい」は、品詞が違うのに近かった』をはじめ、このシリーズで測ってきたのは、語や文を384個の数字の組(意味の座標)に変える MiniLM という公開モデルでした。この記事で見るのは、その一段手前の工程です。

使うのはトークナイザ——文章を、モデルが扱う単位(トークン)に割る部品です。座標を計算する前に、まず文章をこの単位に刻む。その刻み方そのものを見ます。

具体的には、公開されているGPT-4oのトークナイザを使いました。MiniLM のものではありません(両者で刻み方が違う点は、記事の最後に触れます)。

用語で引っかかったら、『LLMと日本語の用語集』に一言ずつまとめてあります。

日本語の動詞は、先頭の単位を残して後ろだけ変わる

| が区切りで、区切られたひとつひとつが実際の単位です。

走る     →  走 | る
走った    →  走 | った
走らない   →  走 | ら | ない
走ります   →  走 | ります
走れば    →  走 | れば
走り     →  走 | り
走れ     →  走 | れ

7つの形すべてが「走」から始まっています。 変わるのは後ろだけ。形容詞も同じでした。

高い     →  高 | い
高かった   →  高 | かった
高くない   →  高 | く | ない

活用によって形が変わっても、先頭の単位は共有されたままです。

英語の動詞は、形が変わると何も残らない

同じトークナイザで英語を見ます。

run      →  run       (1つ)
runs     →  runs      (1つ)
running  →  running   (1つ)
ran      →  ran       (1つ)
runner   →  runner    (1つ)

5つとも、それぞれ丸ごと1つの単位でした。 run と running は、共有する部分がありません。別の語として扱われています。

不規則に変化する語では、もっとはっきりします。

go | went | gone       →  3つとも別々の1つの単位
good | better | best   →  3つとも別々の1つの単位

went の中に go の痕跡はありません。綴りとして共有していないのだから当然ですが、run と running のように綴りを共有している組でも、単位としては分かれています。

単位が頻度で決まる結果、日本語と英語で逆になった

不思議に見えますが、原因は一つです。『LLMは日本語を単語に割っていない』で書いたとおり、単位を決めているのは文法ではなく頻度です。よく出てくる並びが、1つの単位にまとめられる。

  • 英語の動詞は、形が数えるほどしかありません。 run / runs / running / ran の4つ程度。だから1つ1つが大量に登場して、丸ごと専用の単位を貰えます
  • 日本語の動詞は、形が桁違いに多い。 走る・走った・走ります・走らない・走れば・走ろう・走らせる・走られる……と、打ち消しや使役の言い方を組み合わせればいくらでも増えます。1つ1つに専用の単位を割り当てていては足りない。 そこで「走」という頻出の漢字を切り出し、残りを送り仮名の断片で組み立てるほうが得になります

文法を知っていて語幹を残しているのではなく、頻度で数えた結果そうなっただけです。実際、ひらがなで書いても同じことが起きます。

はしる    →  は | し | る
はしった   →  は | し | った

漢字がなくても「は | し」が共有されました。漢字だから語幹が残る、という話ではありません。

名詞と動詞は、同じ単位から始まる

もう一つ、日本語に特有の事情があります。「漢語の名詞 + する」で動詞を作るやり方です。

削除     →  削 | 除
削除する   →  削 | 除 | する

移動     →  移 | 動
移動する   →  移 | 動 | する

名詞と動詞が、同じ単位から始まっています。 違いは「する」が足されているかどうかだけ。

この作り方で作られる動詞は、日本語に膨大にあります。削除する、開始する、確認する、報告する。外来語でも同じで、インストールする、アップロードする。つまり日本語の動詞のかなりの部分は、名詞と出発点を共有しています。

ここから言えることは、はっきりしています。品詞の情報は、トークンのどこにも入っていません。 「削 | 除」という並びを見ただけでは、それが名詞として使われるのか動詞として使われるのかは決まらない。決めているのは、後ろに何が続くかです。

『「喜ぶ」と「嬉しい」は、品詞が違うのに近かった』で、意味の座標に品詞の区画が見当たらなかった、という測定を紹介しました。その入口側の事情が、ここにあります。 そもそも入ってくる時点で、品詞という札は付いていません。

切れ目は、後ろに何が来るかで動く

ついでに気づいたことを一つ。

静か     →  静 | か
静かな    →  静 | かな
静かだ    →  静 | か | だ

同じ「静か」なのに、後ろに何が続くかで切れ目が変わります。 「か」のときと「かな」のときがある。『LLMは日本語を単語に割っていない』で見た「には」(助詞2つが融合して1つの単位になる)と、同じ現象です。

「静か」は学校文法で形容動詞と呼ばれ、名詞なのか形容詞なのかが長く議論されてきた品詞です。その語幹すら、安定して切り出されてはいませんでした。

トークンの共有で説明がつく近さ、つかない近さ

先頭の単位を共有していることは、意味の座標の近さにも表れます。数字は1に近いほど意味が近いという見方をします。

組 先頭の単位 近さ
走る ↔ 走った 共有する 0.952
走る ↔ はしる 共有しない 0.512
喜ぶ ↔ 嬉しい 共有しない 0.959

上の2行は、単位の共有で説明がつきます。「走る」をひらがなで「はしる」と書いた瞬間、漢字の「走」を共有しなくなり、0.512まで落ちる——『「犬」と「いぬ」は、別の語として扱われている』で見た表記ゆれの、動詞版です。

説明がつかないのが3行目です。 「喜ぶ」と「嬉しい」は文字を1つも共有していないのに0.959。ここは単位の話では届きません。トークンの共有は近さの原因の一つですが、唯一の原因ではない、ということになります。

実務では、活用形の違いは吸収される

検索やRAGを組むときに知っておくと得なのは、次の点です。

  • 活用形の違いは、ほぼ気にしなくてよい。 資料に「削除しました」と書いてあって「削除」で探しても引っかかる
  • 表記のゆれは気にする必要がある。 動詞をひらがなで書くと0.512まで落ちる。「行う/おこなう」「作る/つくる」「言う/いう」は、日本語の文書で実際によく揺れる組です

なお、ここで割ってみせたのは公開されているGPT-4oのトークナイザであって、Claudeのものではありません。 Anthropicはトークナイザを公開していないので、正確な数はトークンカウントAPIで数えることになります。

また、割り方はモデルごとに違います。実際、座標の測定に使った別のモデル(paraphrase-multilingual-MiniLM-L12-v2)では「食べる」が丸ごと1つの単位になっており、語幹が切り出されていませんでした。頻出の形は専用の単位を貰えるので、どの語がどう割れるかは、そのモデルが何を読んで育ったかで変わります。

まとめ

  • 日本語の動詞・形容詞は、活用しても先頭の単位が共有される。 走る・走った・走らない・走ります、すべて「走」から始まる
  • 英語は逆で、run / runs / running / ran はそれぞれ丸ごと1つの単位。共有する部分がない
  • 原因は同じ頻度。英語は形が少ないので丸ごと覚えられ、日本語は形が多すぎるので語幹を切り出すほうが得になる
  • ひらがなでも語幹は残る(はしる → は | し | る)。漢字だからではない
  • 「削除」と「削除する」は同じ単位から始まる。品詞のラベルは、どこにも付いていない
  • 「静か」の切れ目は、後ろに何が来るかで動く
  • 実務では、活用形の違いは吸収されるが、表記のゆれは吸収されない

日本語の動詞が活用するのは、人間にとっては覚えることが増える面倒な性質です。割って数える側から見ると、それは「頭が残る」という別の性質に化けていました。

LLMと自然言語の記事

LLMと自然言語のページへ →