Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tech Kitchen #31 - グローバル版でMeCab辞書も管理したい

Avatar for k-ush k-ush
April 24, 2025

Tech Kitchen #31 - グローバル版でMeCab辞書も管理したい

Avatar for k-ush

k-ush

April 24, 2025
Tweet

Other Decks in Technology

Transcript

  1. MeCab辞書と ? - MeCab 形態素解析 結果を制御するため も 。ユーザ辞書 - 例:餡子(あんこ)を

    餡 / 子 に分けずに、1単語にしたい 簡単!餡子 まんじゅう 簡単 (名詞) / !(記号) / 餡子 (名詞) / (助詞) / まんじゅう (名詞) MeCab MeCab辞書 背景(1/2) - 検索 単語ベース マッチング - 変に分かち書きされてしまうと、困る場合がある 例: 餡子が餡 / 子 で別れると、餡(あん、餡かけ 餡など)でもヒットしてしまう なぜわかち書きが必要な か
  2. One Experienceプロジェクト - 日本側 システム 全てグローバル版に移行 - グローバル版 システム 中で、日本語検索

    改善再現を目指していた - 日本語 辞書を管理している部分も、グローバル版 方に移行する必要がある 背景(2/2)
  3. アプリケーションサイドで辞書を利用している 「Elasticsearch sudachiプラグイン入れて、ユーザ辞書入れてreindexして終わりでしょ?」 - 日本側 cookpadで 、文書を事前にトークナイズしてからインデックスしていた - 移行で 、完全再現するために我々もそ

    方法に則った - 検索側とインデックスする側 両方で辞書が必要 移行 課題(1 /3) Indexer Searcher Elasticsearch MeCab辞書 MeCab辞書 餡子,まんじゅう まんじゅう + 属性付与など... 餡子まんじゅう レシピ まんじゅう クエリ
  4. システム間で辞書 同期を取る必要がある - インデックスする側と、検索する側両方で辞書が必要(それぞれ 独立したシステム) - 単語ベース 検索で 、わかち書きが一致しないと検索できない 移行

    課題(2 /3) Indexer Searcher Elasticsearch 餡子,まんじゅう 餡,子 , まんじゅう + 属性付与など... 餡子まんじゅう レシピ 餡子 クエリ MeCab辞書 餡子:あんこ MeCab辞書 No Entry … new✨ old 「餡子」で検索してもヒットしない! → 辞書 同期 が取れていないと、適切に検索できない! 例
  5. 辞書をバージョニングして、 Elasticsearchを介して同期 移行した方法(1 /4) - 語彙管理システムにMeCab管理・生成機能を持たせ、S3を介して辞書を共有 - 辞書にバージョンを付与し、レシピに使った辞書バージョンを保持 - Searcher

    レシピ 辞書バージョンを元に同期 Indexer Searcher Elasticsearch S3 生成・アップロード レシピに使った辞書 バージョンも記録 mecab.dic.1 mecab.dic.2 … mecab.dic.7 レシピ 辞書バージョン: 7 語彙管理 システム 辞書をバージョニング MeCab辞書を生成 辞書 同期 辞書バージョンを キャッシュ
  6. グローバル版 語彙管理システムに、 Mecab辞書生成機能を生やす 移行した方法(2 /4) - 語彙管理システムにわかち書き制御用 モデルを追加 - MeCab辞書を管理できるように

    - わかち書き制御データ インポートジョブを作成して、日本 データをインポート - MeCab辞書生成ジョブを作成 - 生成した辞書 生成した辞書 S3に保存し、必要なシステム全てからアクセスできるように 各種ジョブ・ わかち書き モデル 追加 Indexer Searcher Elasticsearch S3 生成・アップロード レシピに使った辞書 バージョンも記録 mecab.dic.1 mecab.dic.2 … mecab.dic.7 レシピ 辞書バージョン: 7 語彙管理 システム 辞書をバージョニング MeCab辞書を生成 辞書 同期
  7. 辞書にバージョンを付与・使った辞書 バージョンをレシピに持たせる 移行した方法(3 /4) - 同じ辞書をIndexerとSearcherで使うために、辞書をバージョニング - レシピ メタデータとして「ど バージョン

    辞書でわかち書きしたか」を記録  → そ レシピインデックス ど 辞書を使っている かを知ることができる  → 辞書 同期に利用できる Indexer Searcher Elasticsearch S3 生成・アップロード レシピに使った辞書 バージョンも記録 mecab.dic.1 mecab.dic.2 … mecab.dic.7 レシピ 辞書バージョン: 7 語彙管理 システム 辞書をバージョニング MeCab辞書を生成 辞書 同期
  8. 移行した方法(4 /4) 検索サイド 使われている辞書 バージョンをチェックし、同期する - 新しい辞書を使うことで なく、Indexerとバージョンを合わせることが重要 - Searcherにスケジューラを導入して、今使われている辞書

    バージョンを5分間隔で確認 - 辞書バージョンに更新があったら、そ バージョン 辞書をフェッチして使う  → 5分以内に辞書 同期ができる - redisを使って、Searcherが複数いる場合 Elasticsearchへ lookupを減らす Indexer Searcher Elasticsearch S3 生成・アップロード レシピに使った辞書 バージョンも記録 mecab.dic.1 mecab.dic.2 … mecab.dic.7 レシピ 辞書バージョン: 7 語彙管理 システム 辞書をバージョニング MeCab辞書を生成 辞書 同期 辞書バージョンを キャッシュ
  9. 要件を正しく見直す - リアルタイムで流れてくるレシピや検索 中で、辞書更新時に わかち書き 不整合が起きて しまうタイミングがある - こ 不整合が起きてしまう時間をなるべく小さくしたい!

    - ここを頑張ろうとすると、色々大変 ... - しかし、よく考えると辞書更新 頻度 低く、影響も小さいことがほとんど → 数分 ギャップを許容することで、工数・時間 削減に繋がった 学び: - 要件を正しく見直して、必要 ないも を実装しない → 工数・時間を削減 大変だったこと・学び(1 /2)
  10. 作業を進めていく途中で設計時に 気づかなかった課題点が見つかった - 「こうすれ いい」と思っていた部分に抜けがあり、それで 不十分であることが判明 - 今回 そこまで深い問題にならなかったが、ヒヤッとした 学び:

    - 基礎的な構造(どこでデータを持って、どう流れるか等)に無理がなけれ 、具体的な手段で問題 があっても迂回しやすい - 今回 、辞書 バージョンをレシピに持たせたことが効いた - 実態を正しく表現できているし、設計で迷いが少なかった 大変だったこと・学び(2 /2)
  11. 新しいバージョン 辞書を使う - 新しい辞書を使うとき 、インデックス 再作成をする - インデックス 再作成 タイミングで、新しい辞書をフェッチして使用

    - 新しい辞書でレシピをわかち書き - レシピ 辞書バージョンを更新 - 検索サイド 、新しい辞書バージョンを検出して、辞書をSyncする 新しいバージョン辞書を使う →インデックスを再作成