フィルタ

Linderaの解析パイプライン(lindera-analysisクレートが提供するTokenizer)には、Segmenterの前後に2つの拡張ポイントがあります。トークナイズの生テキストを変換する文字フィルタと、トークナイズのトークン列を変換するトークンフィルタです。

Input Text
  --> Character Filters (preprocessing)
  --> Tokenization
  --> Token Filters (postprocessing)
  --> Output Tokens

文字フィルタ

文字フィルタは、入力テキストがSegmenterに渡される前に前処理を行います。全角文字を半角に変換する、Unicode表現を正準化する、日本語の踊り字を展開形に変換するなど、トークナイズの一貫性を高めるためのテキスト正規化に主に使われます。文字フィルタはテキストの長さを変えることがあるため、Linderaはすべての変換を記録し、各トークンのバイトオフセットを元の(フィルタ適用前の)テキストにおける位置へ補正します。

トークンフィルタ

トークンフィルタは、Segmenterが生成したトークン列に対して後処理を行います。トークンを基本形(辞書形)に置き換える、トークンの表層形をひらがな・カタカナ間で変換する、品詞タグでトークンを除去する、ストップワードを除去するなど、検索や解析のためにトークン列を正規化・削減する目的で主に使われます。

フィルタの設定方法

文字フィルタ・トークンフィルタのいずれも、kind文字列で識別され、フィルタ固有のパラメータを持つJSONのargsオブジェクトで設定します。フィルタは追加された順序で実行され、追加方法は2通りあります。

  • YAML設定ファイル: character_filtersキーとtoken_filtersキーの下にフィルタを列挙する。

    character_filters:
      - kind: unicode_normalize
        args:
          kind: nfkc
    
    token_filters:
      - kind: japanese_base_form
    
  • Rust API: append_character_filterappend_token_filterTokenizerに順番にフィルタを追加する。

    #![allow(unused)]
    fn main() {
    // Character filters run first, transforming the raw input text;
    // token filters run last, transforming the resulting token list.
    tokenizer
        .append_character_filter(BoxCharacterFilter::from(unicode_normalize_char_filter))
        .append_token_filter(BoxTokenFilter::from(japanese_base_form_filter));
    }

利用可能なフィルタ

Linderaは4種類の文字フィルタと18種類のトークンフィルタを提供しており、日本語・韓国語・汎用的なテキスト正規化をカバーしています。

カテゴリフィルタ
文字フィルタunicode_normalize, japanese_iteration_mark, mapping, regex
トークンフィルタ -- 正規化japanese_base_form, japanese_reading_form, korean_reading_form, japanese_kana, japanese_katakana_stem, japanese_number, mapping, remove_diacritical_mark, lowercase, uppercase
トークンフィルタ -- 品詞によるフィルタリングjapanese_keep_tags, japanese_stop_tags, korean_keep_tags, korean_stop_tags
トークンフィルタ -- 単語によるフィルタリングkeep_words, stop_words
トークンフィルタ -- 構造の変換japanese_compound_word, length

各フィルタの説明・パラメータ・実行可能なYAML/Rust APIの例はフィルターリファレンスを参照してください。