トークナイザー API

TokenizerBuilder

TokenizerBuilder はビルダーパターンを使用して Tokenizer インスタンスを設定・構築します。

コンストラクタ

new Lindera\TokenizerBuilder()

デフォルト設定で新しいビルダーを作成します。

<?php

$builder = new Lindera\TokenizerBuilder();

設定メソッド

setMode($mode)

トークナイズモードを設定します。

  • "normal" -- 標準的なトークナイズ(デフォルト)
  • "decompose" -- 複合語をより小さな単位に分解
$builder->setMode('normal');

setDictionary($uri)

システム辞書のパスまたは URI を設定します。

// 埋め込み辞書を使用
$builder->setDictionary('embedded://ipadic');

// 外部辞書を使用
$builder->setDictionary('/path/to/dictionary');

setUserDictionary($uri)

ユーザー辞書の URI を設定します。

$builder->setUserDictionary('/path/to/user_dictionary.csv');

setKeepWhitespace($keep)

出力に空白トークンを含めるかどうかを制御します。

$builder->setKeepWhitespace(true);

appendCharacterFilter($kind, $args)

前処理パイプラインに文字フィルタを追加します。

$builder->appendCharacterFilter('unicode_normalize', ['kind' => 'nfkc']);

appendTokenFilter($kind, $args)

後処理パイプラインにトークンフィルタを追加します。

$builder->appendTokenFilter('lowercase');
$builder->appendTokenFilter('japanese_stop_tags', [
    'tags' => ['助詞,格助詞,一般', '助詞,係助詞', '助詞,連体化', '助動詞'],
]);

ビルド

build()

設定された内容で Tokenizer をビルドして返します。

$tokenizer = $builder->build();

Tokenizer

Tokenizer はテキストに対して形態素解析を行います。

Tokenizer の作成

new Lindera\Tokenizer($dictionary, $mode, $userDictionary)

読み込み済みの辞書から直接トークナイザーを作成します。

<?php

$dictionary = Lindera\Dictionary::load('embedded://ipadic');
$tokenizer = new Lindera\Tokenizer($dictionary, 'normal');

ユーザー辞書を指定する場合:

<?php

$dictionary = Lindera\Dictionary::load('embedded://ipadic');
$metadata = $dictionary->metadata();
$userDictionary = Lindera\Dictionary::loadUser('/path/to/user_dictionary.csv', $metadata);

$tokenizer = new Lindera\Tokenizer($dictionary, 'normal', $userDictionary);

Tokenizer メソッド

tokenize($text)

入力テキストをトークナイズし、Token オブジェクトの配列を返します。

$tokens = $tokenizer->tokenize('形態素解析');

パラメータ:

名前説明
$textstringトークナイズするテキスト

戻り値: array<Token>

tokenizeSurfaces($text)

入力テキストをトークナイズし、トークンの surface のみを文字列の配列として返します。分かち書き用途の高速パスです。Token オブジェクトを生成せず、形態素の詳細情報もロードしないため、surface 文字列だけが必要な場合は tokenize より大幅に高速です。結果は array_map(fn ($t) => $t->surface, $tokenizer->tokenize($text)) と一致します。

<?php

$surfaces = $tokenizer->tokenizeSurfaces('形態素解析');
// ["形態素", "解析"]

パラメータ:

名前説明
$textstringトークナイズするテキスト

戻り値: array<string>

tokenizeNbest($text, $n)

N-best トークナイズ結果を返します。各結果は NbestResult オブジェクトで、トークン配列とトータルパスコストを含みます。

$results = $tokenizer->tokenizeNbest('すもももももももものうち', 3);
foreach ($results as $result) {
    echo "Cost: {$result->cost}\n";
    foreach ($result->tokens as $token) {
        echo "  {$token->surface}\n";
    }
}

パラメータ:

名前説明
$textstringトークナイズするテキスト
$nint返す結果の数

戻り値: array<NbestResult>

NbestResult

NbestResult は N-best トークナイズの個別の結果を表します。

