新規作成  編集  差分  FrontPage  ページ一覧  検索  更新履歴  編集履歴  管理

ChaSen's Wiki - 辞書の構造 差分

  • 最後の更新で追加された行はこのように表示します。
  • 最後の更新で削除された行はこのように表示します。

!茶筌の辞書ファイル 
茶筌の辞書は3つのファイルからなります。

* *.da - Darts ファイル
* *.lex - コスト計算に必要な情報
* *.dat - その他の情報

!.da ファイル

[[Darts]] のデータ構造を
そのままファイルにダンプしたものです。

見出し語を鍵として、.lex ファイルのオフセットを値としています。

!.lex ファイル
おもにコスト計算に必要な情報を含むファイルです。

このファイルは以下の情報を含みます。

*見出し語の長さ
*同一表記語の数
*品詞 ID
*屈折タイプ (活用型)
*屈折形 (活用形)
*コスト重み
*接続表 ID
*その他情報のインデックス (.dat ファイルのオフセット)

[[Darts]] では一つの鍵にたいして値を一つしか持てないので、
表記が同じ語が複数ある場合に対応するため
同一表記語の数を記録しています。

また、[[Darts]] の commonPrefixSearch() では検索した結果の値に対応する
鍵の長さがわからないので、見出し語の長さも必要です。

ちなみにコスト計算には、見出し語の長さ、コスト重み、接続表 ID の3つしか使いません。

!! ファイルの構造
.lex ファイルは次の構造の繰り返しでです。

struct {
short headword_len; //見出し語の長さ
short lex_num; // 同一表記語の数
da_lex_t lexicons[lex_num];
};

また、da_lex_t は lib/dartsdic.h で以下のように定義されています。

typedef struct {
unsigned short posid; // 品詞 ID
unsigned char inf_type; // 屈折タイプ
unsigned char inf_form; // 屈折形
unsigned short weight; // コスト重み
short con_tbl; // 連接表 ID
long dat_index; // *.dat ファイルのオフセット
} da_lex_t;

!.dat ファイル
このファイルは表示のときにしか使われません。
以下の情報を含みます。

*読み (語幹のみ)
*発音 (語幹のみ)
*原形
*付加情報
*複合語情報

このファイルの情報は活用語のすべての活用形で共有するため、
読みや発音は語幹のみ記録されています(stem_len が負の値のときは語尾も含む)。

!!ファイルの構造
.dat ファイルの構造は次のようになっています。

struct {
da_dat_t dat;
char reading[];
char pron[];
char base[];
char info[];
};

da_dat_t は lib/dartsdic.cpp で以下のように定義されています。

typedef struct {
short stem_len; // 語幹の長さ
short reading_len; // 読みの長さ
short pron_len; // 発音の長さ
short base_len; // 原形の長さ
short info_len; // 付加情報の長さ
long compound; // .lex ファイルのオフセット
} da_dat_t;

!複合語
茶筌には、コスト計算では一語として扱い表示のときには構成語にわけて表示する複合語機能があります。

この複合語の構成語もほかの語と同じように .lex ファイルと .dat ファイルに記録されていますが、.da ファイルには登録されていません。

一つの複合語の構成語は .lex ファイルの中で連続して配置されています。
また、構成語は .lex ファイルの使い方が通常の語と少しことなります。

struct {
short headword_len; //見出し語の長さ
short has_next; // 後続語の有無
da_lex_t lexicons;
};

lex_num だったところが has_next になっています。
この値が 1 のときは後続の語がこの直後に存在し、0 のときはこの語で構成語リストが終了します。