Files
AzooKeyKanaKanjiConverter/Docs/dicdata_format.md
2023-07-23 16:31:44 +09:00

85 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Dicdata Format
azooKeyの辞書データは次のようなフォーマットになっています。
NOTE: LOUDSそのものに関する解説は行いません。
## DicdataElement型
```swift
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の辞書ルックアップは次のように進みます。
1. 起動時に一度だけ`charID`が読み込みます。以降はこれを参照してクエリをID列に変換します。
1. クエリを受け取ったら、ID列に変換します。クエリの先頭の文字に対応する`louds``loudschars2`を読み込みます。Swift側ではこの2つをセットにして`LOUDS`構造体が作られ、キャッシュされます。
1. `LOUDS`を検索し、必要なノードの番号を列挙します。
1. クエリの先頭の文字に対応する`loudstxt3`を読み込み、必要な番号のノードに記録されたデータを読み出します。読み出したデータを`DicdataElement`形式に変換し、以降の処理で利用します。なお、`loudstxt3`の方はキャッシュしないので、必要になるたびにIOが走ります。
### `.louds`の構造
`.louds`ファイルはLOUDSのbit列を保存したものです。
### `.loudschars2`の構造
TBW
### `.charID`の構造
TBW
### `.loudstxt3`の構造
TBW
## 重みデータCID
品詞バイグラムの重み行列が疎行列になることから、CIDの重みデータはフォーマットを工夫しています。
TBW
## 重みデータMID
こちらは疎行列ではないため、重み行列をそのままバイナリ化したものが`mm.binary`として保存されています。
TBW