高精度に漢字変換できるSKK辞書を作った(四角号碼、正假名)

κeenです。漢字変換高精度に行うためにSKK辞書をいくつか作ったので報告です。

辞書

GitHubに上げています。手元にダウンロードして各々好きなように使って下さい。ライセンスはCC BY-SA 3.0です。

SKK_JISYO.wiktionary

解決したい問題と対応する辞書

SKKに限らずほとんどの日本語での漢字変換は読みを入力してそれに該当する候補から漢字を選択していると思います。この方法は直感的で分かりやすいのですが、私は2つ問題を感じています。

  1. 同じ読みに対する候補が多すぎる
  2. 読みが分からない漢字を変換できない

1の候補の数については特に音読の入力に対して顕著です。例えば「しょう」で変換するとSKK_JISYO.Lにある候補は174あり、その中から目的の漢字を目grepで探す作業がはじまります。変換したい漢字は思い浮かんでいるはずなので、この目grepはインタフェースが洗練されていないが故の無駄ですよね。もっと選択性の高い入力方法があれば目grepの手間を少なくできます。

2については人それぞれでしょうか。私は知らない漢字を見たら調べたくなるので音義共々分からない漢字を入力したい需要があります。例えば「罕」とかは読みや意味を答えられる人は少ないんじゃないでしょうか。文字データならコピペが使えるんですが画像や活字だとどうしても自分で入力しないといけません。字形はそこまで複雑ではないのでどうにかして字形をベースに入力できる方法があると嬉しいです。

四角号碼辞書

上記の主に2、補助的に1を解決するのが四角号碼辞書です。四角号碼という漢字に振られた番号で入力できます。四角号碼は漢字字典なんかの索引にも使われています。

四角号碼を日本語にすると「四隅コード」になるそうです。その名の通り漢字の四隅の画(と補助的に右下の画のすぐ上)の形から数字を割り当てます。例えば「罕」なら37401のコードが割り当てられます。この数字から変換できるようにしたのが四角号碼辞書です。例えば以下の入力で

▽3740

以下のように罕が変換できます。

▼罕

3740に該当する漢字は「罕」の他にも「写」もありますが、補助的な数字(附画)である1をつて37401で変換すれば「罕」のみ候補に出てきます。 辞書には以下のように数字4つのものと附画を加えた5つのもののエントリが入っています。

3740 /罕/
37401 /罕/

このように極めて高精度に入力したい漢字が入力できるのが四角号碼辞書です。

ここでみなさんが疑問に思うのは四角号碼を覚えられるのか?ということだと思います。四角号碼は字形のみから決まるのでルールさえ覚えれば個々の漢字のコードは覚えなくてよいです。そして慣れれば個々の漢字のコードはすぐに分かるようになります。具体的には30分ほど思いついた漢字の四角号碼を想像してみて、調べて合ってるかを認するゲームをやってみると慣れます。

一応注意点としては(多分中国の)楷書の書体を元に四角号碼が割り当てられているのでフォントの字形を元に想像すると間違うことがあるということです。例えば「戸」の一画目は横棒に見えるので1(横棒)かと思いきや、3(点)として扱われて四角号碼は30207となります。戸に関しては户の方の字形からとられた可能性もありますが、こういうフォント見た目と四角号碼が一致しないケースがあることは覚えておいて下さい。

歴史的仮名遣い辞書(experimental)

上記の主に1の問題を解決するのが歴史的仮名遣い辞書です。歴史的仮名遣いは正假名と呼ぶ人もいるようなので短いそちらを採用して以後正假名と呼びます。正假名により現代仮名遣いよりは選択性の高い変換を提供します。

例えば「巧匠」、「考証」、「高笑」、「工商」は現代仮名遣いでは全て「こうしょう」ですが、正假名ではそれぞれ「かうしゃう」、「かうしょう」、「かうせう」、「こうしゃう」と書き分けられます。これを利用して比較的選択性の高い変換を提供するのが正假名辞書です。そのまま正假名でのエントリが入っています。

正假名辞書はまだ実験的と位置付けています。理由は熟語に対応しておらず、上記の「かうしゃう」などは変換できません。単一の漢字のみに対応しているので「かう」と「しゃう」でそれぞれ別に変換しないといけません。将来的にはどうにかしたいですが、有力なソースがないので泥臭く既存の辞書を変換することになりそうで頭を痛めています。簡単な「こう」→「かう」の変換などで済めばまだいい(それでも大変)のですが、「桐生」は現代仮名遣いでは「きりゅう」ですが正假名では「きりふ」なので何かしら正假名と現代仮名遣いの対応ルールを作らないといけないので大変そうだな思ってます。

辞書には正假名によるエントリの他に現代仮名遣いのエントリに歴史的仮名遣いのアノテーションを付与したエントリも入れてあります。

せう /笑/
しょう /笑;セウ/
せふ /渉/
しょう /渉;セフ/

正假名は1つ1つ覚えるしかなくてつらいのでアノテーションで学習の補助になればと思います。

辞書の生成について

辞書のデータは日本語版Wiktionaryの漢字のページを元にしています。Wiktionaryに限らずWikipediaなどのWikimediaプロジェクトはダンプデータが利用可能です。少なくとも月に1度はダンプが生成されているらしいです。そのデータをダウンロードしてきて漢字のページを抜き出し、そこから四角号碼や正假名のデータをスクレイピングしています。

四角号碼は割とフォーマットが揃っていたので楽だったのですが、正假名のデータはかなり自由に書かれていてスクレイピングに苦労しました。例えば「」のページはかなりやんちゃでセミコロンなんかも使われています。このページは面倒なので対応してません。編集の方針を相談できるところがあればフォーマットを統一して回るのもできそうですがよく分からないので放置しています。

ダンプが月1で生成されるので辞書の方も同じ頻度で更新したいのですが、まだ辞書の生成には数ステップ必要になっています。漢字記事を絞り込むのにMySQLを立てる必要があるなど面倒なんですよね。せめてスクリプト1発で生成できるようにしたいなぁと思ってます。

結びに

ひとまず個人用に生成していますが、上記2つの辞書でSKKユーザの漢字変換が楽になれば幸いです。正假名の熟語対応についてはノープランなので何か良い方法が思い付く方は教えて下さい。

Written by κeen