Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
外国人が日本語の検索機能をElasticsearchで作ってみた
Search
Sunggyu 'KEI' Rhie
December 19, 2018
Technology
3
1.2k
外国人が日本語の検索機能をElasticsearchで作ってみた
外国人だから日本語検索は難しいの?
実は日本語検索自体が大変なんじゃない?
じゃどう作っていくの?
をElasticsearchで解決してみました
Sunggyu 'KEI' Rhie
December 19, 2018
Tweet
Share
More Decks by Sunggyu 'KEI' Rhie
See All by Sunggyu 'KEI' Rhie
「うどん」の検索結果には何を出すべきか
r4keisuke
4
2.2k
Other Decks in Technology
See All in Technology
技育祭2025【秋】 企業ピッチ/登壇資料(高橋 悟生)
hacobu
PRO
0
100
ユーザーの声とAI検証で進める、プロダクトディスカバリー
sansantech
PRO
1
140
能登半島地震において デジタルができたこと・できなかったこと
ditccsugii
0
200
AIツールでどこまでデザインを忠実に実装できるのか
oikon48
6
3.4k
E2Eテスト設計_自動化のリアル___Playwrightでの実践とMCPの試み__AIによるテスト観点作成_.pdf
findy_eventslides
2
620
AWSでAgentic AIを開発するための前提知識の整理
nasuvitz
2
160
プロダクトのコードから見るGoによるデザインパターンの実践 #go_night_talk
bengo4com
1
2.5k
なぜAWSを活かしきれないのか?技術と組織への処方箋
nrinetcom
PRO
5
900
業務効率化をさらに加速させる、ノーコードツールとStep Functionsのハイブリッド化
smt7174
2
140
GoでもGUIアプリを作りたい!
kworkdev
PRO
0
140
Performance Insights 廃止から Database Insights 利用へ/transition-from-performance-insights-to-database-insights
emiki
0
280
『バイトル』CTOが語る! AIネイティブ世代と切り拓くモノづくり組織
dip_tech
PRO
1
130
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
353
21k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
31
2.7k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.2k
Java REST API Framework Comparison - PWX 2021
mraible
34
8.9k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
Typedesign – Prime Four
hannesfritz
42
2.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
A designer walks into a library…
pauljervisheath
209
24k
We Have a Design System, Now What?
morganepeng
53
7.8k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.6k
Optimizing for Happiness
mojombo
379
70k
Building a Scalable Design System with Sketch
lauravandoore
463
33k
Transcript
1 外国人が日本語の検索機能を Elasticsearchで実装してみました 李 晟圭
自己紹介 李 晟圭(イ・ソンギュ) 韓国出身 2016年からRetty在籍中 WEB/Search Team Engineering Manager 最近は事業成長に貢献(のつもり) しながら
技術的挑戦や組織作り・育成 などを主に
日本最大級の実名グルメサービス「Retty」 実名制 オススメの口コミ 友人との「つながり」 口コミ内容はポジティブな“おすすめ”で きるお店を投稿。 点数評価ではありません。 Rettyのサービス内で“友人”や“食の 嗜好が合う同士”がフォロー機能でつ ながっているSNS型です。
実名制口コミの信頼度が非常に高いグ ルメサービスです。 2011年6月にサービスを開始した実名グルメサービス「 Retty」は、 グルメに強いこだわりを持つ方々を中心に、 「オススメ」したいお店の情報を実名ベースでご 投稿いただく形で運営しています。 「自分にベストなお店が見つかる」グルメサービスとして、 20~40代の男女を中心に、 幅広い年代にご利用いただいていま す。
スマホ時代の実名グルメサービス「Retty」 月間利用者数4,000万人突破(2018年11月時点)
ユーザーさんのニーズに合わせた 良いお店を発見できることが 究極的な価値である グルメサービスには検索は必須
エリア ✕ ジャンル ✕ 目的 恵比寿 ✕ 焼き鳥 ✕ デート よくある検索
店名 鳥はな 焼き鳥屋佐藤 炭火焼き鳥江戸屋 よくある検索 ※全ての店名はこのスライドのために適当に作った架空の店名です。 実在する店舗の名前とかぶることがあってもそれは偶然なので、特定お店を取り上げてるつもりはございませんのでご容赦ください。
内容が膨らみすぎて店名にしぼりました ここでお詫び
Lサイズ靴下3足でなんと500円! 日本語では普通の表現
Lサイズ靴下3足でなんと500円! ひらがな、カタカナ、 漢字(よみがな、ふりがな)、 ローマ字、アラビア数字が 字空きなく書かれている 外国人からすると
Lサイズ靴下3足でなんと500円! でもこれでも意味がわかる
L サイズ 靴下 3 足 で なんと 500 円 !
脳内形態素解析発動 でもこれでも意味がわかる
単純に日本語に慣れてないから? 脳内形態素解析用辞書がまだまだだから? 結局外国人として難しいのは
「店名」なので 店主が好きなように決められる 日本語もその範囲を狭めて店名にすると
やきとん はなまる 鮨一 ラ・グランベリー・ルージュー The Farmer’s Cuisine ラーメン234 店名の例 ※全ての店名はこのスライドのために適当に作った架空の店名です。
実在する店舗の名前とかぶることがあってもそれは偶然なので、特定お店を取り上げてるつもりはございませんのでご容赦ください。
博多らぁめん屋ウマウマTONKOTSU〜豚骨〜246 沿い店 店名の例 ※全ての店名はこのスライドのために適当に作った架空の店名です。 実在する店舗の名前とかぶることがあってもそれは偶然なので、特定お店を取り上げてるつもりはございませんのでご容赦ください。
友達 店名の例
友達 店名の例 フレンド
外来語や固有名詞のなどは分かち書きや 固有名詞の漢字の読み方は 日本人もわからないことがよくある 結局外国人だからとかじゃない
脳内形態素解析に対応できる辞書はない 検索機能として作るには
ユーザさんは必ずしも 形態素解析や分かち書きのとおりに 検索するとは限らない 検索機能として作るには
ngramでいいのでは? 検索機能として作るには
適合率と再現率 つまり質か量か 検索機能として作るには
課題1:分かち書きできない固有名詞 課題2:想定できない読み仮名 課題3:一定レベルの質担保 課題4:ユーザーさんは店名を覚えていない 課題
なんでElasticsearchでやるの? は省略します! Elasticsearchで解決してみましょう
Analyzerは、新語・造語に強い mecab-ipadic-NEologdを使うので Kuromoji-NEologd with 自家製辞書 + ICU analysis を基本に Elasticsearchで解決してみましょう
Normalizeは ICU Normalizerに 任せるとして Elasticsearchで解決してみましょう
まずは「正式店名」 お店さんが公式とする店名 課題1:分かち書きできない固有名詞
やきとん はなまる 鮨一 ラ・グランベリー・ルージュー The Farmer’s Cuisine ラーメン123 正式名称の例
空白文字 記号(・、’〜など)で 区切ってみる 正式名称のTokenize
「やきとん」 「はなまる」 「鮨一」 「ラ」「グランベリー」「ルージュー」 「The」「Farmer」「s」「Cuisine」 「ラーメン」「123」 正式名称のTokenize
ラ・グランベリー・ルージュー →「ラ」「グランベリー」「ルージュー」 これでは「ラグランベリー」というクエリではヒットしな くなる 正式名称のTokenize
ラ・グランベリー・ルージュー →「ラ」「グランベリー」「ルージュー」 →「ラグランベリールージュー」 の2パターンを用意する 正式名称のTokenize
ラ・グランベリー・ルージュー →「ラ」「グランベリー」「ルージュー」 →「ラグランベリールージュー」 の2パターンを用意する 正式名称のTokenize 各Token毎の 完全一致と前方部分一致で検索できる
ラ・グランベリー・ルージュー →「ラ」「グランベリー」「ルージュー」 →「ラグランベリールージュー」 の2パターンを用意する 正式名称のTokenize なんか「ランベリー」とかのお店だったよね? →はい、これはngramで
正式名称のAnalyze ラ・グランベリー・ルージュー 全部つなげた前方一致用Analyzer TokenizeしたToken毎前方一致用Analyzer 部分一致用Analyzer の3種を用意する
全部つなげた前方一致Analyzerは Char Filter:記号削除 Tokenizer:edge ngram
課題2:想定できない読み仮名 次は読み仮名
やきとん はなまる 鮨一 ラ・グランベリー・ルージュー The Farmer’s Cuisine ラーメン123 友達 内房
正式名称の例
やきとん はなまる:やきとん はなまる 鮨一:すしいち ラ・グランベリー・ルージュー:ら ぐらんべりー るーじゅー The Farmer’s Cuisine:ふぁーまーず
くいじん ラーメン123:らーめん ひふみ 友達:ふろんど 内房:あんぱん 読み仮名の例 ※全ての店名はこのスライドのために適当に作った架空の店名です。 実在する店舗の名前とかぶることがあってもそれは偶然なので、 特定お店を取り上げてるつもりはございませんのでご容赦ください。
そんなのはない 読み仮名の解決策
データを確保し 正式名称と同じ形で Analyzerを配置する 課題2:想定できない読み仮名
できたと思ったら ラ・グランベリー・ルージューって 英語表記もあるらしい La Grandberry Rouge
課題追加:英語名称 La Grandberry Rouge ユーザさんは投げます、berry
課題1と2+αを解決するには Analyzerの数=Fieldの数 正式名称×3 読み仮名×3 英語名称×3 を用意して基本はできた
課題3:一定レベルの質担保 質とは クエリに対して 探している店舗が 表示されること
課題3:一定レベルの質担保 質と量はトレードオフ しかし表示されないお店があってはならない
課題3:一定レベルの質担保 より合致しそうなお店を ユーザーさんに早く届ければいい つまりスコアリングで表示順を上にする
課題3:一定レベルの質担保 1. 完全一致 2. 前方一致 3. Token毎前方一致 4. 部分一致
課題3:一定レベルの質担保 クエリによるスコアリングは 実際はたくさんの変数の中の一つである ユーザさんが求めるものに 近づけるための最低限の担保
課題4:ユーザさんは店名を覚えていない 「ユーザさんが求めるものに 近づけるための最低限の担保」 店名がはっきりわからないからこそ 検索がある
課題4:ユーザさんは店名を覚えていない 激辛ラーメン鳳の爪 激辛ラーメン凰の爪
課題4:ユーザさんは店名を覚えていない Fuzziness
Fuzziness レーベンシュタイン距離を用いて 文字数によって数文字ぐらいの 誤差は許す
Fuzziness 激辛ラーメン鳳の爪 激辛ラーメン凰の爪 どっちもヒットする!
Fuzziness 鳳の爪 凰の爪 1文字違うけど1/3なので
Fuzzinessは質を落とす あのね そのね このね どのね 1文字違うけど1/3なので
Fuzzinessは質を落とす 質への影響が激しいので 使うときには アプリケーションでの調整などで 制限的に使う
すべての課題がElasticsearchで解決! ここまでやって やっと「探してる店舗が表示されない」 という問い合わせが来なくなりました 一応成功
すべての課題がElasticsearchで解決! ここで余談
すべての課題がElasticsearchで解決! Rettyはグローバル展開してます 香港とタイ
タイのユーザさんに言われました まだまだだね
一緒にやってくれる方、ぜひ 助けてください
終わり ご清聴ありがとうございました