2022年9月2日金曜日

手書き漢字書き取りを作った

手書き漢字書き取り を作りました。 昔から作ろうと思ってはいたものの、ハードルが非常に高いので後回しにしていたアプリです。 個人開発では、漢字認識、熟語生成、読み方解析、文章生成の 4つの基礎技術が必要になるので、なかなかハードです。 最近公開した 80こくらいのアプリの中では、どう考えても一番難しい。



問題文にふりがなをふるのが難しい!

まず漢字の書き取り問題を出題するには、まず熟語などのリストをもとに、問題文を作らないといけません。 つまり文章生成という大問題にいきなりぶち当たりますが、wncc-ja でそれっぽいものを作ったので使います。 しかし次の大問題として問題文にふりがなをふる必要があります。 読み方が複数ある漢字があるため、ふりがなをふるのも難しいことに気付くかと思います。

最初は wncc-ja で作った例文を使えば良いと思っていたのですが、 「入り (はいり)」と「入り (いり)」の区別が難しくて、正確な出題が難しいです。 「難い (にくい)」と「難い (がたい)」のように意味が変わらなければ良いのですが、 「聖人 (せいじん)」と「聖人 (しょうにん)」のように意味が変わるケースもあります。 形態素辞書だけではどちらの読み方が正しいか判別不能そうで、正確な読みを取得することが困難です。

改善できる?

そこで複数の読み方が存在する語彙を除外してみました。 ちなみに複合語になったときに濁点の数が変わるようなものはそれっぽく除外しないと酷いことになるので注意は必要です。 一応上記の解決案で何とかなるとわかったものの、多少出題範囲が狭くなるため、他の解決案も模索しました。

まず根本的には既存の形態素解析の枠組みでは、正確な読みは推定するしかないところに問題があります。 基本語彙を使ってしまうと読みに重複が発生するので、重複が発生しなくなるまで語彙の基準 (SudachiDict) を A→C まで上げればよいかとも考えました。 読みに重複がなければ問題として使いやすいですし、なにより意味が一意に近づくということでもあるので、一見良さそうに思いました。 しかし基本語彙以外を使ってしまうと、役に立たない語彙が一気に増えてきて、あまりにも微妙でした。 勉強するなら誰しも、効率よく、正しく勉強して欲しいですから、駄目っぽいですね。

役に立たない語彙を増やさないよう、読みが重複したときだけ形態素解析辞書でするとどうだろう、とも考えました。 たとえば「仮名」には 4つの読み方が存在しますが、「かな/がな」以外の読み方は複合語では利用されません。 「かな/がな」の複合語だけ対象にすればいけるかなと思いました。 ただ SudachiDict でいけそうか軽く確認したところ、あまり使える気がしなかったので、諦めました。

やはり基本語彙以外は基本的に実用には難しい、と考えたほうが良さそうです。 間違っている可能性があっても出題するか、すべて削除するかですが、わたしは安全を取って後者にしました。 BERT も GPT-2 ももちろん駄目だし、どうしたものかと小一日ほど悩みながら色々検証した結果、 やはり wncc-ja が一番良いと結論付けました。難しいね。 何週間か寝かせて他に方法がないか考えましたが、現状ではこれが一番の気がします。

なんとかできた

基礎技術がてんこもりでハードルの高いアプリでしたが、なんとか成し遂げました。 現状の技術で突破できるギリギリを攻めているため、細かな点には課題があります。 改善するには、読みが一意になる条件をまとめた辞書を作るか、wncc-ja を改善するか。 どちらも地味な作業が必要で超難しく、Deep でポンの解決はできないです。 逆に言えばこのへんの研究を進めると形態素解析の精度も上がりそうというのが予想できます。

課題は多いものの、完成したアプリを遊んでみると結構いい感じです。 問題文が微妙な可能性を考慮して 問題文を変えられるようにしたのですが、普通のテストにはない機能でなかなか良いです。 巷の漢字テストも問題文がわかりにくい時があるので、これなら迷わなくて済みます。

0 件のコメント: