Skip to content

日本語の用途・感情から検索できるオフライン絵文字検索を追加 - #12

Draft
kkrix3 wants to merge 12 commits into
previewfrom
feature/emoji-semantic-search
Draft

kkrix3 wants to merge 12 commits into
previewfrom
feature/emoji-semantic-search

Conversation

@kkrix3

@kkrix3 kkrix3 commented Oct 28, 2026 •

Copy link
Copy Markdown
Owner

絵文字の正式名称を知らなくても、日本語の読み・用途・感情から探せるオフライン検索を追加します。絵文字モード内の私有かなパネルでクエリを編集し、入力先アプリへは選択した絵文字だけを既存経路で入力します。

  • base: preview (e3cc93537c1c0912cb451b39133c270d39a10b9b)
  • head: feature/emoji-semantic-search (8d4d9eab98b3c70ed2414d7bfa71e03f137b0b1f)
  • Draft・未マージ。保護ブランチへの直接push・force pushはありません。
  • 詳細・28語と未使用24語の上位結果・限界:実装レポート

検索データと処理

CLDR 48.2の日本語名称・キーワード(Unicode-3.0)、既存同梱辞書の読み、MITの用途・感情73概念を組み合わせます。カテゴリ・順序は既存のUnicode Emoji 17.0 metadataを使い、実収録1,902種類だけを返します。先行調査1,914種類とは共通1,898/調査側だけ16/実収録だけ4(髪の部品)です。CLDR原本・ハッシュ・完全な許諾文・再生成手順を保存し、APKにも許諾文を同梱します。

名称・同義語の完全一致、前方・部分・複数語・関連語を共通の重みで順位付けします。NFKC・かな・英字ケース・表示セレクタ・肌色の差を照合側で吸収し、入力するUnicode文字列を保持します。履歴で関連度を逆転させず、弱い候補で枠を埋めません。モデル・ベクトル・ORT等の追加はありません。

UIはEditText/InputConnectionを検索用に使いません。削除、押したままの検索移行、Backとkeyup、肌色、履歴、モード切替、入力セッション終了・回転を扱います。50ms debounceと取消・世代番号で古い結果を抑止し、検索・データ読込はワーカーで行います。検索未使用時はデータをロードしません。かなパネルは漢字変換・ローマ字変換・自由なカーソル編集を提供しません。Google絵文字表示切替には依存しません。

品質

集合 Hit@1 Hit@5 MRR@10
先行CSVの28語 28/28 28/28 1.000
開発用追加24語 20/24 24/24 0.904
辞書・重み固定後の未使用24表現 13/24 15/24 0.571

28語と開発用24語は辞書作成・一致規則の検討に利用しています。独立評価ではありません。 未使用24語も実装者が作った小標本で、利用者による包括的な関連度評価ではありません。未使用集合の結果から辞書や重みを追加調整していません。母集団・説明データが違うため、先行E5より一般化が優れるという主張はしません。

「心から感謝しています」で🈯️、「ちょっと一息つこう」で🤏・1️⃣、「今日は土砂降り」で⌛️・⏳️が上位になる誤一致を確認しています。未知の言い換え・活用・含意・否定・皮肉の理解には限界があります。「感激で胸がいっぱい」→🥲は妥当でも代表正解外のため未命中です。

各クエリのCSV・測定生データ。DictionaryEmojiSearchEngineそのものを実行し、実データ検証はアプリ側のLOUDS readerでも照合します。

検証と性能

最終head 8d4d9eab98b3c70ed2414d7bfa71e03f137b0b1f のCIが成功。以下はテストXMLと端末ログを確認した結果です。

  • Full Preview CI:custom_keyboard 409/core 88/app 450=947件。失敗・エラー・スキップ0。追加のAPI 28/34入力保護10件を含みます。upstream比較jobも成功。
  • 検索専用CI:symbol 18件/実収録集合1件/API 28/34入力保護10件、全て成功。上記947件と重複するテストがあるため合算しません。76クエリの順位・上位結果を実際の同梱辞書readerでも再確認。
  • Android 14 / API 34実IME試験1件成功:現在のIMEウィンドウへOSタッチを注入。かなフリック検索、編集先のテキスト・選択・未確定範囲の保護、UI/物理削除、Back、選択した🙏🏽だけの入力、履歴、回転時の検索破棄を検証。成功時の画面も確認。
  • Android 15 / API 35の既存実IME・multi-pointer試験20件成功:custom 1/qwerty 16/app 3。失敗・エラー・スキップ0。
  • CLDR生成Pythonテスト2件・再生成のバイト一致がCIで成功。ホストJUnitは6件成功。
  • 検索のXML・品質CSV・端末測定ログ・画面、Full単体テストXML、API 35端末レポート。
