mirror of
https://github.com/mii443/AzooKeyKanaKanjiConverter.git
synced 2025-08-22 06:55:26 +00:00
3.4 KiB
3.4 KiB
Dicdata Format
azooKeyの辞書データは次のようなフォーマットになっています。
NOTE: LOUDSそのものに関する解説は行いません。
DicdataElement型
struct DicdataElement {
// 単語の表記
var word: String
// 単語のルビ(カタカナ)
var ruby: String
// 単語の左連接ID
var lcid: Int
// 単語の右連接ID
var rcid: Int
// 単語のMID
var mid: Int
// 単語の基礎コスト (PValue = Float16)
var baseValue: PValue
// コストの動的調整
var adjust: PValue
}
注意すべき点は次のとおりです。
- 連語などの場合、
lcid
とrcid
が異なる値を取ることがあります。 - 単語の基礎コストは、歴史的な事情によって負の小数です。大きいほど頻出する単語でus。
- コストの動的調整は、誤り訂正などのためにコストを調整したい場合に使います。例えば「大学生」の基礎コストを「-10」としたとき、「たいがくせい」と入力した誤り訂正の結果として「大学生」が得られている場合は、
adjust
を-3のような値として、合計コストが-13であるかのように振る舞わせます。
DicdataElement
はDicdataStore
で辞書データファイルから生成されます。
辞書データファイル
辞書データは次の4つの種類のファイルからなります。
.louds
.loudschars2
.charID
.loudstxt3
まず、.louds
のファイルがLOUDS Trieをバイナリ形式で保存したものです。
次に、.loudschars2
は各ノードに割り当てられた文字を記録するものです。ただしUnicode文字列の代わりに、1バイトのCharacter IDで表現されています。このため、.loudschars2
は1バイトずつ処理できます。.charID
がCharacterをIDに割り当てるためのデータを格納します。
最後に、.loudstxt3
に各ノードに割り当てられたエントリーのデータが記録されています。
azooKeyの辞書ルックアップは次のように進みます。
- 起動時に一度だけ
charID
が読み込みます。以降はこれを参照してクエリをID列に変換します。 - クエリを受け取ったら、ID列に変換します。クエリの先頭の文字に対応する
louds
とloudschars2
を読み込みます。Swift側ではこの2つをセットにしてLOUDS
構造体が作られ、キャッシュされます。 LOUDS
を検索し、必要なノードの番号を列挙します。- クエリの先頭の文字に対応する
loudstxt3
を読み込み、必要な番号のノードに記録されたデータを読み出します。読み出したデータをDicdataElement
形式に変換し、以降の処理で利用します。なお、loudstxt3
の方はキャッシュしないので、必要になるたびにIOが走ります。
.louds
の構造
.louds
ファイルはLOUDSのbit列を保存したものです。
.loudschars2
の構造
TBW
.charID
の構造
TBW
.loudstxt3
の構造
TBW
重みデータ(CID)
品詞バイグラムの重み行列が疎行列になることから、CIDの重みデータはフォーマットを工夫しています。
TBW
重みデータ(MID)
こちらは疎行列ではないため、重み行列をそのままバイナリ化したものがmm.binary
として保存されています。
TBW