2023年12月1日金曜日

漢字の画数を調査した

こども漢字辞書 を改善するために、漢字の画数を調査しました。

漢字の画数を取得できるリソースは様々ありますが、厳密なチェックをしたことはありませんでした。 使えるデータの中でどれが一番信用できるか常用漢字のリストをチェックしたところ、以下になりました。 特に酷いのが UnihanXML で、2136 文字中、2052 文字ずれています。もはや合っているほうが少ない。これはひどい。
$ deno run -A check-stroks.js
check 2136 kanjis:
diff animCJK: 1
diff joyoKanji: 5
diff mojikiban: 5
diff cjkvi: 145
diff unihanIRGSources: 177
diff unihanXML: 2052
やはり画数を真面目に扱っている KanjiVGanimCJK が一番正確です。 joyoKanji は古い常用漢字しか対応していないため 4つ間違いが増えていますが、データとしては完璧です。 MJ 文字 も良い精度ですが、フォーマットが地獄という問題があります。 それ以外の画数データは使えません。 ちなみに KanjiVG, animCJK, joyoKanji で画数が異なる文字は一つだけしかありません。 それが「衷」で、9画と 10画のどちらが正しいのかという問題があります。 結論から言えば どちらでもいい ようですが、 学校を基準にするなら 9画が正しいようです。

常用漢字までなら Public Domain のjoyoKanji に修正を加える形で再利用ができるとわかったので、 @marmooo/kanji にも常用漢字の画数データを追加しました。 以下のように画数のレベル情報を取得できます。
import { Kanji, JoyoStrokes } from "@marmooo/kanji";

const joyoStrokes = new Kanji(JoyoStrokes);
joyoStrokes.getGrade("学"); // --> 8
joyoStrokes.getGrade("校"); // --> 10
joyoStrokes.getGrade("学校"); // --> 10

常用外漢字

常用漢字以上については、もう画数とかあんまり関係ないんじゃ…とは思うものの、 サポートするなら KanjiVG、ついで mojikiban の信頼性が高いように思います。animCJK は精度が下がるようです。 ただ上記はどれも人名用漢字をサポートしておらず、クロスチェックがしにくいため、常用漢字にとどめておくのが現状では無難そうです。 人名用漢字はそれなりに使われるものの割に、使えるデータは少ない印象です。 ちなみにライセンス不明なので現時点では使えないですが、kanji_kakusuu は人名用漢字もサポートしているみたいです。 人名用漢字以上を無理やりサポートするなら unihan_IRGSources.txt を改良した cjkvi が良さそうですが、古いですしミスは必ずあります。

unihan_IRGSources.txt は日々改善されていて、ver.2023-07-15 を使うと、JIS 第 4 基準でも cjkvi と精度的に大差なく、479 個のズレしかありませんでした。 unihan_IRGSources.txt が正しい保証はありませんが、使えると便利とは思ったのでこれも @marmooo/kanji でサポートしています。 unihan_IRGSources.txt を使えば JIS 第 4 基準以上のサポートもできるのですが、そもそもたいていのフォントで漢字を表示できないので、表示限界の JIS 第 4 基準 を採用しました。


0 件のコメント:

コメントを投稿