Skip to content

ユーザー辞書の複数管理・インポート/エクスポート#318

Open
artin-kagun wants to merge 2 commits intoazooKey:mainfrom
artin-kagun:codex/user-dictionary-import-export-indexed
Open

ユーザー辞書の複数管理・インポート/エクスポート#318
artin-kagun wants to merge 2 commits intoazooKey:mainfrom
artin-kagun:codex/user-dictionary-import-export-indexed

Conversation

@artin-kagun
Copy link
Copy Markdown

Codexの助けを借りて作成したものです。

概要

macOS版のユーザー辞書機能を拡張します。

これまでの単一リスト形式のユーザー辞書を、複数の辞書を持てる形式に拡張し、辞書ごとの有効/無効、インポート、エクスポート、手動編集、検索、並び替えに対応しました。

また、ユーザー辞書のコメントを変換候補の注記として表示できるようにし、大きな辞書でも変換時の負荷が大きくなりにくいよう、保存済みインデックスを使う経路を追加しています。

主な変更点

ユーザー辞書の複数管理

  • ユーザー辞書内に複数の辞書を保持できるようにしました。
  • 辞書ごとに有効/無効を切り替えられるようにしました。
  • 既存の単一リスト形式のユーザー辞書設定は、新しい複数辞書形式へ読み替えるようにしています。
  • 既存ユーザーの辞書内容を失わないよう、旧形式からの移行互換性を維持しています。

ユーザー辞書エディタの拡張

  • 辞書の新規作成に対応しました。
  • 辞書削除時に確認ダイアログを出すようにしました。
  • 辞書名の編集と有効/無効の切り替えに対応しました。
  • 単語の手動追加、編集、削除に対応しました。
  • 単語一覧を検索できるようにしました。
    • 検索対象は「単語」「読み」「コメント」です。
  • 単語一覧の「単語」「読み」列をクリックして、昇順/降順で並び替えられるようにしました。
image

インポート / エクスポート

  • ユーザー辞書ファイルの読み込みに対応しました。
  • 読み込み時に、以下を選べるようにしました。
    • 新規辞書として読み込む
    • 選択中の辞書に追加する
  • 選択中の辞書を書き出せるようにしました。
  • Google 日本語入力形式のタブ区切りテキストをサポートしました。
  • コメント/注記欄もユーザー辞書の hint として取り込むようにしました。
  • 書き出し時にもコメント欄を含めて出力します。

変換候補へのコメント表示

  • ユーザー辞書に登録されたコメントを、変換候補の横に注記として表示できるようにしました。
  • コメントは、登録語と実際に表示されている候補が一致する場合だけ表示します。
  • これにより、内部的に同じ読みや辞書要素を含む別候補に、無関係なコメントが表示されることを防いでいます。
  • コメント表示で候補本文が隠れにくいよう、候補ウィンドウの注記表示レイアウトも調整しました。

添付画像は「りゅうすうていり」と入力時のもので、ユーザー辞書に登録されているコメントの表示例を示しています

image

大きな辞書向けの高速化

  • 変換時に毎回 UserDefaults 上の辞書を走査し続けないよう、ユーザー辞書の保存済みインデックスを追加しました。
  • 辞書内容が変わったときに revision を更新し、必要に応じてインデックスを再作成します。
  • インデックス化できる項目は保存済みインデックス経由で扱います。
  • インデックス化できない項目は、従来の動的検索経路で候補に出せるようにしています。
  • そのため、インデックス対象外の項目も辞書候補から消えないようにしています。

実装上の注意

変換候補の注記表示は、意図的に保守的にしています。

以前の実装では、候補の内部データにユーザー辞書由来の語が含まれているだけでコメントを表示すると、実際には登録していない候補にもコメントが出る可能性がありました。

このPRでは、候補として表示されている文字列と、ユーザー辞書に登録された単語が一致する場合だけコメントを表示します。

また、大きな辞書への対応では、候補数を単純に上限で切るような変更はしていません。変換精度を落とさないため、候補を雑に削るのではなく、辞書検索の経路をインデックス化する方向にしています。

検証

以下を実行しました。

  • swift test --disable-sandbox --package-path Core --build-path /private/tmp/azookey-pr-core-final-build
    • 40 tests passed
  • git diff --check upstream/main
  • plutil -lint azooKeyMac/azooKeyMac.entitlements
  • xcrun swiftc -parse azooKeyMac/Windows/UserDictionaryEditorWindow.swift

いずれも成功しています。

