辞書管理

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 オブジェクト全体

これは、システム辞書と同じメタデータ(スキーマ、エンコーディングなど)を 共有する必要があるユーザー辞書を読み込む際に便利です。 lindera-python/examples/tokenize_with_userdict.py を参照してください:

from lindera import Tokenizer, load_dictionary, load_user_dictionary

dictionary = load_dictionary("embedded://ipadic")
metadata = dictionary.metadata()
user_dictionary = load_user_dictionary("/path/to/user_dictionary.csv", metadata)

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

ユーザー辞書

ユーザー辞書はシステム辞書にカスタム語彙を追加します。

from lindera import load_user_dictionary, Metadata

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

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

from lindera import Tokenizer, load_dictionary, load_user_dictionary, Metadata

dictionary = load_dictionary("/path/to/ipadic")
metadata = Metadata()
user_dict = load_user_dictionary("/path/to/user_dictionary", metadata)

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")
    .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 など)が含まれている必要があります。

ユーザー辞書のビルド

CSV ファイルからユーザー辞書をビルドします:

from lindera import build_user_dictionary, Metadata

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

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

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

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

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 のエントリーをスキップ
normalize_detailsboolFalse形態素の詳細情報を正規化
dictionary_schemaSchemaIPADIC スキーマメイン辞書のスキーマ
user_dictionary_schemaSchema最小スキーマユーザー辞書のスキーマ

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

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

to_dict()

メタデータの辞書表現を返します:

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

Schema

SchemaFieldDefinitionFieldType は、辞書エントリーのフィールド構成を 表します。スキーマは Metadata.dictionary_schemaMetadata.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",
    "名詞", "固有名詞", "地域", "一般", "*", "*",
    "東京", "トウキョウ", "トーキョー",
])