設定

LinderaはYAML形式の設定ファイルを読み込むことができます。 環境変数 LINDERA_CONFIG_PATH にファイルのパスを指定してください。Rustコードでトークナイザーの動作をコーディングすることなく、簡単に利用できます。

segmenter:
  mode: "normal"
  dictionary: "embedded://ipadic"
  # user_dictionary: "./resources/user_dict/ipadic_simple_userdic.csv"
  # keep_whitespace: false
  # skip_whitespace: false # MeCab と同様に空白をラティス上で読み飛ばす。SudachiDict 以外はデフォルトでオン。false で空白ノードを残す(v7 より前の動作)
  # use_mmap: false # ファイルシステム辞書(embedded:// ではない辞書)にのみ意味がある
  # max_grouping_len: 24 # 未知語のグルーピング長の上限。省略または 0 で無制限
  # unknown_word_ladder: true # 短い未知語候補も生成する(デフォルト: true)
  # space_penalty: false # 左側空白ペナルティ(韓国語)。ルールを同梱する辞書(ko-dic)ではデフォルトでオン。false でオフ、オブジェクトで明示的なルールを指定

character_filters:
  - kind: "unicode_normalize"
    args:
      kind: "nfkc"
  - kind: "japanese_iteration_mark"
    args:
      normalize_kanji: true
      normalize_kana: true
  - kind: mapping
    args:
       mapping:
         リンデラ: Lindera

token_filters:
  - kind: "japanese_compound_word"
    args:
      # Merge the numeral tokens only. A counter merged into the number token keeps japanese_number from converting it.
      tags:
        - "名詞,数"
      new_tag: "名詞,数"
  - kind: "japanese_number"
    args:
      tags:
        - "名詞,数"
  - kind: "japanese_stop_tags"
    args:
      tags:
        - "接続詞"
        - "助詞"
        - "助詞,格助詞"
        - "助詞,格助詞,一般"
        - "助詞,格助詞,引用"
        - "助詞,格助詞,連語"
        - "助詞,係助詞"
        - "助詞,副助詞"
        - "助詞,間投助詞"
        - "助詞,並立助詞"
        - "助詞,終助詞"
        - "助詞,副助詞/並立助詞/終助詞"
        - "助詞,連体化"
        - "助詞,副詞化"
        - "助詞,特殊"
        - "助動詞"
        - "記号"
        - "記号,一般"
        - "記号,読点"
        - "記号,句点"
        - "記号,空白"
        - "記号,括弧閉"
        - "その他,間投"
        - "フィラー"
        - "非言語音"
  - kind: "japanese_katakana_stem"
    args:
      min: 3
  - kind: "remove_diacritical_mark"
    args:
      japanese: false

Segmenter のオプション

キー型デフォルト説明
modestring"normal"分割モード。"normal" または "decompose"
dictionarystring(必須)辞書 URI。例: "embedded://ipadic"
user_dictionarystring(なし)ユーザー辞書のパス
keep_whitespaceboolfalse空白トークンを出力する。このとき空白はラティスにも残るため、他のトークンも、MeCab と同様に空白を読み飛ばすデフォルトの出力と変わることがある
skip_whitespacebool(辞書の設定: true、SudachiDict は false)keep_whitespace が false のとき、MeCab と同様に空白をラティス上で読み飛ばし、前後の語を直接接続する。false で空白を独立したノード(空白の見出し語か SPACE の未知語)としてラティスに残す(v7 より前の動作)。そのノードの連接コストがすべて 0 の ko-dic では、空白のたびに連接の文脈が途切れる。省略または null で辞書の metadata.json のデフォルトを使う。Segmenter を参照
use_mmapboolmmap feature が有効なとき on(デフォルト)辞書をメモリマップする。ファイルシステム辞書(embedded:// ではない辞書)にのみ意味がある
max_grouping_leninteger(無制限)未知語グルーピングの上限(先頭の 1 文字を超えた文字数)。MeCab の max-grouping-size に相当する(MeCab のデフォルトは 24)。上限は各位置で判定され、上限を超えるランはその位置ではグルーピングされず、1 文字候補(および候補ラダーと辞書語)が残る。残りの末尾は上限に収まった時点で再びグルーピングされるため、未知語トークンは最長で上限 + 1 文字になる。キーを省略するか 0 を指定すると無制限になる
unknown_word_ladderbooltrueMeCab や Vibrato と同様に、文字の既定の文字種の char.def の LENGTH フィールドまでの短い未知語候補も生成する。false を指定すると v6 より前と同じくこれらの候補を作らない。ただし、グルーピングした未知語の内側から始まる未知語など、その後の変更による出力の違いは残る。Segmenter を参照
space_penaltybool または object(辞書同梱のルール、あれば)左側空白ペナルティ(mecab-ko の left-space-penalty-factor)。直前に空白があり、先頭品詞タグが一覧にある候補にコストを加算する。省略または null で辞書が metadata.json に同梱するルールを使用(ko-dic は mecab-ko-dic のルールを同梱するため ko-dic ではデフォルトでオン。他の同梱辞書はルールを持たない)、false でオフ、true で辞書のルールを要求(同梱しない辞書ではエラー)、オブジェクト {"rules": [{"pos": [...], "cost": n}, ...]} で明示的なルールを指定。Segmenter を参照
% export LINDERA_CONFIG_PATH=./resources/config/lindera.yml
use std::path::PathBuf;

use lindera::analysis::tokenizer::TokenizerBuilder;
use lindera::LinderaResult;

fn main() -> LinderaResult<()> {
    // 設定ファイルからトークナイザーの設定を読み込む
    let path = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
        .join("../resources")
        .join("config")
        .join("lindera.yml");

    let builder = TokenizerBuilder::from_file(&path)?;

    let tokenizer = builder.build()?;

    let text = "Linderaは形態素解析エンジンです。ユーザー辞書も利用可能です。".to_string();
    println!("text: {text}");

    let tokens = tokenizer.tokenize(&text)?;

    for token in tokens {
        println!(
            "token: {:?}, start: {:?}, end: {:?}, details: {:?}",
            token.surface, token.byte_start, token.byte_end, token.details
        );
    }

    Ok(())
}