『人間はチンパンジーよりマグロに近かった』『クジラのほうが、人間より哺乳類だった』と、このサイトでは言葉の「意味の座標」を実際に取り出して測ってきました。ただし測ってきた語は、ほとんどが名詞です。犬、猫、クジラ、人間、机。
けれど文章は名詞だけでできてはいません。動詞があり、形容詞があります。
学校で習う日本語の文法では、この3つははっきり別のものとして扱われます。名詞は形を変えず、動詞と形容詞は用途によって形を変える(活用する)。では、意味の座標の上でも、この3つは別々の区画に住んでいるのでしょうか。 手元で測れる話なので、測りました。
何で測るのか
先に、道具の正体をはっきりさせておきます。
使うのは paraphrase-multilingual-MiniLM-L12-v2 という、無料で公開されている小さなモデルです。名前は長いですが、やることは一つだけ——語や文を渡すと、384個の数字の組を返す。 それだけです。この数字の組が、このサイトで「意味の座標」「ベクトル」と呼んできたものにあたります。以下では MiniLM と短く呼びます。
大事な区別があります。これは文章を書くLLMではありません。 ChatGPTやClaudeのように文章を作る道具とは別物で、「この文とこの文は近いか」を判定するためだけにあります。文書検索や、自分の資料で専門特化のエージェントを作るで書いたRAGで、関係のありそうな箇所を探す工程に使われる側です。100以上の言語をまとめて学習しているので日本語も扱え、ノートパソコンで動きます。
準備は『人間はチンパンジーよりマグロに近かった』と同じで、npm install @huggingface/transformers だけです。
この先で登場する言葉(トークン・次元・近さなど)で引っかかったら、『LLMと日本語の用語集』に一言ずつまとめてあります。
import { pipeline } from '@huggingface/transformers'
const ex = await pipeline('feature-extraction', 'Xenova/paraphrase-multilingual-MiniLM-L12-v2')
const emb = async w => Array.from((await ex(w, { pooling: 'mean', normalize: true })).data)
const cos = (a, b) => a.reduce((s, x, i) => s + x * b[i], 0)
const pairs = [
['喜ぶ', '嬉しい'], ['喜ぶ', '悲しむ'],
['望む', '欲しい'], ['望む', '断る'],
['移動', '動く'], ['移動', '停止'],
['高い', '高値'], ['高い', '長い'],
]
for (const [a, b] of pairs) {
console.log(`${a} ↔ ${b}: ${cos(await emb(a), await emb(b)).toFixed(3)}`)
}
品詞が違っても近く、品詞が同じでも遠かった
数字は1に近いほど意味が近いという見方をします(この数え方の中身は『人間はチンパンジーよりマグロに近かった』で説明しています)。
| 組 | 品詞の関係 | 近さ |
|---|---|---|
| 喜ぶ ↔ 嬉しい | 動詞と形容詞 | 0.959 |
| 喜ぶ ↔ 悲しむ | どちらも動詞 | 0.613 |
| 望む ↔ 欲しい | 動詞と形容詞 | 0.966 |
| 望む ↔ 断る | どちらも動詞 | 0.619 |
| 移動 ↔ 動く | 名詞と動詞 | 0.945 |
| 移動 ↔ 停止 | どちらも名詞 | 0.480 |
| 高い ↔ 高値 | 形容詞と名詞 | 0.911 |
| 高い ↔ 長い | どちらも形容詞 | 0.513 |
品詞をまたいだ組のほうが、品詞が揃った組より近い。 それも僅差ではなく、0.9台と0.5台で分かれています。
「これは字面が似ているからでは」という疑いは、先に片づけておきます。『「犬」と「いぬ」は、別の語として扱われている』で見たとおり、MiniLMは文字の並びに強く引きずられます。実際「走る ↔ 走り」は0.997ですが、これは漢字を共有しているからだと言えてしまう。
ところが「喜ぶ」と「嬉しい」に共有する文字はありません。「望む」と「欲しい」も、「移動」と「動く」の「動」を除けば送り仮名まで別です。それでも0.9台に載りました。
意味分野が同じでも、名詞と動詞は分かれなかった
とはいえ上の比較には穴があります。ペアごとに意味そのものが違うので、差を作っているのが品詞なのか意味なのかを切り分けていません。
そこで、意味分野を「動き」に揃えた語を、品詞ごとに6語ずつ用意しました。名詞は「走者・歩行・疾走・跳躍・旋回・落下」、動詞は「走る・歩く・駆ける・跳ねる・回る・落ちる」、形容詞は「速い・遅い・鋭い・鈍い・荒い・激しい」です。この36語のすべての組み合わせで近さを測り、平均を取ります。
| 組み合わせ | 平均の近さ |
|---|---|
| 名詞どうし | 0.670 |
| 動詞どうし | 0.696 |
| 名詞 × 動詞 | 0.697 |
| 形容詞どうし | 0.630 |
| 名詞 × 形容詞 | 0.557 |
| 動詞 × 形容詞 | 0.577 |
名詞と動詞のあいだの距離(0.697)が、動詞どうしの距離(0.696)と同じでした。 名詞の集団と動詞の集団のあいだに、線が引かれていません。「走者」と「走る」は、品詞という帳簿の上では別の欄に書かれますが、座標の上では同じ場所に置かれています。
形容詞だけは、わずかに離れて座っています。ただし今回並べた形容詞6語はすべて「い」で終わっており、語尾の共通性と品詞そのものの効果を切り分けていません。 形容詞が特別なのか、「い」で終わる語が特別なのかは、この測定では決まりません。
品詞は「区画」ではなく「向き」として、うっすら残っていた
区画が無いとして、品詞はどこにも痕跡を残していないのでしょうか。
もう一つの調べ方があります。「走る → 走り」「読む → 読み」「喜ぶ → 喜び」のように、動詞を名詞に変える組を8つ用意し、その差(引き算した結果)が互いに同じ向きを指しているかを見る方法です。同じ向きを指しているなら、「名詞化」という操作が空間の中で一定の方向として存在していることになります。
結果です。1.0が完全に同じ向き、0が無関係を意味します。
| 向きの揃い方 | |
|---|---|
| 動詞 → 名詞(走る→走り 型)の8組 | 0.130 |
| 意味も品詞も無関係な語の8組(基準線) | 0.034 |
基準線の4倍ほど揃っていました。 品詞の変換は、空間の中でうっすらと一定の方向を持っている——ここまでは言えます。
ただし0.130は「1.0が完全一致」の目盛りの上では、かなり弱い揃い方でした。実際、この向きは足し算に使えません。8組から平均の向きを求めて「泳ぐ」に足すと、いちばん近い語が「泳ぎ」や「水泳」になるはずですが——
| 元の語 | 向きを足す前の1位 | 足した後の1位 |
|---|---|---|
| 泳ぐ | 泳ぎ(0.964) | 泳ぎ(0.882) |
| 歩く | 歩き(0.989) | 歩き(0.855) |
| 笑う | 笑い(0.996) | 笑い(0.841) |
| 願う | 願い(0.980) | 願い(0.848) |
足す前から、すでに1位は同じでした。 しかも足すと近さの数字は下がっています。この足し算は何も起こしていません。
これは『言葉が数字になるまで』で「王 − 男 + 女 = 女王」に付けた但し書きと、まったく同じ形の罠です。それらしい答えが返ってきたときは、足す前の答えを先に確認する。 今回はその手順で自分の仮説が消えました。
それでも、モデルの浅い層には品詞がある
ここまでの測定は「意味空間に品詞の区画は無い」と言っていますが、「モデルは品詞を扱っていない」とまでは言えません。
Tenneyらの論文『BERT Rediscovers the Classical NLP Pipeline』(2019年)は、モデルの内部を層ごとに調べています。層というのは、『AttentionとTransformer』で見た計算のかたまりが何段も積み重なった、その1段のことです。
この論文が見つけたのは、浅い層から順に、品詞 → 文の骨組み → 語と語の係り受け → 「誰が何をした」という役割 → 代名詞が何を指すか、という順序で情報が取り出せるという並びでした。品詞は、最も浅い層で取り出せます。 昔の自然言語処理が人手で組んでいた工程の順番が、教えていないのに層の深さとして再現されていた、という論文です。
つまり品詞の情報は、無いのではありません。入口のごく浅いところで一度計算され、その後は深い層の材料として使われて、出口の座標には主役として残っていない——今回の測定は、そう読むのが自然です。ここで測った数字は、モデル全体を通したあとの、1語ぶんの最終的な座標だからです。
実務では、体言止めでも動詞でも同じに扱われる
この話が関わってくるのは、意味の近さで文書を探す仕組みを作るときです。
| 組 | 近さ |
|---|---|
| ファイルの削除 ↔ ファイルを削除する | 0.979 |
| 会議の開始 ↔ 会議を開始する | 0.953 |
| 丁寧な説明 ↔ 丁寧に説明する | 0.812 |
| ファイルの削除 ↔ ファイルを保存する | 0.619 |
同じ内容を名詞で書いても動詞で書いても、ほぼ同じ座標に落ちます。 マニュアルの見出しを体言止め(「ファイルの削除」)にするか動詞で終える(「ファイルを削除する」)かは、日本語の文書では書き手が悩みがちなところですが、この種の検索に関しては、揃えても揃えなくても結果は変わらないということになります。
いっぽう『「犬」と「いぬ」は、別の語として扱われている』で見たとおり、表記のゆれは0.42まで落ちます。 揃える労力をかけるなら、品詞ではなく表記のほうです。
なお、ここで測ったのはMiniLMという384次元の小さな公開モデル1つです。上のスクリプトは語を差し替えるだけで動くので、実際に使うモデルで測り直すのが確実です。
まとめ
- 品詞が違っても意味が同じなら近く、品詞が同じでも意味が違えば遠かった。 喜ぶ ↔ 嬉しいが0.959、喜ぶ ↔ 悲しむが0.613
- 意味分野を揃えて測ると、名詞と動詞のあいだの距離は、動詞どうしの距離と同じだった。区画は見当たらない
- 形容詞はわずかに離れていたが、語尾の共通性と切り分けていない
- 「品詞を変える」差分は、基準線の4倍ほど同じ向きに揃っていた。ただし足しても品詞は変わらず、演算としては成立しなかった
- ただし研究の側では、品詞は最も浅い層で取り出せることが分かっている。出口の座標に主役として残っていないだけ
- 実務では、体言止めと動詞は同じに扱われる。 揃えるべきは品詞ではなく表記
日本語の文法が名詞・動詞・形容詞をきれいに分けるのは、人間が文を組み立てるための道具立てです。大量の文章を読んで座標を作った側は、その道具立てを引き継いでいませんでした。残っていたのは「何のことを言っているか」だけです。