辞書管理
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");
プロパティ
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
name | string | "default" | 辞書名 |
encoding | string | "UTF-8" | 文字エンコーディング |
defaultWordCost | number | -10000 | 未知語のデフォルトコスト。-32768 から 32767 の整数 |
defaultLeftContextId | number | 1288 | デフォルトの左文脈 ID。0 から 65535 の整数 |
defaultRightContextId | number | 1288 | デフォルトの右文脈 ID。0 から 65535 の整数 |
defaultFieldValue | string | "*" | 欠損フィールドのデフォルト値 |
flexibleCsv | boolean | false | 柔軟な CSV パースを許可 |
skipInvalidCostOrId | boolean | false | 無効なコストまたは 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) | void | CSV レコードをスキーマに対して検証 |
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
| プロパティ | 型 | 説明 |
|---|---|---|
index | number | フィールドの位置インデックス |
name | string | フィールド名 |
fieldType | FieldType | フィールド型の列挙値 |
description | string | undefined | 任意の説明 |
FieldType
| 値 | 説明 |
|---|---|
FieldType.Surface | 単語の表層形 |
FieldType.LeftContextId | 左文脈 ID |
FieldType.RightContextId | 右文脈 ID |
FieldType.Cost | 単語コスト |
FieldType.Custom | 形態素素性フィールド |