辞書管理
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
プロパティ
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
name | String | "default" | 辞書名 |
encoding | String | "UTF-8" | 文字エンコーディング |
default_word_cost | Integer | -10000 | 未知語のデフォルトコスト |
default_left_context_id | Integer | 1288 | デフォルトの左文脈 ID |
default_right_context_id | Integer | 1288 | デフォルトの右文脈 ID |
default_field_value | String | "*" | 欠損フィールドのデフォルト値 |
flexible_csv | Boolean | false | 柔軟な CSV パースを許可 |
skip_invalid_cost_or_id | Boolean | false | 無効なコストまたは 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}]}'