辞書管理

Lindera Ruby は、形態素解析で使用する辞書の読み込み、ビルド、管理のためのメソッドを提供します。

辞書の読み込み

システム辞書

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

require 'lindera'

dictionary = Lindera.load_dictionary('/path/to/ipadic')

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

dictionary = Lindera.load_dictionary('embedded://ipadic')

ユーザー辞書

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

require 'lindera'

dictionary = Lindera.load_dictionary('/path/to/ipadic')
user_dict = Lindera.load_user_dictionary_for('/path/to/user_dictionary.csv', dictionary)

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

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

require 'lindera'

dictionary = Lindera.load_dictionary('/path/to/ipadic')
metadata = dictionary.metadata
user_dict = Lindera.load_user_dictionary('/path/to/user_dictionary.csv', metadata)

トークナイザーの作成時にユーザー辞書を渡します:

require 'lindera'

dictionary = Lindera.load_dictionary('/path/to/ipadic')
user_dict = Lindera.load_user_dictionary_for('/path/to/user_dictionary.csv', dictionary)

tokenizer = Lindera::Tokenizer.new(dictionary, 'normal', user_dict)

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

require 'lindera'

builder = Lindera::TokenizerBuilder.new
builder.set_dictionary('/path/to/ipadic')
builder.set_user_dictionary('/path/to/user_dictionary.csv')
tokenizer = builder.build

辞書のビルド

システム辞書のビルド

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

require 'lindera'

metadata = Lindera::Metadata.from_json_file('metadata.json')
Lindera.build_dictionary('/path/to/input_dir', '/path/to/output_dir', metadata)

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

Lindera::Metadata.from_json_file で読み込んだメタデータは metadata.json の space_penalty ルールを保持し、ビルドした辞書にもそのルールが同梱されます。そのため ko-dic をビルドした場合も、左側空白ペナルティはデフォルトでオンのままです。トークナイザーごとにオフにするには TokenizerBuilder#set_space_penalty(false) を使います(Tokenizer API を参照)。

ユーザー辞書のビルド

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

require 'lindera'

dictionary = Lindera.load_dictionary('/path/to/ipadic')
Lindera.build_user_dictionary_for('user_words.csv', '/path/to/user_dictionary.bin', dictionary)
user_dict = Lindera.load_user_dictionary_for('/path/to/user_dictionary.bin', dictionary)

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

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

require 'lindera'

metadata = Lindera::Metadata.from_json_file('metadata.json')
Lindera.build_user_dictionary('ipadic', 'user_words.csv', '/path/to/user_dictionary.bin', metadata)

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

Lindera.build_user_dictionary('ipadic', 'user_words.csv', '/path/to/user_dictionary.bin', nil)

[!NOTE] 第一引数(kind、上の例では 'ipadic')は現時点では未使用です -- 将来の利用のために予約 されているだけで、ビルドには影響しません。現時点では任意の文字列を渡すことができます。 システム辞書に合わせてビルドするには Lindera.build_user_dictionary_for を使います。

Metadata

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

Metadata の作成

require 'lindera'

# 標準設定でデフォルトのメタデータを作成
metadata = Lindera::Metadata.create_default

Lindera::Metadata.new は8つのプロパティすべてを必須の位置引数として受け取ります (それぞれ nil を渡すとデフォルト値にフォールバックします)。特定の値を上書きしたい 場合にのみ使用してください:

metadata = Lindera::Metadata.new(
  'my_dict', # name
  'UTF-8',   # encoding
  -10_000,   # default_word_cost
  1288,      # default_left_context_id
  1288,      # default_right_context_id
  '*',       # default_field_value
  false,     # flexible_csv
  false      # skip_invalid_cost_or_id
)

JSON ファイルからの読み込み

metadata = Lindera::Metadata.from_json_file('metadata.json')

辞書からのメタデータ取得

読み込み済みの辞書からメタデータを取得できます:

dictionary = Lindera.load_dictionary('/path/to/ipadic')
metadata = dictionary.metadata

プロパティ

プロパティ型デフォルト説明
nameString"default"辞書名
encodingString"UTF-8"文字エンコーディング
default_word_costInteger-10000未知語のデフォルトコスト
default_left_context_idInteger1288デフォルトの左文脈 ID
default_right_context_idInteger1288デフォルトの右文脈 ID
default_field_valueString"*"欠損フィールドのデフォルト値
flexible_csvBooleanfalse柔軟な CSV パースを許可
skip_invalid_cost_or_idBooleanfalse無効なコストまたは ID のエントリーをスキップ

to_h(別名 to_hash)は、これらのプロパティに dictionary_schema_fields と user_dictionary_schema_fields(カンマ区切りのフィールド名)を加えた、値がすべて文字列の Hash を返します。ko-dic のようにメタデータが左側空白ペナルティのルールを持つ場合は、そのルールを JSON 文字列で保持する space_penalty エントリも含まれます:

metadata = Lindera::Metadata.from_json_file('/path/to/ko-dic/metadata.json')
metadata.to_h['space_penalty']
# '{"rules":[{"pos":["EC","EF",...],"cost":3000},{"pos":["JC","JKB",...],"cost":6000}]}'