lindera-dictionary 0.7.1

A morphological dictionary loader.
Documentation
# linderaが保持しているバイナリファイルについて

LinderaがTokenizerの内部処理で利用しているバイナリファイルがいくつかあります。
これらのファイルがそれぞれどんなデータが入っていて、どんな場面で利用されているのかについて、まとめておきます。
また、これらのファイルは各辞書のビルダー(例 : lindera-ipadic-builder)によって生成されるファイルでもあります。

## char_def.bin

文字種のカテゴリーマッピングファイル。

### データ構造

`CharactereDefinitions`構造体を`bincode`でシリアライズしたもの

### データの内容

`CharacterDefinitions`は3種類のデータを保持。

* category_names : カテゴリ名のベクタ
* category_definitions : カテゴリデータのベクタ
    * カテゴリデータは以下の通り
        * invoke
        * group
        * length
* mapping : UCS2のコードポイントをカテゴリにマッピングするためのテーブル 
    
## matrix.mtx

Tokenizer内部でビタビアルゴリズムで利用するコストの連接表。

### データ構造

[`matrix.def`](https://taku910.github.io/mecab/dic-detail.html) (2次元配列)を`[i16]`のベクタ(1次元配列)に詰め込み、LittleEndianでシリアライズしたもの

### データの内容

* 0番目:前件サイズ(forward_size)
* 1番目:後件サイズ(backward_size)
* 2番目以降:[左文脈ID][右文脈ID]=コストという2次元配列を1次元配列化したもの。値としてはコストが入る。

> 内部実装では、backward_sizeを利用して1次元配列化している

## unk.bin

未知語の定義ファイル。
`char.def`で定義された文字種のカテゴリを見出し語として、定義した辞書ファイル。

### データ構造

`UnknownDictionary`構造体を`bincode`でシリアライズしたもの

### データの内容

* category_references : `char_def.bin`のカテゴリ名に対する、`word_id`(=`unk.def`の行番号)のベクタ(2次元ベクタ)。
* costs : `WordEntry`構造体のベクタ。`unk.def`の行数がベクタの長さ。
    * word_id(`u32`) : 使用しないので、`u32::MAX`
    * cost_id(`u16`)  : 未知語の左文脈ID(左右の文脈IDが同一のものだけを利用)
    * word_cost(`i16`) : 未知語のコスト 

## dict.da

辞書の単語一覧をルックアップするためのDoubleArrayTrieデータ構造。
キー(`str`)を元に、値(`u32`)を取り出す。
後述する`dict.vals`と合わせて利用する。

### データ構造

[`yada`](https://github.com/takuyaa/yada/)により生成されるDoubleArrayTieをシリアライズしたバイナリ。

### データの内容

* キー(str) : 辞書の見出し語 
* 値(u32) : `dict.vals`にある値を取り出すための`offset_len`をエンコードしたもの。
    * len : 下位5ビット
    * offset : 上位27ビット

## dict.vals

辞書のデータのうち、ビタビアルゴリズムで使用する必要最低限のデータ。
見出し語に対応するデータの取り出しには、`dict.da`が必要。

### データ構造

辞書のデータのうち、`WordEntry`構造体のデータをバイト配列にシリアライズしたデータ。
バイト配列には、見出し語に対応する`Vec<WordEntry>`が、見出し語の辞書順(RustのBTreeMap)で保存されている。

### データの内容

`WordEntry`構造体(`WordId`に関しては、フラグは辞書の再読み込み時に付与するため、バイナリデータには保存しない)
* word_id(`u32`) :  見出し語ID(Rustで0始まりで付番したもの。辞書ファイルのIDとは異なる)
* word_cost(`i16`) : 見出し語のコスト 
* cost_id(`u16`)  : 見出し語の左文脈ID(左右の文脈IDが同一のものだけを利用)

## dict.wordsidx

`dict.words`をルックアップするためのオフセットを格納。

### データ構造

見出し語IDの昇順に`dict.words`のオフセット(`u32`)をバイト配列にしてシリアライズしたバイナリ。

### データの内容

* `dict.words`のオフセット(`u32`)

## dict.words

辞書の見出し語、コスト以外の情報(品詞、読みなどの付加情報)を保持するデータ構造。
`Vec<String`が見出し語IDの昇順に保存されている。

### データ構造

`bincode`でシリアライズした`Vec<String>`のバイト配列。

### データの内容

* `Vec<String>` : 辞書ごとに保持している項目が異なるので、辞書ごとに何が入っているか確認が必要。