Shiki’s Weblog
ひらがなIME — かな漢字変換での大規模言語モデルの利用
2024/10/13
はじめに
今月もあたらしいひらがなIMEをリリースしています。最新版は、大規模言語モデルをつかって、文脈にあった変換候補をはじめから、えらべるようになっています。したの動画は、ひらがなIMEに変換候補の選択をまかせて入力しているときの様子です。
ユーザーは提示された変換候補をただそのままつかっています。本文の文脈にあわせて「回答」と「解答」のような同音異義語をつかいわけることができています。「乗る」と「載る」のようなおくりがなのある和語についても同様です。今回はそのしくみについてまとめます。
これまでのひらがなIMEの概略
梅棹忠夫さんは、漢字のすくない、よみやすい文章をたくさんかきのこしました。ひらがなIMEは、梅棹さんのような表記法をつかった文章をかきやすくするために、2017年から開発をはじめたIMEです。梅棹さんの表記法のいちばんの特徴は、和語の用言をかなでかくところです。この文章もそのようにしています。
かな漢字変換によみの入力モードをつかわない
これまでのIMEでは、おおくの文節をプリエディットにまとめて入力する方法が主流になってきました。そのかわりに、すこし操作がむずかしい部分があります。文節をきる位置を修正する。前方の文節の誤変換を修正する。こうしたIMEに固有のキー操作は、おもったよりもつかいこなしにくいものです。むずかしい操作をきらって、みじかい文節ごとに確定しながら入力していくひともいます。誤変換をみつけたとき、ESCキーをおして、さいしょから入力しなおしているひともいるのではないでしょうか。
ひらがなIMEは、ひらがなを入力するときプリエディットをつかいません。ひらがなは、プリエディットをはさまずに、直接、本文に挿入していきます。漢字をつかいたいときは、本文中のひらがなを直接、漢字におきかえることができます。これには、カーソル周辺のテキストをしらべたり、削除したりするIMモジュールの機能を利用しています。この機能は、2017年ごろはサポートしているアプリがあまりありませんでした。いまは、さいしょの動画のようにLibreOfficeやFirefoxなどもふつうにサポートしています。
前方最長一致法によるかな漢字変換
ひらがなIMEのかな漢字変換には、前方最長一致という方法をつかってきました。この方法では、カーソルの位置からまえにむかって本文をみていきます。そして、ひらがなIMEの漢字辞書のなかからよみが一致する語をさがします。そのなかで、いちばん、よみのながい語を第一候補としていました。
たとえば、『わたしの生きがい論』という本のタイトルを入力するとき、「がいろん」の部分にはつぎの候補が合致します。
- わたしの生きがい論
- わたしの生きが異論
- わたしの生き概論
前方最長一致法では、よみのながさがいちばんながい「概論」を候補とします。期待しているのは「生きがい論」なので、この選択はただしくありません。しかし、辞書の学習がすすんでいくにつれて、この方法でも意外と問題に気づかなくなります。これはひらがなIMEが「がい論」という語を辞書に追加し、それを優先するように学習するためです。
おくりがなのある語の変換
ひらがなIMEでは、漢字でかく部分の直後で変換キーをおすと、かな漢字変換処理がはじまります。これは、おくりがなのある語でも、そのようにしています。たとえば、「手紙を書いた」と入力したいときは、「手紙をか」のあとで[変換]キーをおします。変換はおくりがなの入力が完了したときに自動的に確定します。
そのために、ひらがなIMEは、つぎのような用言の活用表を使っています。表のなかのおくりがなにつづいてさらに1文字入力すると、自動的に変換が確定します。
活用 | 五段 | 上一段 | 下一段 | 形容詞 |
---|---|---|---|---|
よみ | かく | みる | たべる | しろい |
不定 | 書き | 見 | 食べ | 白く |
動作 | 書く | 見る | 食べる | 白い |
仮定 | 書けば | 見れば | 食べれば | 白ければ |
命令 | 書け | 見ろ | 食べろ | |
意思 | 書こう | 見よう | 食べよう | 白かろう |
て形 | 書いて | 見て | 食べて | 白くて |
過去 | 書いた | 見た | 食べた | 白かった |
否定 | 書かな | 見な | 食べな | |
希望 | 書きた | 見た | 食べた | |
ます | 書きま | 見ま | 食べま | |
ず | 書かず | 見ず | 食べず | |
使役 | 書かせ | |||
尊敬 | 書かれ | |||
そのほか | 白さ 白み 白げ 白そう |
学校文法では、「書く」と「嗅ぐ」の連用形は「書い」と「嗅い」だとならいます。しかしこれだけでは、かな漢字変換のために必要な情報をつかいきれていません。「書いて」や「嗅いで」のように連用形に1文字くわえると、変換対象となる候補をしぼることができます。ひらがなIMEの活用表はこうした観点からきめたものです。
補足: 日本語教育では、「て形」などは、この表とおなじかたちでひとつの活用形としておしえています。学校文法だけが日本語の文法をただしく記述したものであるというようなことではないようです。『正しい日本文の書き方』といった本をみると、国語の研究はまだまだ途中のような印象をうけます。
大規模言語モデルを利用したかな漢字変換
梅棹さんのような表記法をつかうときは、用言はほとんどひらがなでかきます。また、ことばえらびをして、なるべくやさしいことばをつかいます。同音異義語をつかうのは、なるべくさけよう。そうした意識もはたらいています。結果として、IMEの変換精度はじつはあまり問題になりません。
しかし、いまの「やさしい日本語」や公用文では、和語の用言も常用漢字表の範囲内では漢字をつかいます。同音異義語を意識してさけることもすくないかもしれません。これまでのIMEはこうした文章や、もっと漢字を多用する文章に特化したかたちで発展してきました。このままでは、梅棹さんのようなやさしい表記法をつかう方向にすすめていくのは困難です。どんな表記法をつかうかは、IMEではなく、ユーザーがえらべるようになっているべきです。
ひらがなIMEでも公用文のような文章を入力しやすくしておけば、すこしは問題を解決できるのではないか。そうしたことをかんがえて、変換精度の向上にとりくみました。
言語モデルでできること
さいきんのAIはかなり自然な文章を生成することができます。AIでつかわれている大規模言語モデルを応用すると、IMEの変換精度もたかめることができます。
いまはオープンソースの大規模言語モデルをPC上でかんたんに利用することができます。最新のひらがなIMEは、言語モデルとしてtohoku-nlp/bert-base-japanese-v3を利用しています。このモデルは、日本語の事前学習ずみのBERTモデルです。
BERTモデルは、文章やセンテンスを数値のトークンに分解して処理します。たとえば、「問題の解答」というセンテンスをトークン化すると、つぎのような数値の列になります。
2, 12829, 464, 20348, 3
「解答」という語は20348という数値で表現されています。このトークンの列を文字で表現すると、つぎのようになります。[CLS],[SEP]は、それぞれ文頭と文末をあらわします。
[CLS] 問題 の 解答 [SEP]
BERTモデルをつかうと、トークンをマスクして、そこにくるトークンを推定することができます。したの[MASK]の部分にそれぞれのトークンが出現する確率をもとめることができるのです。
[CLS] 問題 の [MASK] [SEP]
解答と回答のどちらがよくでてくるかをしらべてみると、つぎのようになります。
トークン | 語 | 確率 (%) |
---|---|---|
17412 | 回答 | 0.000313 |
20348 | 解答 | 0.002889 |
大規模言語モデルは、大量の文章をよみこんで学習しています。この確率は、「問題の解答」のほうが「問題の回答」よりもよく文章にでてくるということをしめしています。
センテンスの前半を「問題の」から「アンケートに」にかえると、確率がかわります。まずトークンに分解します。
[CLS] アンケート に [MASK] [SEP]
[MASK]にくるトークンの確率をしらべてみます。
トークン | 語 | 確率 (%) |
---|---|---|
17412 | 回答 | 0.702180 |
20348 | 解答 | 0.006224 |
こんどは、「アンケートに回答」のほうが「アンケートに解答」よりもよく文章にでてくるとことがわかります。
こうしたBERTモデルをかな漢字変換に利用するのは自然なことでしょう。「問題のかいとう」を変換するときは、候補ウィンドウのなかで「解答」をあらかじめ選択しておく。「アンケートにかいとう」のときは「回答」を選択しておく。最新のひらがなIMEは、そうした動作をするようになっています。
変換候補のよみのながさが異なるとき
前節では、同音異義語の選択に大規模言語モデルを使用できることをたしかめました。かな漢字変換では語のきれ目の判定もむずかしい部分のひとつです。ひらがなIMEでは、語のよみのながさの判定がそれに相当します。
「わたしの生きがいろん」というフレーズを変換するときは、つぎの3つの候補がありました。
- わたしの生きがい論
- わたしの生きが異論
- わたしの生き概論
トークン化すると、つぎのようになります。##は、直前のトークンとつなげることをしめしています。
[CLS] わたし の 生き ##がい 論 [SEP]
[CLS] わたし の 生き が 異 ##論 [SEP]
[CLS] わたし の 生き 概 ##論 [SEP]
それぞれの出現確率をしらべるには、まず5トークン目をマスクして(##がい, が, 概)の確率をしらべる。そのあとで、さらにべつべつに6トークン目, 7トークン目の確率をしらべてかけあわせる。そうすればよさそうです。計算してみると、つぎのようになります。
候補 | 確率 (%) |
---|---|
[CLS] わたし の 生きがい 論 [SEP] | 0.00000014 |
[CLS] わたし の 生き 概論 [SEP] | 0.00000000 |
[CLS] わたし の 生き が 異論 [SEP] | 0.00000000 |
このなかでは、「わたしの生きがい論」の確率がたかいことがわかります。
最新のひらがなIMEでは、こうしたばあい「がい論」という語を学習辞書にさきに追加します。「わたしの生きがいろん」を変換すると、「がい論」という候補がはじめから選択されています。
おくりがなのある語の出現確率の計算
おくりがなのある語の出現確率も大規模言語モデルをつかって計算することができます。確率の計算のしかたは、また、すこしかわります。
ひらがなIMEでは、「手紙を書いた」と入力したいときは「手紙をか」のあとで[変換]キーをおします。トークンのなかでは、つぎのようなものが「か―」というおくりがなのある語に対応する可能性があります。
且 交 交え 交わし 代 代わっ 代わり 代わる 借り 兼ね 兼ねる 兼ね備 刈 勝 勝ち 勝ち点 勝ち越し 勝っ 勝つ 勝て 嗅 変 変え 変える 変わっ 変わら 変わり 変わる 懸 掛 掛かる 掛け 掛ける 掛け声 描 描い 描か 描き 描く 換 書 書い 書か 書き 書き下ろし 書き換え 書き込み 書く 替 替え 枯 架 架かる 架け 欠 欠い 欠かせ 欠く 欠け 欠ける 狩 狩り 買 買い 買い物 買う 買っ 買わ 貸 貸し 賭け 飼 飼い 飼っ 駆 駆け 駆けつけ
ひとつひとつのトークンは、学校でならう文法とはあまり関係がありません。「買い物」や「書き込み」なども、それでひとつのトークンになっています。これらのトークンの出現確率の和を[か―]とすると、確率はしたの表のようになります。
トークン | 確率 (%) |
---|---|
[CLS] 手紙 を 化 [SEP] | 0.00062065 |
[CLS] 手紙 を 下 [SEP] | 0.00117484 |
[CLS] 手紙 を 火 [SEP] | 0.00001212 |
[CLS] 手紙 を 花 [SEP] | 0.00132942 |
[CLS] 手紙 を 日 [SEP] | 0.00021494 |
[CLS] 手紙 を 科 [SEP] | 0.00003665 |
[CLS] 手紙 を 夏 [SEP] | 0.00031159 |
[CLS] 手紙 を 家 [SEP] | 0.00355257 |
[CLS] 手紙 を 歌 [SEP] | 0.00216899 |
[CLS] 手紙 を [か―] [SEP] | 16.38025284 |
この確率をみると、ここではおくりがなのある語として変換するとよさそうだということがいえます。
つづいて、「かい」までタイプすると、変換する候補は、つぎのおくりがなのある語にしぼられます。
嗅い 買い 書い 欠い 飼い 交い 描い
これらに対応する可能性のあるトークンはつぎのものになります。
おくりがなのある語 | トークン |
---|---|
嗅g | 嗅 |
買w | 買 買い 買い物 |
書k | 書 書い |
欠k | 欠 欠い |
飼w | 飼 飼い |
交w | 交 |
おくりがなのある語ごとに、これらのトークンの出現確率の和を計算するとしたの表のようになります。
おくりがなのある語 | 確率 (%) |
---|---|
手紙 を [書k] | 0.05203808 |
手紙 を [嗅g] | 0.00010608 |
手紙 を [買w] | 0.00218592 |
手紙 を [欠k] | 0.00024449 |
手紙 を [飼w] | 0.00100214 |
手紙 を [交w] | 0.00027161 |
手紙 を [描k] | 0.00302607 |
このばあいは「手紙を書い」がもっともらしい候補だということができます。
「手紙を」を「臭いを」にかえると、確率はしたのようにかわります。このばあいは、「臭いを嗅い」がもっともらしい候補だということになります。
トークン | 確率 (%) |
---|---|
臭い を [嗅g] | 0.66568311 |
臭い を [書k] | 0.00002579 |
臭い を [買w] | 0.00856550 |
臭い を [欠k] | 0.00005847 |
臭い を [飼w] | 0.00028443 |
臭い を [交w] | 0.00000188 |
臭い を [描k] | 0.00001477 |
言語モデルを利用しているときは、「かい」までで、「書いた」か「嗅いだ」かを予測できているわけです。
実装と性能
ひらがなIMEは、Pythonをつかって実装しているIBus用のIMEです。エンジン部分の行数は3,500行ほどです。
今回、言語モデルをあつかう部分は、Hugging Faceの🤗Transformersをもちいて実装しました。🤗Transformersをつかうと、前半でのべた「回答」と「解答」の確率の問題はつぎのようなかんたんなコードでしらべられます。
import torch
from transformers import AutoModelForMaskedLM, AutoTokenizer
MODEL_NAME = 'cl-tohoku/bert-base-japanese-v3'
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForMaskedLM.from_pretrained(MODEL_NAME)
inputs = tokenizer('問題の[MASK]', return_tensors='pt')
mask_token_index = torch.where(inputs.input_ids == tokenizer.mask_token_id)[0]
with torch.no_grad():
probabilities = model(**inputs).logits[0, mask_token_index][0]
probabilities = torch.nn.functional.softmax(probabilities, dim=0)
vocab = tokenizer.get_vocab()
for word in ('回答', '解答'):
print(f'{word}: {probabilities[vocab[word]] * 100:.6f} %')
ひらがなIMEで言語モデルにアクセスする部分のコードも360行ほどのかんたんなコードです。さきに大規模言語モデルを利用したかな漢字変換でのべたような処理をそのまま🤗Transformersを利用して実装しています。
いっぽうで、大規模言語モデルを利用した変換処理にはやはり時間がかかります。「新幹線」のようなこぐかんたんな語を変換するだけでも、CPUだけでは0.1秒以上かかることがあります。キー操作の反応に0.1以上かかると、人間はまたされている感覚をもちます。インタラクティブなアプリでは、「0.1秒ルール」とよんで、なるべく0.1秒以内に処理をおわらせるような工夫がよくされています。
この問題は、GPUやNPUを利用することで改善できます。いまよくつかわれているGeForce RXT 3060ですと、「新幹線」の変換も0.1秒未満でおわります。GeForce RXT 3060の性能は8ビット整数で約100 TOPsです。今後はCPUに内蔵されるNPUも同様の役割をになえるようになりそうです。そうなると処理時間がおおきな問題になることはなさそうです。さいきんのAI PCといわれている製品も、高性能なGPUやNPUを搭載しているようです。
なお、ひらがなIMEでCUDAを利用するばあい、610 MiBほどのGPUメモリを使用します。
関連研究
まぜがき変換と前方最長一致法
漢直がまぜがき変換をサポートするようになったとき、前方最長一致法で実用上うまくいくことに気づいていたようです。T-Codeのまぜがき変換用の辞書には、まぜがきではなく、ただのひらがなから漢字への変換になっている項目がかなりあります。
共起データベースをもちいたかな漢字変換
日本語ワープロでは、比較的初期から同音意義語の変換に共起データベースをもちいてきました。1992年の論文「かな漢字変換における共起情報の適用方式の拡張」には、「歌舞伎が人気を呼んでいる。昨日行われた公演は満員であった」という例文がでています。この例文では、歌舞伎という語に応じて「公演」という語が出現するように共起データベースがつくられていることが説明されています。むかしの製品では、こうした処理のことをAI変換とよんだりしていました。
大規模言語モデルは、これと同様の機能も提供します。ひらがなIMEで「こうえん」という部分を変換したときの確率はつぎのようになっています。
トークン | 確率 (%) |
---|---|
[CLS] 歌舞伎 が 人気 を 呼ん で いる 。 昨日 行わ れ た こう 宴 [SEP] | 0.000000 |
[CLS] 歌舞伎 が 人気 を 呼ん で いる 。 昨日 行わ れ た 講演 [SEP] | 0.000023 |
[CLS] 歌舞伎 が 人気 を 呼ん で いる 。 昨日 行わ れ た 公園 [SEP] | 0.000178 |
[CLS] 歌舞伎 が 人気 を 呼ん で いる 。 昨日 行わ れ た 公演 [SEP] | 0.000258 |
[CLS] 歌舞伎 が 人気 を 呼ん で いる 。 昨日 行わ れ た 後援 [SEP] | 0.000000 |
[CLS] 歌舞伎 が 人気 を 呼ん で いる 。 昨日 行わ れ た 好演 [SEP] | 0.000000 |
[CLS] 歌舞伎 が 人気 を 呼ん で いる 。 昨日 行わ れ た 高遠 [SEP] | 0.000004 |
期待されるように「公演」の確率がいちばんたかくなっています。
ひとつめの文を「先生の著書は人気である。」とかえると、確率はつぎのようになります。
トークン | 確率 (%) |
---|---|
[CLS] 先生 の 著書 は 人気 で ある 。 昨日 行わ れ た こう 宴 [SEP] | 0.000000 |
[CLS] 先生 の 著書 は 人気 で ある 。 昨日 行わ れ た 公演 [SEP] | 0.000239 |
[CLS] 先生 の 著書 は 人気 で ある 。 昨日 行わ れ た 講演 [SEP] | 0.003338 |
[CLS] 先生 の 著書 は 人気 で ある 。 昨日 行わ れ た 公園 [SEP] | 0.000093 |
[CLS] 先生 の 著書 は 人気 で ある 。 昨日 行わ れ た 後援 [SEP] | 0.000008 |
[CLS] 先生 の 著書 は 人気 で ある 。 昨日 行わ れ た 好演 [SEP] | 0.000000 |
[CLS] 先生 の 著書 は 人気 で ある 。 昨日 行わ れ た 高遠 [SEP] | 0.000005 |
こんどは「講演」の確率がいちばんたかくなります。このように大規模言語モデルは文をまたいだばあいの共起情報も、もっていることがわかります。
ひらがなIMEは、本文のテキストをみて、それを置換するかたちでかな漢字変換をおこないます。大規模言語モデルで評価するときには、変換する部分よりまえのテキストもふくめて評価をしています。その結果、入力中の文よりもまえの文に応じて変換候補をかえることができています。
まとめ
最新のひらがなIMEでは、かな漢字変換処理に大規模言語モデルを利用できるようにしました。言語モデルを利用しているときは、変換したとき、いちばん出現確率のたかい語があらかじめ選択されています。その結果、つかいはじめたときから、学習のすすんだ漢字辞書をつかっているような感じになっています。
ひらがなIMEはもともとは漢字のすくない文章を入力しやすくすることを目的に開発をしたIMEです。梅棹忠夫さんの著書にみられるような表記法を日本語入力IMEでつかいやすくしたかったのです。
これまでのIMEは漢字をつかいすぎてしまうところがありました。「此方」というような表記をつかっているひとをときどきみかけます。よみかたは「こちら」です。使用する漢字を常用漢字表内にある漢字にかぎるようにする。それだけでも、学校でならわない、こうした漢字が文章のなかにでてくることをふせげます。いまの本のなかには、みたこともない漢字やよめない漢字がたくさんでてくる本もあります。そうした本は常用漢字表にない漢字や音訓をつかっているので、よめなくてもしかたがありません。せめてルビがふってあるとよいのですけれども。ひらがなIMEの漢字辞書は、なまえをのぞくと常用漢字表内のよくつかわれる語にしぼりこんであります。
梅棹さんは「ワープロの出現は、問題の一部を解決した。と同時に、まだ未解決の問題がたくさんのこっていることを国民にわすれさせた」(『日本語と事務革命』, p226)とかきしるしました。『新明解国語辞典』の編集などでもしられる柴田武さんも「ワープロは決して国語問題の終止符じゃないぞ、ということです」(『国語施策百年の歩み』, 文化庁, 2003, p.34)とのべました。国立国語研究所の所長をつとめた野元菊雄さんは国語を波にたとえて「今は、それが少しマイナスの方向へ動いている。だけれども、いつまでもマイナスじゃなかろう」(同, p.32)とのべていました。
国語の表記法というのは、まだ進歩の途中にあるもののようです。国語がプラスの方向にふたたびすすめるように、ひらがなIMEがなにかの役にたてばとおもっています。