辞書管理

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

辞書の読み込み

システム辞書

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

from lindera import load_dictionary

dictionary = load_dictionary("/path/to/ipadic")

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

dictionary = load_dictionary("embedded://ipadic")

読み込んだ Dictionary は、自身のメタデータも公開しています:

print(dictionary.metadata_name())      # 例: "ipadic"
print(dictionary.metadata_encoding())  # 例: "UTF-8"
metadata = dictionary.metadata()       # Metadata オブジェクト全体

ユーザー辞書は、組み合わせるシステム辞書と同じメタデータ(スキーマ、 エンコーディングなど)を共有する必要があります。load_user_dictionary_for は システム辞書を受け取り、そのメタデータを使います。 lindera-python/examples/tokenize_with_userdict.py とユーザー辞書を参照してください。

ユーザー辞書

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

from lindera import load_dictionary, load_user_dictionary_for

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

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

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

from lindera import load_user_dictionary, Metadata

metadata = Metadata()
user_dict = load_user_dictionary("/path/to/user_dictionary.csv", metadata)

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

from lindera import Tokenizer, load_dictionary, load_user_dictionary_for

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

tokenizer = Tokenizer(dictionary, mode="normal", user_dictionary=user_dict)

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

from lindera import TokenizerBuilder

tokenizer = (
    TokenizerBuilder()
    .set_dictionary("/path/to/ipadic")
    .set_user_dictionary("/path/to/user_dictionary.csv")
    .build()
)

辞書のビルド

システム辞書のビルド

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

from lindera import build_dictionary, Metadata

metadata = Metadata(name="custom", encoding="UTF-8")
build_dictionary("/path/to/input_dir", "/path/to/output_dir", metadata)

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

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

ユーザー辞書のビルド

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

from lindera import build_user_dictionary_for, load_dictionary, load_user_dictionary_for

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

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

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

from lindera import build_user_dictionary, Metadata

metadata = Metadata()
build_user_dictionary("ipadic", "user_words.csv", "/path/to/user_dictionary.bin", metadata)

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

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

注意: 最初の引数(上記の "ipadic")は現在未使用で、将来のために予約されて いるものです -- ビルドの選択や設定には一切影響しません。ビルドの挙動は metadata(特に metadata.user_dictionary_schema)によってのみ制御されます。 現時点では任意の文字列を渡すことができます。システム辞書に合わせてビルドするには build_user_dictionary_for を使います。

Metadata

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

Metadata の作成

from lindera import Metadata

# デフォルトのメタデータ
metadata = Metadata()

# カスタムメタデータ
metadata = Metadata(
    name="my_dictionary",
    encoding="UTF-8",
    default_word_cost=-10000,
)

JSON からの読み込み

metadata = Metadata.from_json_file("metadata.json")

プロパティ

プロパティ型デフォルト説明
namestr"default"辞書名
encodingstr"UTF-8"文字エンコーディング
default_word_costint-10000未知語のデフォルトコスト
default_left_context_idint1288デフォルトの左文脈 ID
default_right_context_idint1288デフォルトの右文脈 ID
default_field_valuestr"*"欠損フィールドのデフォルト値
flexible_csvboolFalse柔軟な CSV パースを許可
skip_invalid_cost_or_idboolFalse無効なコストまたは ID のエントリーをスキップ
dictionary_schemaSchemaIPADIC スキーマメイン辞書のスキーマ
user_dictionary_schemaSchema最小スキーマユーザー辞書のスキーマ

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

metadata = Metadata()
metadata.name = "custom_dict"
metadata.encoding = "EUC-JP"
print(metadata.name)  # "custom_dict"

to_dict()

メタデータを文字列の dict として返します。上記のプロパティを含み、2 つのスキーマは dictionary_schema_fields と user_dictionary_schema_fields(カンマ区切りのフィールド名)として格納されます:

metadata = Metadata(name="test")
print(metadata.to_dict())

ko-dic のようにメタデータが左側空白ペナルティのルールを持つ場合、dict にはそのルールを JSON 文字列で保持する space_penalty エントリも含まれます。ルールがない場合、このキーはありません:

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

Schema

Schema、FieldDefinition、FieldType は、辞書エントリーのフィールド構成を 表します。スキーマは Metadata.dictionary_schema と Metadata.user_dictionary_schema(上記の表を参照)で使用されます。

FieldType

FieldType は単一フィールドの種別を列挙します:

  • FieldType.Surface -- 表層形(単語のテキスト)
  • FieldType.LeftContextId -- 左文脈 ID
  • FieldType.RightContextId -- 右文脈 ID
  • FieldType.Cost -- 単語コスト
  • FieldType.Custom -- その他の辞書固有フィールド

FieldDefinition

FieldDefinition はスキーマ内の単一フィールドを表します。

FieldDefinition(index, name, field_type, description=None)

from lindera import FieldDefinition, FieldType

field = FieldDefinition(0, "surface", FieldType.Surface, "Surface form")

プロパティ(読み取り専用):

プロパティ型説明
indexintスキーマ内でのフィールドの位置(0 始まり)
namestrフィールド名
field_typeFieldTypeフィールドの種別
descriptionstr または None任意の説明文

Schema の作成

Schema はフィールド名の順序付きリストを保持し、フィールド名とインデックス間の 相互参照を提供します。

Schema(fields)

フィールド名のリストからスキーマを作成します。

from lindera import Schema

schema = Schema([
    "surface",
    "left_context_id",
    "right_context_id",
    "cost",
    "major_pos",
    "reading",
])

Schema.create_default()

組み込みのデフォルトスキーマを返す静的メソッドです。13 個のフィールドから成り、 IPADIC 形式のレイアウトに対応します(surface, left_context_id, right_context_id, cost, major_pos, pos_detail_1, pos_detail_2, pos_detail_3, conjugation_type, conjugation_form, base_form, reading, pronunciation)。

schema = Schema.create_default()

Schema のメソッドとプロパティ

メンバー戻り値説明
fields(プロパティ)list[str]すべてのフィールド名(順序どおり)
field_count()intフィールドの総数
get_field_index(name)int または Nonename という名前のフィールドのインデックス
get_field_name(index)str または Noneindex のフィールド名
get_custom_fields()list[str]4 つの固定フィールド(surface, left_context_id, right_context_id, cost)以降のフィールド名
get_field_by_name(name)FieldDefinition または Nonename の完全なフィールド定義
validate_record(record)Nonerecord がスキーマと一致しない場合 ValueError を送出
__len__()intfield_count() と同じ
schema = Schema.create_default()

schema.field_count()               # 13
schema.get_field_index("cost")     # 3
schema.get_field_name(0)           # "surface"
schema.get_custom_fields()         # ["major_pos", "pos_detail_1", ..., "pronunciation"]
len(schema)                        # 13

field = schema.get_field_by_name("surface")
print(field.index, field.name, field.field_type)  # 0 surface FieldType.Surface

schema.validate_record([
    "東京", "1288", "1288", "100",
    "名詞", "固有名詞", "地域", "一般", "*", "*",
    "東京", "トウキョウ", "トーキョー",
])