Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

言語バインディング

Litsea は Rust のライブラリですが、他の言語からも利用できます。バインディングは本リポジトリのワークスペースメンバーとして管理されており、litsea 本体と同じバージョンでリリースされます。

クレート一覧

クレート対象ランタイムFFI スタック状態
litsea-binding-core(共通・FFI 非依存)提供済み
litsea-pythonPython 3.10+PyO3 + maturin提供済み
litsea-nodejsNode.js 20+napi-rs提供済み
litsea-phpPHP 8.1+ext-php-rs提供済み
litsea-rubyRuby 3.1+magnus + rb-sys提供済み
litsea-wasmブラウザ / Denowasm-bindgen提供済み

設計方針

以下はすべてのバインディングに共通します。

モデルは同梱しない

バインディングのパッケージにはコードのみを含めます。モデルは呼び出し側がバイト列・ファイルパス・file:// パス・http(s):// URL のいずれかで渡します。同梱モデルは 1 つあたり 84KB〜8MB あり、4 言語分を埋め込むと wheel や npm パッケージが 20MB を超えてしまうためです。外部に置くことで、バインディングを再公開せずにモデルだけを更新できるという利点もあります。

モデルの入手方法は事前学習済みモデルを参照してください。

モデル種別は宣言ではなく判定する

CLI では、分割モデルと二段構成 POS モデルのどちらを読み込むかを --pos で指定する必要があります。バインディングではこれが不要です。モデルのバイト列を 1 度だけ読んで種別を判定するため、has_pos は「呼び出し側が正しく指定すべき情報」ではなく「読み込んだモデルの性質」になります。

キャンセルは明示的に行う

学習は長時間かかることがあり、litsea のトレーナは running フラグが倒されると早期終了します。CLI はこのフラグを Ctrl-C ハンドラから操作していますが、ライブラリが同じことをしてはいけません。シグナルハンドラはプロセス全体で 1 つしか登録できず、ホスト言語が既に握っているのが普通だからです。そのためバインディングは、呼び出し側が操作するキャンセルトークンを提供します。

共通ロジックは 1 つのクレートに集約する

FFI に依存しない処理(言語名のパース、モデル読み込みと種別判定、トークンのバイトオフセット、学習の呼び出し、エラー分類)はすべて litsea-binding-core に置きます。各バインディングは、その API をホスト言語の型と例外モデルに写像するだけです。