辞書管理

Lindera Node.js は、形態素解析で使用する辞書の読み込み、ビルド、管理のための関数を提供します。

辞書の読み込み

システム辞書

loadDictionary(uri) を使用してシステム辞書を読み込みます。GitHub Releases からビルド済み辞書をダウンロードし、展開したディレクトリのパスを指定してください:

const { loadDictionary } = require("lindera");

const dictionary = loadDictionary("/path/to/ipadic");

埋め込み辞書(上級者向け) -- embed-* feature フラグ付きでビルドした場合、埋め込み辞書を使用できます:

const dictionary = loadDictionary("embedded://ipadic");

Dictionary には、読み込んだ辞書のメタデータを参照するための読み取り専用アクセサがいくつか用意されています:

console.log(dictionary.metadataName());     // 例: "ipadic"
console.log(dictionary.metadataEncoding()); // 例: "UTF-8"

const metadata = dictionary.metadata(); // Metadata オブジェクト全体
console.log(metadata.defaultWordCost);

ユーザー辞書

ユーザー辞書はシステム辞書にカスタム語彙を追加します。組み合わせるシステム辞書に 合わせて読み込みます:

const { loadDictionary, loadUserDictionaryFor } = require("lindera");

const dictionary = loadDictionary("/path/to/ipadic");
const userDict = loadUserDictionaryFor("/path/to/user_dictionary.csv", dictionary);

.csv はシステム辞書のメタデータでビルドし、ビルドしながら接続コスト行列と 照らして確認します。文脈 ID が行列の範囲外にある行は、その CSV の行番号と表層形を 示すエラーになります(文脈 ID を参照)。.bin はビルドされたとおりに読み込みます。

loadUserDictionary(uri, metadata) は、メタデータだけでユーザー辞書を 読み込みます。この方法で読み込んだ .csv はシステム辞書と組み合わせるときに 確認し、エラーは見出し語をその単語 ID で示します:

const { loadUserDictionary, Metadata } = require("lindera");

const metadata = new Metadata();
const userDict = loadUserDictionary("/path/to/user_dictionary.csv", metadata);

トークナイザーのビルド時にユーザー辞書を渡します:

const { Tokenizer, loadDictionary, loadUserDictionaryFor } = require("lindera");

const dictionary = loadDictionary("/path/to/ipadic");
const userDict = loadUserDictionaryFor("/path/to/user_dictionary.csv", dictionary);

const tokenizer = new Tokenizer(dictionary, "normal", userDict);

または、ビルダー経由で設定します:

const { TokenizerBuilder } = require("lindera");

const builder = new TokenizerBuilder();
builder.setDictionary("/path/to/ipadic");
builder.setUserDictionary("/path/to/user_dictionary.csv");
const tokenizer = builder.build();

辞書のビルド

システム辞書のビルド

ソースファイルからシステム辞書をビルドします:

const { buildDictionary, Metadata } = require("lindera");

const metadata = new Metadata({ name: "custom", encoding: "UTF-8" });
buildDictionary("/path/to/input_dir", "/path/to/output_dir", metadata);

入力ディレクトリには辞書のソースファイル(CSV レキシコン、matrix.def など)が含まれている必要があります。

辞書の metadata.json に含まれる設定のままビルドするには、Metadata.fromJsonFile() でファイルを読み込み、その結果を渡します。ファイルの space_penalty ルールは保持されるため、この方法でビルドした ko-dic では左側空白ペナルティがデフォルトで適用されます(setSpacePenalty を参照)。new Metadata(...) で作成した Metadata はルールを持ちません。

const metadata = Metadata.fromJsonFile("/path/to/lindera-ko-dic/metadata.json");
buildDictionary("/path/to/mecab-ko-dic", "/path/to/output_dir", metadata);

ユーザー辞書のビルド

組み合わせるシステム辞書に合わせて、CSV ファイルからユーザー辞書をビルドします:

const { buildUserDictionaryFor, loadDictionary, loadUserDictionaryFor } = require("lindera");

const dictionary = loadDictionary("/path/to/ipadic");
buildUserDictionaryFor("user_words.csv", "/path/to/user_dictionary.bin", dictionary);
const userDict = loadUserDictionaryFor("/path/to/user_dictionary.bin", dictionary);

CSV はシステム辞書のメタデータでビルドし、接続コスト行列と照らして確認します。 文脈 ID が行列の範囲外にある行は、その CSV の行番号と表層形を示すエラーを投げ、 ファイルは書き出しません(文脈 ID を参照)。2 番目の引数は書き出すファイルのパスです。ローダーは拡張子で ユーザー辞書の読み込み方を決めるので、.bin で終えてください。

