モデルファイル形式
Litsea のモデルは、シンプルなプレーンテキストファイルとして保存されます。
形式の仕様
<feature_name>\t<weight>
<feature_name>\t<weight>
...
<bias>
- 最終行を除く各行は、タブ文字で区切られた特徴量名と重みを含む
- 重みがゼロの特徴量は、ファイルをコンパクトに保つために省略される
- 最終行はバイアス項を単一の数値として含む
例
BC1:IK 0.3456
BC2:KI -0.1234
UW4:は 0.5678
UC4:I 0.2345
...
-0.0891
バイアスの復元
モデルの読み込み時に、バイアスは以下の式で復元されます:
bias_bucket_weight = -bias_value * 2 - sum(feature_weights_before_the_bias_line)
save_model で書き出されたファイルは常にバイアス行を最終行に置くため、この値は
すべての特徴量の重みの合計と等しくなります。レガシーモデル(例: RWCP.model)は
バイアス行をファイルの途中に置いており、それ以降の重み行も受け入れられます。バイアス
バケットはバイアス行より前の重みから計算され、従来のローダーの挙動と一致します。
バリデーション
ローダーは、不正な形式のファイルを黙って読み込まず、明示的なエラーとして拒否します:
- 空のファイル
- バイアス行を持たないファイル(ダウンロードの途中切断やコピーの中断で 典型的に発生する症状)
- バイアス行が 2 行以上あるファイル
- 重複した特徴量行
- **非有限(non-finite)**な重みまたはバイアス値(
NaN、inf、-inf)。これらは 放置するとすべてのスコア比較を汚染してしまいます
Averaged Perceptron モデルのローダーも同様に、クラス数ヘッダーを検証し、非有限な 重みを拒否します。
予測時:
bias = -sum(all_model_weights) / 2.0 (cached; read once per sentence)
score = bias + sum(model[feature] for feature in input_attributes)
ディスク上の形式は文字列キーのまま変わっていませんが、セグメンタは文字列に対して
直接スコアリングしません: ロード時に各特徴量行がパースされ、ホットループ用の
packed u64 整数キーへコンパイルされます
(予測パイプライン
を参照)。セグメンタの言語では生成し得ない特徴量(例: 他言語の文字種コード)は
このコンパイルで無視されます – 従来も入力属性にマッチし得なかったものと完全に
同じ扱いです。一方、バイアスは常にファイル内のすべての重みから計算されます。
二段構成モデル形式(litsea-two-stage v1)
二段構成モデルは、stage-1 の境界分類器、候補タグ語彙表(lexicon)、stage-2 の 単語単位タガーを、マジック行とセクションマーカーを持つ 1 つのプレーンテキスト ファイルにまとめたものです。セクションの順序は固定です:
litsea-two-stage v1
[params]
dominance\t0.99
[stage1]
<AdaBoost モデル形式: "feature\tweight" 行 + バイアス行 1 行>
[lexicon]
<surface>\t<TAG>:<count>[,<TAG>:<count>...]
[stage2]
<Averaged Perceptron モデル形式: クラス数、クラス名、重み>
[stage1]と[stage2]セクションには、上で説明した既存の形式がそのまま 埋め込まれ、既存のローダーで解析されます。[lexicon]の各行は、単語表層を学習コーパスで観測された UPOS タグと出現数に 対応付けます。出現数の多い順(同数はタグ名の昇順)に並びます。表層はタブと 改行を除く任意の文字を含むことができ、trim されないため、空白トークンも 表現できます。[params]セクションは省略可能です。唯一のキーdominanceは分類器スキップの 閾値で、範囲は(0.5, 1.0]です: 既知の表層のうち最頻タグが学習時の出現の この割合以上を占めるものは、stage-2 分類器を呼ばずにタグ付けされます。 セクションが無い場合の既定値は0.99です。- stage-2 のクラス名は有効な UPOS タグでなければなりません。すべての重み行と lexicon 行がタブを含むことと合わせて、内容行がセクションマーカーと衝突しない ことが保証されます。
この形式は純粋に追加的です: マジック行は AdaBoost の weight/bias 行としても
Perceptron のクラス数としても解釈できないため、既存のローダーは二段構成ファイルを
明示的なエラーで拒否し、既存のモデルファイルはこれまでどおり読み込めます。
将来の形式改訂では別のマジック行(例: litsea-two-stage v2)を使用し、v1 の
ローダーはそれを未対応バージョンとして拒否します。ローダーはセクションの順序、
上記の lexicon 規則、パラメータの範囲を検証し、エラーにはセクション名を付けて
報告します(例: [stage2] section: ...)。
ファイルサイズ
モデルファイルのサイズは、モデルの種類と言語によって大きく異なります:
| モデル | サイズ | 特徴量 |
|---|---|---|
| japanese.model | 約 1.1 MB | UD Japanese-GSD |
| chinese.model | 約 2.0 MB | UD Chinese-GSD |
| korean.model | 約 86 KB | UD Korean-GSD |
| english.model | 約 125 KB | UD English-EWT |
| RWCP.model | 約 22 KB | オリジナルの TinySegmenter |
| JEITA_Genpaku_ChaSen_IPAdic.model | 約 16 KB | JEITA コーパス |
| japanese_pos.model | 約 5.4 MB | UD Japanese-GSD(二段構成) |
| chinese_pos.model | 約 8.0 MB | UD Chinese-GSD(二段構成) |
| korean_pos.model | 約 5.0 MB | UD Korean-GSD(二段構成) |
| english_pos.model | 約 3.6 MB | UD English-EWT(二段構成) |
RWCP.model と JEITA_Genpaku_ChaSen_IPAdic.model は本当にキロバイト級で、アプリケーションへの直接埋め込みや最小限のオーバーヘッドでの HTTP 配信に最も適しています。再学習された japanese.model・chinese.model・korean.model・english.model(事前学習済みモデルを参照)は、その一部のコンパクトさを引き換えに大幅な品質向上を得ています: キロバイト級ではなく約 86 KB〜2.0 MB になりましたが、それでも二段構成モデル(*_pos.model)の数メガバイトに比べれば小さく、後者はクラスごと・ステージごとの重みを保持するためサイズが大きくなります。
互換性
- モデルファイルはエンコーディング非依存です(特徴量名はそのまま保存されます)
- 形式は、通常の学習ワークフローにおいては決定的です:
save_modelは学習器の特徴量順で特徴量を書き出します。特徴量ファイルから初期化された学習器やディスクから読み込まれた学習器では、この順序は(BTreeMapにより)ソートされています。一方、add_instance()のみで構築された学習器は挿入順で書き出します - モデルは前方互換性があります。入力に含まれるがモデルにない新しい特徴量は、予測時に単純に無視されます