テキスト処理パイプライン
Lindera Node.js は、トークナイズ前に文字フィルタを適用し、トークナイズ後にトークンフィルタを適用する、組み合わせ可能なテキスト処理パイプラインをサポートしています。フィルタは TokenizerBuilder に追加され、追加された順序で実行されます。
Input Text
--> Character Filters (preprocessing)
--> Tokenization
--> Token Filters (postprocessing)
--> Output Tokens
[!NOTE] このページではよく使われる一部のフィルタのみを例として紹介しています。これが全リストではありません。
lindera-analysisは合計4種類の文字フィルタと18種類のトークンフィルタを提供しています。全フィルタ(パラメータ・使用例を含む)の 正式なカタログについてはフィルタを参照してください。
文字フィルタ
文字フィルタはトークナイズ前に入力テキストを変換します。
unicode_normalize
入力テキストに Unicode 正規化を適用します。
const { TokenizerBuilder } = require("lindera");
const builder = new TokenizerBuilder();
builder.setDictionary("embedded://ipadic");
builder.appendCharacterFilter("unicode_normalize", { kind: "nfkc" });
const tokenizer = builder.build();
サポートされる正規化形式: "nfc"、"nfkc"、"nfd"、"nfkd"。
mapping
マッピングテーブルに従って文字や文字列を置換します。
const builder = new TokenizerBuilder();
builder.setDictionary("embedded://ipadic");
builder.appendCharacterFilter("mapping", {
mapping: {
"\u30fc": "-",
"\uff5e": "~",
},
});
const tokenizer = builder.build();
japanese_iteration_mark
日本語の踊り字(繰り返し記号)を完全な形に展開します。
const builder = new TokenizerBuilder();
builder.setDictionary("embedded://ipadic");
builder.appendCharacterFilter("japanese_iteration_mark", {
normalize_kanji: true,
normalize_kana: true,
});
const tokenizer = builder.build();
トークンフィルタ
トークンフィルタはトークナイズ後にトークンを変換または除去します。
lowercase
トークンの表層形を小文字に変換します。
const builder = new TokenizerBuilder();
builder.setDictionary("embedded://ipadic");
builder.appendTokenFilter("lowercase", {});
const tokenizer = builder.build();
japanese_base_form
辞書の形態素情報を使用して、活用形を基本形(辞書形)に置換します。
const builder = new TokenizerBuilder();
builder.setDictionary("embedded://ipadic");
builder.appendTokenFilter("japanese_base_form", {});
const tokenizer = builder.build();
japanese_stop_tags
指定されたタグに一致する品詞のトークンを除去します。
const builder = new TokenizerBuilder();
builder.setDictionary("embedded://ipadic");
builder.appendTokenFilter("japanese_stop_tags", {
tags: ["助詞,格助詞,一般", "助詞,係助詞", "助詞,連体化", "助動詞"],
});
const tokenizer = builder.build();
[!NOTE] タグは 4 階層のカンマ区切りに正規化され(不足分は
*で補完)、各トークンの先頭 4 つの品詞詳細と完全一致で比較されます。 IPADIC の助詞トークンは必ず助詞,係助詞のようにサブカテゴリを持つため、助詞単独では一致しません。 一方、助動詞はサブカテゴリを持たないため(助動詞,*,*,*)、助動詞単独で一致します。
japanese_keep_tags
指定されたタグに一致する品詞のトークンのみを保持します。その他のトークンはすべて除去されます。
const builder = new TokenizerBuilder();
builder.setDictionary("embedded://ipadic");
builder.appendTokenFilter("japanese_keep_tags", {
tags: ["名詞,一般"],
});
const tokenizer = builder.build();
パイプラインの完全な例
以下の例では、複数の文字フィルタとトークンフィルタを1つのパイプラインに組み合わせています:
const { TokenizerBuilder } = require("lindera");
const builder = new TokenizerBuilder();
builder.setMode("normal");
builder.setDictionary("embedded://ipadic");
// Preprocessing
builder.appendCharacterFilter("unicode_normalize", { kind: "nfkc" });
builder.appendCharacterFilter("japanese_iteration_mark", {
normalize_kanji: true,
normalize_kana: true,
});
// Postprocessing
builder.appendTokenFilter("japanese_base_form", {});
builder.appendTokenFilter("japanese_stop_tags", {
tags: ["助詞,格助詞,一般", "助詞,係助詞", "助詞,連体化", "助動詞", "記号,句点", "記号,読点"],
});
builder.appendTokenFilter("lowercase", {});
const tokenizer = builder.build();
const tokens = tokenizer.tokenize("Linderaは形態素解析を行うライブラリです。");
for (const token of tokens) {
console.log(`${token.surface}\t${token.details.join(",")}`);
}
このパイプラインでは:
unicode_normalizeが全角文字を半角に変換(NFKC 正規化)japanese_iteration_markが踊り字を展開japanese_base_formが活用形のトークンを基本形に変換japanese_stop_tagsが助詞(格助詞・係助詞・連体化)・助動詞・句読点を除去lowercaseがアルファベットを小文字に正規化