2022年9月8日木曜日

テキスト変換ツール text-utils を作った

テキスト変換ツール text-utils を作りました。



テキストエディタを使っていると、ちょっとした操作をサクッとこなせるメニューが欲しくなることがあります。 たとえば普段よく使っている vim で苦手なのは、正規表現のエスケープです。 他の仕様とズレてて使いにくい。他にもゼロ埋め連番などは毎回困ります。 Linux コマンドで一番苦手なのは、cut コマンドで列を抽出するコマンドです。 暗記していたら時々便利だけど、覚えていません。そんな機能はたくさんあります。

どれも JavaScript で処理するコードが簡単に作れるとわかっていても、 たまに使うくらいの場合コードを書くのが面倒ですし、案外時間も掛かります。 検索エンジンで関数やコマンドを調べるのも面倒です。 Web 化の進んできた昨今では、そろそろ Linux コマンドに依存する必要もなくなってきています。 事前にメニューを用意しておいて、ワンボタンで実行できる Web エディタが欲しいなあと思って、ノリで作りました。 ただノリで作った割には、自分でもかなり使っている気がします。

最低限ほしかった機能はサクッと作ったので公開しました。 他の変換ツールと違って JavaScript を編集して実行できるようにしておいたので、上級者にとっても便利なルールになっています。 地味につよつよな機能が搭載されていたりもするので、割と使い勝手は良いはず。 何か欲しい機能があれば、追加します。 たまに見かける MD5 / SHA1 みたいなハッシュ値ツールって、私は最近一度も使ったことないので作らなかったんですが、使う人いるのかな?

一度作ってしまえば今後は調べる必要がないので気楽ですね。 ツールとしても便利ですが、サンプルコードとしても使いやすいです。 あまり難しい実装はないので、実装の確認にもちょうど良かったです。 絵文字だけはミスりやすいので要注意だなと感じます。

2022年9月2日金曜日

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

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



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

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

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

改善できる?

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

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

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

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

なんとかできた

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

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