wktk入力をGPT-2 & 青空文庫で仮検証してみる

前回、kwsk入力という名前で、打鍵数が半分で済むかもしれない新しい入力方式ができるのではないかという記事を書いた。

funatsufumiya.hatenablog.com

それからしばらくが経ち、呼び名をkwsk入力じゃなくてwktk入力」とすることにしたのだけれど (その方が楽しそうな名前なので)、なかなか実装する時間が取れないので、せめてGPT-2という機械学習モデルを使って、以前の記事中にあるwktk記法から普通の文章に変換する組み合わせをひたすら学習させて、その実力を検証してみることにした。

学習にはとりあえず手元にあった青空文庫のデータを使い、以下のようなデータを30MB分くらい使って学習素材とした。

===
srykohhansgtwttdmd
それよかお母あの仕事を手伝うもんだ
===
n
な
===
sstrkdaskshtrtkkry
そしたらこんだ浅草へ連れてくからよ
===
sgkmdstnej
小学校も出てねえじゃ
===
imdk
今時
===
kznmdrrnekry
小僧にも出られねえからよ
===
tttoygktwhsmndat
と父親が口を挾むのであった
===
tmzhhtsthhoywmt
富次はほっとして母親を視た
===

青空文庫なのでちょっと文体が古風なのだけが玉にキズだけど、仮検証には十分。

ちなみに実際のコードは以下で、gistとして公開済み(中身はGoogle Colab用)。ただし、前処理の aozora_all_texts.txt には青空文庫の文章(文章であれば違うものでも大丈夫)が事前に入っているものとして書かれていて、/content/drive/Shareddrives/colab/wktk_aozora_220220 は個々人の環境に応じて別のフォルダに書き換える前提。

で、1時間くらい学習させたところで試しに実行させてみた。

まずは ohygzms (おはようございます、のつもり)。毎回10パターン生成させてみることにした。

=== ohygzms  お早うございます
=== ohygzms  おはようございます
=== ohygzms  お早うございます
=== ohygzms  遅くございます
=== ohygzms  お早うございますの
=== ohygzms  お早うございます
=== ohygzms  お早く御座います
=== ohygzms  お早うございます
=== ohygzms  お早うございまする
=== ohygzms  お早うございます

おお、この時点でもうめちゃくちゃ感動。正直全く文章にならないと思っていたので、GPT-2 (rinna/japanese-gpt2-medium) の実力に驚きを隠せない。

(GPT-2でこのレベルだと、GPT-3に生成させたくなってくるけど、自分GPT-3は検証環境持ってないや…。)

次は、sieb (そういえば、のつもり)。

=== sieb  そういえば今晩は』
=== sieb  そういえば ===
=== sieb  そういえば今年は
=== sieb  そういえばいゝね
=== sieb  そういえばこの界隈では
=== sieb  そういえばん』 『よしいえばん』
=== sieb  そういえば 去年あたり
=== sieb  そういえば今晩は
=== sieb  そういえばさっきまで
=== sieb  そういえば) ===

おお、ちゃんとできてるのもあるし、その先まで生成しちゃってるのがGPT-2らしくて可愛い。続きの文章はいかにも青空文庫という感じ。

もう少し長い文章も生成させたいので、次は kynghnhnnksr (今日のご飯は何かしら、のつもり)。

=== kynghnhnnksr  今夜の御飯は何にかしら
=== kynghnhnnksr  急に五百の兵の中に去り
=== kynghnhnnksr  きょうの御辺の不運に苦し
=== kynghnhnnksr  きょうのごはいはいにぬけされ
=== kynghnhnnksr  巨きな画風にはなにかしら
=== kynghnhnnksr  今日の御船は七輛の計らしい
=== kynghnhnnksr  今日の御船は何かしら
=== kynghnhnnksr  きょうの群盗はなにか知らん
=== kynghnhnnksr  こや人間は人にのこされ
=== kynghnhnnksr  きょうの御本人はなにか知らん

奇跡的に最初の一つはほぼ正解してるけど、kyが「今日」じゃなくて「今夜」になってるし、他の候補も、ghn =「ご飯」 のつもりが、ごふね?とか「画風に」とか「ご本人」とかになっているのが面白い。kyn も「急に」になってたり、kyとnghで区切られて「こや人間は」と謎の文章になっていたりして、この辺がwktk記法の曖昧さを物語っている。

最後に、kwsk (詳しく) を出させたいので、kwskosetkds (詳しく教えてください、のつもり)。

=== kwskosetkds  こわさけ教えてください
=== kwskosetkds  会わせる顔を添えてくだせ
=== kwskosetkds  詳しい記憶を添えてください
=== kwskosetkds  気をしっかり教えて下さい
=== kwskosetkds  子をしっかりおすえつけ下さい
=== kwskosetkds  小きを教えてください
=== kwskosetkds  詳しくお教え戴戴戴す
=== kwskosetkds  気をしかおすえて下さい
=== kwskosetkds  香を挿しおしつけ出す
=== kwskosetkds  気をすこし抑えて下さい

なかなか面白い結果になった (笑)。「気をすこし抑えて下さい」とか、確かにそうも読めるのがなるほどなという感じ。「詳しく」という単語は1パターンでしか登場しなかったけど、学習データの特徴がそのまま出てて面白い。

ちなみにこんなうまくいった結果ばっかりでは全然なくて、例えば snsnjksknkt (先生の次回作に期待、のつもり) と入れるとこんな感じ。

=== snsnjksknkt  そんな品じゃない高価すぎな刀
=== snsnjksknkt  その真に邪な感情か
=== snsnjksknkt  その信念に確信して来た
=== snsnjksknkt  その死の十九カ月間
=== snsnjksknkt  その真の乗客
=== snsnjksknkt  その才能に驚かぬこと
=== snsnjksknkt  その三の述懐のこつゝきに
=== snsnjksknkt  その少年ジャケツケの件
=== snsnjksknkt  その少年も若しこんな事
=== snsnjksknkt  その死に殉かなかつた

青空文庫的にはこのwktk記法はそう見えるのかと思うと面白いし、よく見ると雰囲気だけ合わせてるのがGPT-2の特徴を物語っている。「そんな品じゃない高価すぎな刀」ってどんな刀なの…。

まとめ

ということで今回は、wktk記法の実力を仮検証してみるために、1時間程度だけ青空文庫をもとに学習させた機械学習モデルがどんな文章を作ってくれるかを観察してみた。

このままもっと現代的な文章を使ったらどうなるのかも気になるけど、通常のIMEで使われているような重み付けをつけて普通に実装しても、意外と実用性をもった入力方法になるんじゃないかなという予感がした。

年度末は忙しくて次は一体いつ進展があるかわからないけれど、いつかこの入力方式をIMEにして実際の文章を打ってみたいなと思う。(似たような入力方式ってGitHubとかにないのかな…?IME作ったことないので、本気で作るとたらベースにできるコードが欲しい…。)