NbestResult プロパティ

プロパティ説明
tokensarray<Token>トークンの配列
costintトータルパスコスト

Token

Token は単一の形態素トークンを表します。

Token プロパティ

プロパティ説明
surfacestringトークンの表層形
byte_startint元テキストでの開始バイト位置
byte_endint元テキストでの終了バイト位置
positionintトークンの位置インデックス
word_idint辞書の単語 ID
is_unknownbool辞書に登録されていない単語の場合 true
detailsarray<string>形態素の詳細情報(品詞、読みなど)

Token メソッド

getDetail($index)

指定されたインデックスの詳細文字列を返します。インデックスが範囲外の場合は null を返します。

$token = $tokenizer->tokenize('東京')[0];
$pos = $token->getDetail(0);        // 例: "名詞"
$subpos = $token->getDetail(1);     // 例: "固有名詞"
$reading = $token->getDetail(7);    // 例: "トウキョウ"

パラメータ:

名前説明
$indexintdetails 配列へのゼロベースインデックス

戻り値: string または null

toArray()

トークンを連想配列として返します。各フィールドは PHP の自然な型を保つため、 独自のエンコーダなしでシリアライズできます。

$data = $tokenizer->tokenize('東京')[0]->toArray();
// ['surface' => '東京', 'byte_start' => 0, 'byte_end' => 6, 'position' => 0,
//  'word_id' => 12345, 'is_unknown' => false, 'details' => [...]]

echo json_encode(array_map(fn($t) => $t->toArray(), $tokens));

戻り値: surfacebyte_startbyte_endpositionword_idis_unknowndetails をキーに持つ array

[!NOTE] Lindera\TokenJsonSerializable を実装していないため、トークンオブジェクトを そのまま json_encode に渡してもこれらのフィールドは出力されません。先に toArray() を呼んでください。この拡張は ext-php-rs でビルドされており、その #[php_class] はまだ実装インターフェースを宣言できません(上流の ext-php-rs#326)。

details の構造は辞書によって異なります:

  • IPADIC: [品詞, 品詞細分類1, 品詞細分類2, 品詞細分類3, 活用型, 活用形, 原形, 読み, 発音]
  • UniDic: UniDic 仕様に準拠した詳細な形態素情報
  • ko-dic / CC-CEDICT / Jieba: 各辞書固有の詳細フォーマット

Mode

Mode はトークナイズの動作モードを表します。

Mode の作成

new Lindera\Mode($name)

$mode = new Lindera\Mode('normal');
$mode = new Lindera\Mode('decompose');
$mode = new Lindera\Mode();  // デフォルト: 'normal'

Mode プロパティ

プロパティ説明
namestringモード名("normal" または "decompose"

Mode メソッド

メソッド戻り値説明
isNormal()boolNormal モードの場合 true
isDecompose()boolDecompose モードの場合 true

Penalty

Penalty は、文字種と長さのしきい値に基づいて、decompose モードが複合語をどの程度積極的に分割するかを設定します。

注意: Penalty は現時点で TokenizerBuilderTokenizer のコンストラクタには接続されていません。これを受け取るセッターは存在しないため、インスタンスを作成してもトークナイズには影響しません。decompose モードは常に以下のデフォルト値を使用します。

<?php

// すべてのパラメータは省略可能で、decompose モードが使用するデフォルト値になります
$penalty = new Lindera\Penalty(
    kanji_penalty_length_threshold: 2,
    kanji_penalty_length_penalty: 3000,
    other_penalty_length_threshold: 7,
    other_penalty_length_penalty: 1700,
);

Penalty プロパティ

プロパティデフォルト説明
$kanji_penalty_length_thresholdint2漢字連続のしきい値
$kanji_penalty_length_penaltyint3000しきい値を超えた漢字連続に適用されるペナルティ
$other_penalty_length_thresholdint7その他の文字連続のしきい値
$other_penalty_length_penaltyint1700しきい値を超えたその他の文字連続に適用されるペナルティ