測定環境 検索p50 検索p95 条件
Linux x86_64 / OpenJDK 17 / Kotlin 2.2.10 0.337ms 0.511ms 76要求×20回、独立3 JVMの中央値
Android 14 / x86_64 Debugエミュレータ 19.26ms 84.30ms CIの2 vCPU・3GB、6要求×40回、予熱後240件

Android値は実機・Releaseの性能ではありません。ホストの値からAndroidの速度を推定しません。検索はUI外のワーカーで実行し、50ms debounceと取消・世代管理を使います。端末の操作列時間にはアクセシビリティ探索・OSイベント注入・画面保存が入り、検索レイテンシや起動時間として扱いません。

ホスト:p99 0.908ms、repository生成 26.2ms、予熱・GC後の保持ヒープ増分 1,071,000 bytes、割当 3,128 bytes/query。AndroidプロセスPSSは検索前 190,318KB → 操作・履歴・検索測定後 194,825KB(差4,507KB)。同じプロセスでホストActivityとIME等が動いており、検索単体の常駐量ではありません。検索データは初回の検索開始時にIOワーカーで読み込み、検索未使用時は読み込みません。キーボード全体の初期化時間への因果的な影響は未測定です。

検索TSV 270,098 bytes+許諾文 2,352 bytes(Full Preview APK圧縮後計 76,815 bytes)。同じFull Standard Preview unsigned構成の基点APK 173,741,858 bytes → 最終APK 173,840,798 bytes、差 +98,940 bytes(約0.057%)。追加モデル・vector index・推論runtimeは0。元XML・評価ツールはAPKへ入れません。versionCodeやビルド由来のprofile等も変わるため、APK差はこの2ビルド間の実測です。

Android 14のARM64実機での速度・メモリ・電力・温度、通常入力の長時間使用、floating/splitでの検索操作、横向きで検索を開き直した際の操作感は未検証です。回転時の状態破棄はAPI 34で検証済みです。

APK

両APKのmetadata・SHA-256・検索asset・ARM64/x86_64ライブラリ同梱を確認しました。検証用merge commit 602aeca54228726a62e92efaa962a0737acca7ee のtree 0ebac72a96399b9fa68de59511b8edaa243f6098 は最終feature headと完全一致しています。

  • インストール用Debug検証APK(30日保持)。ZIP内 sumire-emoji-search-debug-testbench.apk。実際にAPI 34へインストールして試験した同一APKです。別ID com.kazumaproject.markdownhelperkeyboard.preview.testbench、CI生成のDebug証明書、ARM64/x86_64同梱、185,133,928 bytes。adb install -r -t sumire-emoji-search-debug-testbench.apk で導入し、Androidのキーボード設定から有効化できます。SHA-256: 3e301b362de66fce264b54504c0c25a31bff3ea2f87ba136818cc8ee59cb3f66。
  • Full Preview unsigned APK(14日保持)。非debugの通常Preview構成。既存の検査でID・IME service/provider・native ABI・16KB alignment・未署名を確認。そのままインストールはできません。SHA-256: 2c29081fa2683bd1dd740fe9e2f46d93d8fa9fc7271533f246e44315bf34450e。
  • APK検査記録。

既存のFull Preview署名jobは保護されたpreviewでの所有者の手動実行に限定され、今回は条件どおりスキップされています。署名条件・鍵・既存CIの設定は変更していません。Debug検証版は通常のSumire/Previewと共存する別IDです。署名情報・秘密鍵の出力はありません。

主な変更と拡張点

  • EmojiSearchRepository:実収録集合と検索メタデータの対応。
  • EmojiSearchEngine/辞書実装/Normalizer:Androidに依存しない検索と順位付き結果。
  • EmojiSearchInputState/EmojiSearchInputView/CustomSymbolKeyboardView/日英リソース:私有入力と結果UI。
  • IMEService:検索中の物理入力・戻る・セッション終了の接続。
  • tools/emoji_search、単体・実IMEテスト、専用Android 14 CI。既存Preview CI・署名設定は変更せず、Pagingはテストの参照用に既存と同じ版だけを追加。

将来E5を追加する場合はEmojiSearchEngineの別実装から同じ結果形式を返し、repositoryのidentityでindexと実収録を対応付けます。UIは再利用できます。モデルhash・tokenizer・前処理・indexの整合、取消、専用ワーカー、未知表現の独立評価は追加側の課題です。辞書方式は登録した用途・感情の短い語に強く、広い言い換えや文脈を扱うにはEmbedding等の候補生成が必要になります。

This branch has not been deployed

No deployments
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.

1 participant