@ensan-hcl
Copy link
Copy Markdown
Member

ensan-hcl commented May 4, 2026

@artin-kagun すみません、変更が多すぎてレビューができないので、トピックごとに分割してPRにしてもらえないでしょうか?それと、PRを分割する作業の前に、各トピックに関して変更目的・内容・意図などをここで簡単に説明してほしいです。

@artin-kagun
Copy link
Copy Markdown
Author

@ensan-hcl
作法を存じ上げずすみませんでした。

依存関係があるため、完全に独立したPRではなく stacked PR として、前段のPRをbaseにして順番に積む形を想定しています。

分割案は以下です。

  1. ユーザー辞書の複数辞書データモデル化
  2. 複数辞書対応のユーザー辞書エディタUI
  3. ユーザー辞書のインポート/エクスポート
  4. ユーザー辞書コメントの候補注記表示
  5. 大規模ユーザー辞書向けインデックス/キャッシュ

各トピックの目的・内容・意図は以下の通りです。

1. ユーザー辞書の複数辞書データモデル化

目的

現在のユーザー辞書は単一の単語リストとして扱われていますが、複数の辞書を保持できるようにすることで、用途別・分野別に辞書を管理できるようにします。

内容

  • ユーザー辞書の保存形式を、単一の items 配列から、複数の辞書グループを持つ形式に拡張します。
  • 各辞書グループに、辞書名、有効/無効状態、単語リストを持たせます。
  • 既存の単一リスト形式のデータは、新しい形式に読み替えるようにします。
  • 辞書内容の変更を検知するための revision を導入します。

意図

今後の「辞書ごとの有効/無効切り替え」「インポート先辞書の選択」「辞書単位での書き出し」などの土台になる変更です。

既存ユーザーの辞書内容を壊さないよう、旧形式(既に実装されているユーザー辞書)からの移行互換性を保つことを重視しています。

複数の辞書を登録するというのは、以下の目的があります

  • 特定の作業の時に特定の辞書を有効にし、その作業をする時以外は無効にする
  • トピックごとに辞書を分けることを可能にすれば、そのトピックの辞書が不要になったときにその辞書を消すor無効化することができるため「変換が汚染されている」という状況を回避できる

2. 複数辞書対応のユーザー辞書エディタUI

目的

複数辞書化したユーザー辞書を、設定画面から実際に管理できるようにします。

内容

  • ユーザー辞書エディタに辞書一覧を追加します。
  • 辞書の追加、削除、名前変更、有効/無効切り替えに対応します。
  • 選択中の辞書に対して、単語の追加、編集、削除を行えるようにします。
  • 辞書削除時には確認ダイアログを表示します。
  • 単語一覧に検索欄を追加します。
  • 単語一覧の「単語」「読み」列をクリックして、昇順/降順で並び替えられるようにします。

意図

インポート機能に依存せず、ユーザーが手動でも辞書を作成・編集できる状態にするための変更です。
例えば他人が作成した辞書をインポートし、そのあと自分好みにカスタマイズするといった用途に用います。

検索/並び替えは、大きな辞書を扱う場合の編集性を高めるため、エディタUIの一部として含めます。

3. ユーザー辞書のインポート/エクスポート

目的

外部のユーザー辞書ファイルをazooKeyに取り込んだり、azooKey内の辞書を外部ファイルとして書き出せるようにします。

内容

  • ユーザー辞書ファイルのインポート処理を追加します。
  • 読み込み先として、以下を選べるようにします。
    • 新規辞書として読み込む
    • 選択中の辞書に追加する
  • 選択中の辞書を書き出せるようにします。
  • Google日本語入力形式のタブ区切りテキストをサポートします。
  • コメント/注記欄をユーザー辞書の hint として読み込みます。
  • 書き出し時にもコメント欄を含めて出力します。
  • 書き出し先としてユーザーが選んだ場所に保存できるよう、必要なファイルアクセス権限を追加します。

意図

既存の辞書資産をazooKeyへ移行しやすくするための変更です。

特にGoogle日本語入力形式のUTF-8タブ区切りテキストは、ユーザー辞書の交換・移行で使われやすいため、最優先で対応します。

4. ユーザー辞書コメントの候補注記表示

目的

ユーザー辞書に登録されたコメントを、変換候補の補足情報として表示できるようにします。

