アーキテクチャ

Linderaは複数のクレートで構成されるCargo workspaceとして構成されています。各クレートは、低レベルのCRF計算から高レベルのCLIや言語バインディングまで、それぞれ明確な責務を持っています。

クレート依存関係図

graph TB
    CRF["lindera-crf\n(CRF Engine)"]
    DICT["lindera-dictionary\n(Dictionary Base)"]
    TRAINER["lindera-trainer\n(CRF Training)"]
    IPADIC["lindera-ipadic"]
    UNIDIC["lindera-unidic"]
    SUDACHIDICT["lindera-sudachidict"]
    KODIC["lindera-ko-dic"]
    CCCEDICT["lindera-cc-cedict"]
    JIEBA["lindera-jieba"]
    NEOLOGD["lindera-ipadic-neologd"]
    LIB["lindera\n(Segmenter)"]
    ANALYSIS["lindera-analysis\n(Analysis Chain)"]
    CLI["lindera-cli\n(CLI)"]
    BINDINGCORE["lindera-binding-core"]
    PY["lindera-python"]
    NODEJS["lindera-nodejs"]
    RUBY["lindera-ruby"]
    PHP["lindera-php"]
    WASM["lindera-wasm"]

    CRF --> TRAINER
    DICT --> TRAINER
    TRAINER -.->|"train feature"| LIB
    DICT --> IPADIC
    DICT --> UNIDIC
    DICT --> SUDACHIDICT
    DICT --> KODIC
    DICT --> CCCEDICT
    DICT --> JIEBA
    DICT --> NEOLOGD
    DICT --> LIB
    DICT --> ANALYSIS
    DICT --> WASM
    IPADIC --> LIB
    UNIDIC --> LIB
    SUDACHIDICT --> LIB
    KODIC --> LIB
    CCCEDICT --> LIB
    JIEBA --> LIB
    NEOLOGD --> LIB
    LIB --> ANALYSIS
    LIB --> CLI
    ANALYSIS --> CLI
    LIB --> BINDINGCORE
    ANALYSIS --> BINDINGCORE
    BINDINGCORE --> PY
    BINDINGCORE --> NODEJS
    BINDINGCORE --> RUBY
    BINDINGCORE --> PHP
    BINDINGCORE --> WASM

クレート一覧

クレート種類説明
lindera-crfコアPure RustによるCRF(条件付き確率場)実装。no_stdサポート。シリアライゼーションにrkyvを使用。
lindera-dictionaryコア辞書ベースライブラリ。辞書の読み込みとビルドを提供。
lindera-trainerコアCRFベースの辞書学習パイプライン。lindera-crflindera-dictionaryの上に構築され、直接、またはlinderafacadeのtrain feature経由で利用される。
linderaコア純粋な形態素セグメンター。辞書クレートを統合し、Segmenter APIを提供。
lindera-analysisコアlinderaの上に構築されたLucene風の分析チェーン。文字フィルタ、トークンフィルタ、およびそれらをSegmenterの周りで組み合わせるTokenizerを提供。
lindera-cliアプリケーショントークナイズ、辞書ビルド、CRF学習のためのコマンドラインインターフェース。
lindera-binding-coreコア以下の5つの言語バインディングが共有するFFI非依存のヘルパー。
lindera-ipadic辞書IPADICベースの日本語辞書。
lindera-ipadic-neologd辞書IPADIC NEologdベースの日本語辞書(新語対応)。
lindera-unidic辞書UniDicベースの日本語辞書。
lindera-sudachidict辞書SudachiDictベースの日本語辞書。
lindera-ko-dic辞書ko-dicベースの韓国語辞書。
lindera-cc-cedict辞書CC-CEDICTベースの中国語辞書。
lindera-jieba辞書Jiebaベースの中国語辞書。
lindera-pythonバインディングPyO3を利用したPythonバインディング。
lindera-nodejsバインディングNAPI-RSを利用したNode.jsバインディング。
lindera-rubyバインディングMagnus + rb-sysを利用したRubyバインディング。
lindera-phpバインディングext-php-rsを利用したPHPバインディング。
lindera-wasmバインディングwasm-bindgenを利用したWebAssemblyバインディング。

トークナイズパイプライン

Linderaは複数段階のパイプラインでテキストを処理します:

Input Text
  |
  v
Character Filters    -- Normalize characters (e.g., Unicode normalization, mapping)
  |
  v
Segmenter            -- Segment text into tokens using a dictionary and the Viterbi algorithm
  |
  v
Token Filters        -- Transform tokens (e.g., POS filtering, stop words, stemming)
  |
  v
Output Tokens

Segmenterがコアコンポーネントです。辞書から候補トークンのラティスを構築し、Viterbiアルゴリズムを適用して最小コストのパスを見つけ、最も適切な分割結果を生成します。辞書検索は、所有権を持つ構造体へのデシリアライズを行わず、dict.trieのシリアライズ済みバイト列上を直接走査する文字単位のダブル配列トライ(crawdadでビルド)を使用します。繰り返しトークナイズを行う場合は、Segmenter::new_worker()が返すSegmentWorkerがラティスとスクラッチバッファの割り当てを呼び出しをまたいで再利用し、保持メモリを自動収縮ポリシーで制限します。

Featureフラグ

Feature説明デフォルト
mmapファイルシステム辞書読み込みのためのメモリマップドファイルサポート(--mmap/use_mmapでオプトイン。トライ・単語リストファイル・接続コスト行列はいずれもマップしたバイト列上で直接参照され、遅延読み込みされる)有効
trainCRFベースの辞書学習機能(lindera-crfに依存)CLI + Python/Node.js/Ruby/PHPバインディング(デフォルト有効)/linderaコアではデフォルト無効(オプトイン)/lindera-wasmでは利用不可
embed-ipadicIPADIC辞書をバイナリに埋め込み無効
embed-ipadic-neologdIPADIC NEologd辞書をバイナリに埋め込み無効
embed-unidicUniDic辞書をバイナリに埋め込み無効
embed-sudachidictSudachiDict辞書をバイナリに埋め込み無効
embed-ko-dicko-dic辞書をバイナリに埋め込み無効
embed-cc-cedictCC-CEDICT辞書をバイナリに埋め込み無効
embed-jiebaJieba辞書をバイナリに埋め込み無効
embed-cjkIPADIC + ko-dic + Jieba辞書を埋め込み無効
embed-cjk2UniDic + ko-dic + Jieba辞書を埋め込み無効
embed-cjk3IPADIC NEologd + ko-dic + Jieba辞書を埋め込み無効
embed-cjk4SudachiDict + ko-dic + Jieba辞書を埋め込み無効

詳細