Tokenizer API
TokenizerBuilder
TokenizerBuilder はビルダーパターンを使用して Tokenizer インスタンスを設定・構築します。
コンストラクタ
new TokenizerBuilder()
デフォルト設定で新しいビルダーを作成します。
const { TokenizerBuilder } = require("lindera");
const builder = new TokenizerBuilder();
new TokenizerBuilder().fromFile(filePath)
YAML ファイルから設定を読み込み、新しいビルダーを返します。
const builder = new TokenizerBuilder().fromFile("lindera.yml");
辞書、文字フィルタ、トークンフィルタの設定を含む完全な設定ファイルの例は
lindera-nodejs/resources/lindera.yml
を参照してください。
設定メソッド
すべてのセッターメソッドはビルダー自身(this)を返すため、メソッドチェーンでも 1 文ずつの呼び出しでも設定できます。
setMode(mode)
トークナイズモードを設定します。
"normal"-- 標準的なトークナイズ(デフォルト)"decompose"-- 複合語をより小さな単位に分解
builder.setMode("normal");
setDictionary(path)
システム辞書のパスまたは URI を設定します。
// 埋め込み辞書を使用
builder.setDictionary("embedded://ipadic");
// 外部辞書を使用
builder.setDictionary("/path/to/dictionary");
setUserDictionary(uri)
ユーザー辞書の URI を設定します。
builder.setUserDictionary("/path/to/user_dictionary");
setKeepWhitespace(keep)
出力に空白トークンを含めるかどうかを制御します。
builder.setKeepWhitespace(true);
appendCharacterFilter(kind, args?)
前処理パイプラインに文字フィルタを追加します。
builder.appendCharacterFilter("unicode_normalize", { kind: "nfkc" });
appendTokenFilter(kind, args?)
後処理パイプラインにトークンフィルタを追加します。
builder.appendTokenFilter("lowercase", {});
ビルド
build()
設定された内容で Tokenizer をビルドして返します。
const tokenizer = builder.build();
Tokenizer
Tokenizer はテキストに対して形態素解析を行います。
Tokenizer の作成
new Tokenizer(dictionary, mode?, userDictionary?)
読み込み済みの辞書から直接トークナイザーを作成します。
const { Tokenizer, loadDictionary } = require("lindera");
const dictionary = loadDictionary("embedded://ipadic");
const tokenizer = new Tokenizer(dictionary, "normal");
Tokenizer メソッド
tokenize(text)
入力テキストをトークナイズし、プレーンなトークンオブジェクトの配列を返します。
const tokens = tokenizer.tokenize("形態素解析");
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
text | string | トークナイズするテキスト |
戻り値: Token[]
トークンはクラスのインスタンスではなくプレーンな JavaScript オブジェクトです。そのため通常の GC で回収され、JSON.stringify、structuredClone、worker への転送を変換なしで通過します。詳細は Token を参照してください。
tokenizeSurfaces(text)
入力テキストをトークナイズし、トークンの surface のみを文字列の配列として返します。分かち書き用途の高速パスです。トークンオブジェクトを構築せず、形態素の詳細情報もロードしないため、surface 文字列だけが必要な場合は tokenize より大幅に高速です。結果は tokenizer.tokenize(text).map((t) => t.surface) と一致します。
const surfaces = tokenizer.tokenizeSurfaces("形態素解析");
// ["形態素", "解析"]
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
text | string | トークナイズするテキスト |
戻り値: string[]
tokenizeNbest(text, n, unique?, costThreshold?)
N-best トークナイズ結果を返します。各結果はトークン配列とトータルパスコストを含みます。
const results = tokenizer.tokenizeNbest("すもももももももものうち", 3);
for (const { tokens, cost } of results) {
console.log(cost, tokens.map((t) => t.surface));
}
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
text | string | トークナイズするテキスト |
n | number | 返す結果の数 |
unique | boolean | 結果の重複を排除(デフォルト: false) |
costThreshold | number | undefined | 最良パスからの最大コスト差(デフォルト: undefined) |
戻り値: NbestResult[]。各 NbestResult は { tokens: Token[], cost: number } です。
Token
Token は単一の形態素トークンを表すプレーンオブジェクトです。クラスではなく
TypeScript の interface であり、メソッドもプロトタイプも持ちません。
各フィールドは直接読み出します。
プロパティ
| プロパティ | 型 | 説明 |
|---|---|---|
surface | string | トークンの表層形 |
byteStart | number | 元テキストでの開始バイト位置 |
byteEnd | number | 元テキストでの終了バイト位置 |
position | number | トークンの位置インデックス |
wordId | number | 辞書の単語 ID |
isUnknown | boolean | 辞書に登録されていない単語の場合 true |
details | string[] | 形態素の詳細情報(品詞、読みなど) |
詳細情報の読み出し
details を直接インデックスします。範囲外のインデックスは undefined になります。
const token = tokenizer.tokenize("東京")[0];
const pos = token.details[0]; // 例: "名詞"
const subpos = token.details[1]; // 例: "固有名詞"
const reading = token.details[7]; // 例: "トウキョウ"
details の構造は辞書によって異なります:
- IPADIC:
[品詞, 品詞細分類1, 品詞細分類2, 品詞細分類3, 活用型, 活用形, 原形, 読み, 発音] - UniDic: UniDic 仕様に準拠した詳細な形態素情報
- ko-dic / CC-CEDICT / Jieba: 各辞書固有の詳細フォーマット
Mode と Penalty
Mode と Penalty は npm パッケージ lindera からエクスポートされていますが、現状どの公開 API
にも接続されていません: TokenizerBuilder.setMode() / Tokenizer のコンストラクタは
単純なモード文字列("normal" または "decompose")のみを受け取り、decompose モードは
内部的に常にデフォルトのペナルティ設定を使用します。これらの型は完全性のためにここで
説明していますが、JavaScript からペナルティの挙動をカスタマイズする用途にはまだ使用できません。
Mode
2つの値を持つ文字列列挙型です:
Mode.Normal-- 辞書コストに基づく標準的なトークナイズMode.Decompose-- ペナルティベースの複合語分解
Penalty
decompose モードで使用されるペナルティパラメータを表すオブジェクトです:
| プロパティ | 型 | 説明 |
|---|---|---|
kanjiPenaltyLengthThreshold | number | ペナルティを適用する前の漢字列の長さの閾値(デフォルト: 2) |
kanjiPenaltyLengthPenalty | number | 長い漢字列に対するペナルティ値(デフォルト: 3000) |
otherPenaltyLengthThreshold | number | ペナルティを適用する前のその他の文字列の長さの閾値(デフォルト: 7) |
otherPenaltyLengthPenalty | number | 長いその他の文字列に対するペナルティ値(デフォルト: 1700) |