内容

  • ユーザー辞書エントリの hint/comment を変換候補表示へ渡します。
  • 候補ウィンドウでコメントを注記として表示します。
  • コメント表示時に候補本文が隠れにくいよう、候補ウィンドウの注記表示レイアウトを調整します。
  • コメントは、表示候補と登録語が一致する場合だけ表示します。

意図

専門用語や固有名詞を登録している場合に、候補の意味や補足を見ながら選べるようにするための変更です。

また、候補の内部データにユーザー辞書由来の語が含まれているだけでコメントを表示すると、実際には登録していない候補にもコメントが表示される可能性があります。

そのため、注記表示は意図的に保守的にし、表示されている候補文字列と登録語が一致する場合だけコメントを出すようにしています。

以下がコメント表示の例です

image

5. 大規模ユーザー辞書向けインデックス/キャッシュ

目的

数万語規模のユーザー辞書を使う場合でも、変換時の負荷が大きくなりすぎないようにします。

内容

  • ユーザー辞書用の保存済みインデックスを追加します。
  • ユーザー辞書・システムユーザー辞書の revision をもとに、インデックスが現在の辞書内容と一致しているか判定します。
  • 必要に応じてインデックスを再作成します。
  • インデックス化できる項目は保存済みインデックス経由で扱います。
  • インデックス化できない項目は、従来の動的検索経路で扱います。
  • インデックスの状態確認や再作成をユーザー辞書画面から行えるようにします。

意図

大きな辞書を入れたときに、変換のたびにUserDefaults上の全単語を走査すると入力が重くなるため、その負荷を下げるための変更です。

候補数を単純に上限で切るような方法は、変換精度を落とす可能性があるため採用していません。

インデックス化できない項目についても、候補から消えないように fallback 経路を残しています。

@ensan-hcl
Copy link
Copy Markdown
Member

いえ、初めてのPRだと思うので大丈夫です!一般論としては、大きな機能追加に関しては事前にディスカッションして合意形成をしていただく方がスムーズだと思います。

「複数辞書データ」ですが、これをazooKey for macOS本体に機能として入れるのは避けたいです。azooKey for macOSはあくまでニューラルかな漢字変換を用いた高精度な変換を強みとしたシンプルなシステムとすることを基本に考えていて、このような強力(かつ複雑)なユーザ辞書機能をサポートするつもりはあまりありませんでした。

「ユーザー辞書のインポート/エクスポート」に関しては良いと思います。フォーマットに関しては別途検討したいので、これは別のPRの中で議論できればと思います。

ユーザー辞書コメントの候補注記表示ですが、これはちょっと考えたいです。「ヒント」行は候補選択のための情報というよりは(現状使われていませんが)ニューラルかな漢字変換システムが利用するための意味情報を示すことを目的としています。

「大規模ユーザー辞書向けインデックス/キャッシュ」ですが、これは実際に数万件レベルのエントリを登録された上で試した感じでしょうか?そもそも「動的ユーザ辞書」自体軽量な追加情報のためのものであり、ユーザ辞書の適切な利用にはAzooKeyKanaKanjiConverterの静的ユーザ辞書システムを利用する想定でした。それも、数万件レベルのエントリではテストしていません。

@artin-kagun
Copy link
Copy Markdown
Author

azookeyの方針について、理解しました。

「大規模ユーザー辞書向けインデックス/キャッシュ」ですが、これは実際に数万件レベルのエントリを登録された上で試した感じでしょうか?

はい。
こちら Macbook air (M1, 16GB)の私の環境での話でございますが、1万語レベルの追加で体感できる入力速度の低下、4万語レベルの追加でもはや使用はできないほどの入力速度の低下が起きました。

@ensan-hcl
Copy link
Copy Markdown
Member

@artin-kagun このPRの「大規模ユーザー辞書向けインデックス/キャッシュ」でそれが改善するんですかね?

@artin-kagun
Copy link
Copy Markdown
Author

@ensan-hcl
はい。私の体験上はその実装によって改善しています。
その実装前には、キーボードを押してから画面に文字が出てくるまでに時間がかかるといった感じでした。
その実装を行ったことで、入力が反映されるまでの時間は、なにも改造を施していないazookey v0.1.3と同等と感じられるくらいに改善されました。
(違いが体感できないレベルです。実際の反映時間を何かのプログラムによって計測しているわけではないです)

@ensan-hcl
Copy link
Copy Markdown
Member

ありがとうございます。そしたら、可能であれば「ユーザー辞書のインポート/エクスポート」と「大規模ユーザー辞書向けインデックス/キャッシュ」に関して分割したPRをいただけないでしょうか?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants