Anthyの辞書ファイル(1)

Date: 2019/05/10 (initial publish), 2021/07/13 (last update)

Source: jp/note-00008.md

Previous Post Top Next Post

TOC

まず、辞書関連ファイルの要点をレビューしました。

使ったanthyのソースはDebian BusterのベースとなるgniibeさんがUTF-8化パッチ を掛けかなり変更した0.3です。

Anthyの辞書関連定義ソースファイル

変換候補漢字が、読みに対して、その品詞、頻度とともに定義される「辞書」ファイルは、 その作成経緯により2種類の拡張子が使われています。

これらはすべてalt-cannadicmkworddicにあります。

単純な品詞や頻度だけでは正しい漢字選択ができない場合に対応する「用例辞書」 ファイルudictmkworddicにあります。

Anthyの辞書ソースファイル処理機構

上記の「辞書」ファイルと「用例辞書」ファイルは、mkworddicディレクトリー 中にビルド時に生成されるmkworddicにより読み込まれ、さらに負の頻度を持つ 「逆変換用辞書」データーが追加作成されます。

これを詳しく見ていきましょう。

mkworddicが-fオプションでdict.argsを指定して起動されます。dict.args は通常同一ディレクトリー内のdict.args.in`からビルド時作成されます。 これを変更することで組み込まれる辞書は調節できます。

dict.argsの設定内容の処理は、mkworddic/mkdic.c:execute_batch()で処理されます。

詳細は、mkworddicのソースをmkworddic/mkdic.cから追いかけると見えてきます。

ちなみに、anthy.wdicは、mkanthydic/ディレクトリーのファイルから生成するビルド 時用のバイナリープログラムmkfiledicにより、単語の条件付き連鎖発現頻度情報を整理 して生成する各種情報ファイルと統合され、漢字かな変換実行時に用いられるanthy.dic となります。

Anthyの辞書ソースファイル構造(基本)

mkanthydic/mkdic.c:push_back_word_entry_line()からコードを読むと辞書ファイルの 構造が分かります。

最も典型的な辞書ソースデーターファイルの構造は、半角スペースで区切られた以下の 構造をしています。

<ひらがな見出し語> [#<品詞>[*<頻度>] [<変換後文字列>]... ]...

#<品詞>に関しては後述する。

ただし、現在は「<ひらがな見出し語>」は30文字までに制約されています。この他、 プログラム内の各種文字列長は固定長でいろいろ制約があることが多いので要注意です。

またindex中の濁点は通常「が」のように1文字表現をしますが、1文字表現の無い 「う゛」は2文字表記されています。

辞書中に「う゛」を「ヴ」で置き換えた項目を入れることはDebianが使っている 0.3のソース中ではされていません。現在のanthyの入力対応は、ひらがな・ カタカナ・ローマ字で、入力はひらがなに変換してから漢字変換操作がされるので、 「ヴ」は自動的に「う゛」となります。だからたとえ、フロントエンドがibusの 場合で「ヴ」をひらがなに混ぜて返す仕様となっていても問題は起こりません。 辞書中の「<ひらがな見出し語>」に「ヴ」を書くのを加えるのは 使われない無駄なデーターとなるので好ましくありません。(辞書ファイル中の README中の文言は無視しましょう)

このソース辞書から作られるanthy.dic辞書中の、素(raw)の「<頻度>」の 典型的値は以下です:

Anthyの辞書ソースファイル構造(複合語)

複合語の収録のために、「<変換後文字列>」には特別の記述法があります。

かなかんじへんかんえんじん #T35 #_2仮名_3漢字_4変換_4エンジン

見てわかるように、_の後ろの数字は対応するindex中文字の字数です。 「う゛」は2文字扱いとなります。頻度情報は省略されているので1です。 当然ですが、index側や変換先文字列の有効部分には、半角数字や#_は含められまれません。

mkanthydic/mkdic.c:push_back_word_entry()を見たらわかるように、 複合語の収録情報の#_2仮名_3漢字_4変換_4エンジンは、そのまま 辞書中に記録されています。

この複合語の数字はmkworddic/mkdic.c:reverse_multi_segment_word()の 複合語の逆変換でも利用され以下の逆変換辞書が生成されています。

仮名漢字変換エンジン #T35 #_2かな_2かんじ_2へんかん_4えんじん

Anthyの用例辞書ソースファイル

Anthyの用例辞書(udict)ファイルは、以下の意味がある。

だから、以下のような感じとなる。

# Comment
あ (く) #K5r 空
ばしょ () #T35 場所
ようりょう () #T35 容量
-------------------
あ (く) #K5r 開
とびら () #T35 扉
どあ () #T35 ドア
ひきだし () #T35 引き出し
-------------------
...

品詞

例えば、辞書データーソースファイル中で品詞を示すK5rは、辞書データーソース以外のソースの数ヶ所で定義・説明・使用されています。

src-worddic/wtab.h中で用いられている定数はanthy/wtype.h中に定義されていて、 その説明はdoc/POSをまず読むと良いでしょう。他の品詞も同様です。

この、src-worddic/wtab.hsrc-worddic/wtype.cの中で次のように利用され、 wttable wt_name_tab[]という配列に読み込まれて、辞書内の品詞ニモニック文字列 と品詞の属性ベクトル量を関連付けます。

struct wttable {
  const char *name;
  int pos;
  int cos;
  int scos;
  int cc;
  int ct;/*カ変など*/
  int flags;
};

/* 辞書中の品詞の名前を品詞に変換するテーブル */
static struct wttable wt_name_tab[]= {
#include "wtab.h"
};

ただ、品詞の属性ベクトル量であるstruct wttableは、6*8=48バイトもの 大きさなので、anthy/wtype.hの中で定義された以下の構造体wtype_tを用いて 29bit(4バイト以下なので8バイトの整数1つに収まる)のコンパクトな ビットフィールド表現でメモリー中に保持されます。

/** 品詞 */
struct wtype{
  unsigned int pos  : POS_BITS;
  unsigned int cos  : COS_BITS;
  unsigned int scos : SCOS_BITS;
  unsigned int cc   : CC_BITS;
  unsigned int ct   : CT_BITS;
  unsigned int wf   : WF_BITS;
};

typedef struct wtype wtype_t;

この、辞書内の品詞ニモニック文字列からwtype_tで表現された品詞のメモリー内 表現形式への変換は、src-worddic/wtype.c:anthy_type_to_wtype()で行われます。 この関数は与えた品詞ニモニック文字列によって以下の挙動をします。

この、wtype_tの形式に収まったデーターは直接触りにくいので、 anthy_wtype_get_*()という各品詞の属性毎のアクセス関数があります。

ここでちょっと注意すべきは、品詞を読み込む際に、 mkworddic/mkdic.c: if (!strcmp(name, "#T35")) { ですべての#T35#Tと変換してからメモリーに読み込み処理を行っていることです。

また、この#T35は多用されています。src-util/typetabを見ると以下とあり、 所謂、形容動詞語幹でも無く、形容詞語幹でも無く、サ変動詞の語幹でもない、 平凡な「名詞」のようです。

T35
品詞            =       名詞
な接続          =       n
さ接続          =       n
する接続        =       n
語幹のみで文節  =       y
格助詞接続      =       y

文法係り受け定義関連は、またこの次に読んで行きましょう。

Anthyの辞書ファイル(実行時)

anthy.dic辞書は、実際のかな漢字変換の実行時には src-worddic/word_lookup.c:parse_wtype_strにより、プログラム中に読み込まれ れます。その際「<頻度>」は8倍されます。指定が無い場合には8ー2=6とな ります。これはlibanthydic内の話です。またこの8倍というのは、 src-worddic/dic_main.h:#define FREQ_RATIO 8で定義されています。 あと、いろいろ細かな調整もあるようにも見受けます。

デバグなどで実行時の「<頻度>」を出力する際には、この点要注意です。

Previous Post Top Next Post