Previous Post | Top | Next Post |
TOC
まず、辞書関連ファイルの要点をレビューしました。
使ったanthyのソースはDebian BusterのベースとなるgniibeさんがUTF-8化パッチ を掛けかなり変更した0.3です。
Anthyの辞書関連定義ソースファイル
変換候補漢字が、読みに対して、その品詞、頻度とともに定義される「辞書」ファイルは、 その作成経緯により2種類の拡張子が使われています。
- Anthy用辞書:
*.t
- Canna用辞書:
*.ctd
これらはすべてalt-cannadic
とmkworddic
にあります。
単純な品詞や頻度だけでは正しい漢字選択ができない場合に対応する「用例辞書」
ファイルudict
はmkworddic
にあります。
Anthyの辞書ソースファイル処理機構
上記の「辞書」ファイルと「用例辞書」ファイルは、mkworddic
ディレクトリー
中にビルド時に生成されるmkworddic
により読み込まれ、さらに負の頻度を持つ
「逆変換用辞書」データーが追加作成されます。
これを詳しく見ていきましょう。
mkworddic
が-fオプションで
dict.argsを指定して起動されます。
dict.args は通常同一ディレクトリー内の
dict.args.in`からビルド時作成されます。
これを変更することで組み込まれる辞書は調節できます。
dict.args
の設定内容の処理は、mkworddic/mkdic.c:execute_batch()で処理されます。
read
コマンドは指定された「辞書」ファイルをread_dict_file()
で読み込みます。read_uc
コマンドは指定された「用例辞書」ファイルをread_udict_file()
で読み込みます。build_reverse_dict
コマンドは「逆変換用辞書」データーをbuild_reverse_dict()
で作成し追加します。write
コマンドはメモリー中の全辞書データーを指定されたファイル(anthy.wdic
)にwrite_dict_file()
で書き出します。
詳細は、mkworddic
のソースをmkworddic/mkdic.c
から追いかけると見えてきます。
ちなみに、anthy.wdic
は、mkanthydic/
ディレクトリーのファイルから生成するビルド
時用のバイナリープログラムmkfiledic
により、単語の条件付き連鎖発現頻度情報を整理
して生成する各種情報ファイルと統合され、漢字かな変換実行時に用いられるanthy.dic
となります。
Anthyの辞書ソースファイル構造(基本)
mkanthydic/mkdic.c:push_back_word_entry_line()
からコードを読むと辞書ファイルの
構造が分かります。
最も典型的な辞書ソースデーターファイルの構造は、半角スペースで区切られた以下の 構造をしています。
<ひらがな見出し語> [#<品詞>[*<頻度>] [<変換後文字列>]... ]...
<ひらがな見出し語>
(index)は、全角ひらがな以外の半角・全角の数字や記号も許されます。*<頻度>
は省略可能です。<変換後文字列>
は同音異字に関して繰り返し羅列可能です。#<品詞>*<頻度> [<変換後文字列>]...
も繰り返し羅列可能です。
#<品詞>
に関しては後述する。
ただし、現在は「<ひらがな見出し語>」は30文字までに制約されています。この他、 プログラム内の各種文字列長は固定長でいろいろ制約があることが多いので要注意です。
またindex中の濁点は通常「が」のように1文字表現をしますが、1文字表現の無い 「う゛」は2文字表記されています。
辞書中に「う゛」を「ヴ」で置き換えた項目を入れることはDebianが使っている 0.3のソース中ではされていません。現在のanthyの入力対応は、ひらがな・ カタカナ・ローマ字で、入力はひらがなに変換してから漢字変換操作がされるので、 「ヴ」は自動的に「う゛」となります。だからたとえ、フロントエンドがibusの 場合で「ヴ」をひらがなに混ぜて返す仕様となっていても問題は起こりません。 辞書中の「<ひらがな見出し語>」に「ヴ」を書くのを加えるのは 使われない無駄なデーターとなるので好ましくありません。(辞書ファイル中の README中の文言は無視しましょう)
- src-main/main.c:need_reconvert()
- src-worddic/word_dic.c:anthy_get_seq_ent_from_xstr()
このソース辞書から作られるanthy.dic辞書中の、素(raw)の「<頻度>」の 典型的値は以下です:
- 良く使われる言葉は大きく、500ー600程度
- 普通の言葉は、100ー200程度
- 単漢字などは、10ー30程度
- 指定が無い場合には、1
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
)ファイルは、以下の意味がある。
#
で始まる行はコメント- 1行めが、注目する単語(読み、活用部、品詞、漢字)
- 2行め以降が、それと用法上関連が強い単語(読み、活用部、品詞、漢字)
-
で始まる行は用例の区切り
だから、以下のような感じとなる。
# Comment
あ (く) #K5r 空
ばしょ () #T35 場所
ようりょう () #T35 容量
-------------------
あ (く) #K5r 開
とびら () #T35 扉
どあ () #T35 ドア
ひきだし () #T35 引き出し
-------------------
...
品詞
例えば、辞書データーソースファイル中で品詞を示すK5r
は、辞書データーソース以外のソースの数ヶ所で定義・説明・使用されています。
- 定義:
src-worddic/wtab.h:{"#K5r",POS_V,COS_NONE,SCOS_NONE,CC_K5,CT_HEAD,WF_INDEP|WF_MEISI /* "カ行五段(連用形名詞)"*/},
— 品詞の属性定義 - 説明:
src-util/typetab:K5r
— ユーザー辞書登録で普通の人にわかる定義と関連付ける説明テンプレート - 使用:
depgraph/indepword-wt.txt:#K5r @カ行5段活用動詞語幹 @カ行5段活用動詞名詞化語幹
— 文法係り受け定義に使用
src-worddic/wtab.h
中で用いられている定数はanthy/wtype.h
中に定義されていて、
その説明はdoc/POS
をまず読むと良いでしょう。他の品詞も同様です。
この、src-worddic/wtab.h
はsrc-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()
で行われます。
この関数は与えた品詞ニモニック文字列によって以下の挙動をします。
#
で始まらない場合には返り値がNULLで、wtype_t
はanthy_wt_none
を返します。- 品詞の属性ベクトル量に変換するテーブル内に存在した場合には返り値が品詞ニモニック文字列で、
wtype_t
はテーブル変換ルールで定義される値を返します。 - 品詞の属性ベクトル量に変換するテーブル内に存在しない場合には返り値がNULLで、
wtype_t
はanthy_wt_all
を返します。
この、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 |