buildUserDictionary(kind, inputFile, outputDir, metadata) は、メタデータだけで ユーザー辞書をビルドします。outputDir も、名前に反してディレクトリではなく、 書き出すファイルのパスです。各行はシステム辞書と組み合わせるときに確認し、 エラーは見出し語をその単語 ID で示します:

const { buildUserDictionary, Metadata } = require("lindera");

const metadata = new Metadata();
buildUserDictionary("ipadic", "user_words.csv", "/path/to/user_dictionary.bin", metadata);

metadata パラメータは省略可能です。省略した場合はデフォルトのメタデータ値が使用されます:

buildUserDictionary("ipadic", "user_words.csv", "/path/to/user_dictionary.bin");

[!NOTE] 第一引数(kind)は現状未使用です -- 将来の拡張のために予約されており、ビルド結果には 影響しません。現時点では任意の文字列を渡しても問題ありません。システム辞書に合わせて ビルドするには buildUserDictionaryFor を使います。

Metadata

Metadata クラスは辞書のパラメータを設定します。

Metadata の作成

const { Metadata } = require("lindera");

// デフォルトのメタデータ
const metadata = new Metadata();

// カスタムメタデータ
const metadata = new Metadata({
  name: "my_dictionary",
  encoding: "UTF-8",
  defaultWordCost: -10000,
});

JSON からの読み込み

const metadata = Metadata.fromJsonFile("metadata.json");

プロパティ

プロパティ型デフォルト説明
namestring"default"辞書名
encodingstring"UTF-8"文字エンコーディング
defaultWordCostnumber-10000未知語のデフォルトコスト。-32768 から 32767 の整数
defaultLeftContextIdnumber1288デフォルトの左文脈 ID。0 から 65535 の整数
defaultRightContextIdnumber1288デフォルトの右文脈 ID。0 から 65535 の整数
defaultFieldValuestring"*"欠損フィールドのデフォルト値
flexibleCsvbooleanfalse柔軟な CSV パースを許可
skipInvalidCostOrIdbooleanfalse無効なコストまたは ID のエントリーをスキップ

[!NOTE] このバインディングの Metadata オブジェクトには、スキーマ情報(辞書/ユーザー辞書の フィールド構成)は公開されていません -- dictionarySchema / userDictionarySchema プロパティは存在しません。代わりに独立した Schema クラスを使用してください。

すべてのプロパティは取得と設定の両方をサポートしています:

const metadata = new Metadata();
metadata.name = "custom_dict";
metadata.encoding = "EUC-JP";
console.log(metadata.name); // "custom_dict"

toObject()

メタデータのオブジェクト表現を返します。値はすべて文字列です:

const metadata = new Metadata({ name: "test" });
console.log(metadata.toObject());

メタデータが左側空白ペナルティのルールを持つ場合(ko-dic の metadata.json から読み込んだ場合など)、オブジェクトにはルールを JSON 文字列で保持する spacePenalty エントリーも含まれます。ルールを持たない場合、このキーはありません。

const koDic = Metadata.fromJsonFile("/path/to/lindera-ko-dic/metadata.json");
const { rules } = JSON.parse(koDic.toObject().spacePenalty);
console.log(rules[1].pos); // ["JC", "JKB", "JKC", "JKG", "JKO", "JKQ", "JKS", "JKV", "JX"]

Schema

Schema クラスは辞書エントリーのフィールド構造を定義します。

Schema の作成

const { Schema } = require("lindera");

// デフォルトの IPADIC 互換スキーマ
const schema = Schema.createDefault();

// カスタムスキーマ
const custom = new Schema(["surface", "left_id", "right_id", "cost", "pos", "reading"]);

Schema メソッド

メソッド戻り値説明
getFieldIndex(name)number | nullフィールド名からインデックスを取得
fieldCount()numberフィールドの総数
getFieldName(index)string | nullインデックスからフィールド名を取得
getCustomFields()string[]インデックス 4 以降のフィールド(形態素素性)
getAllFields()string[]すべてのフィールド名
getFieldByName(name)FieldDefinition | nullフィールド定義の完全な情報を取得
validateRecord(record)voidCSV レコードをスキーマに対して検証
const schema = Schema.createDefault();

console.log(schema.fieldCount());           // 13(IPADIC フォーマット)
console.log(schema.getFieldIndex("pos1"));  // 例: 4
console.log(schema.getAllFields());          // ["surface", "left_id", ...]
console.log(schema.getCustomFields());      // インデックス 4 以降のフィールド

FieldDefinition

プロパティ型説明
indexnumberフィールドの位置インデックス
namestringフィールド名
fieldTypeFieldTypeフィールド型の列挙値
descriptionstring | undefined任意の説明

FieldType

値説明
FieldType.Surface単語の表層形
FieldType.LeftContextId左文脈 ID
FieldType.RightContextId右文脈 ID
FieldType.Cost単語コスト
FieldType.Custom形態素素性フィールド