Skip to content
English

Elasticsearchよる日本語での検索結果改善

Posted on in Engineering

※文中で紹介されているリンクはいずれも英語ページのみとなっています。予めご了承ください。

日本語(及び中国語、韓国語を含む「CJK統合漢字」と呼ばれる言語)の検索結果の関連性を改善するには特有の課題が立ちはだかるが、それに取り組んでいるのがシニアウェブエンジニアのIvan Kristiantoである。文脈や複数の文字種、そして区切り方等の困難を克服するために彼がどのようなテクニックを使っているのか、ぜひ続きをご覧いただきたい。

日本語のコンテンツにおける検索結果の関連性については、日本語という言語ならではの特徴や使用方法ゆえにかなり複雑な問題を抱えることがある。特に、単語がスペースで区切られていないことが大きな原因の一つである。

全文検索の技術を用いることで検索結果の関連性を改善するのが一般的だが、今回は形態素解析とn-gram解析を用いた日本語の全文検索の実装方法についてお伝えする。

「意味」の検索

日本語ではカタカナ、ひらがな、そして漢字という3つの文字種があり、それぞれが混ざり合わさって使われる。

例を挙げてみよう。以下の2つは全く異なる意味を持つものだが、文字列がとてもよく似ている。

  • インフルエンサー(Influencer)
  • インフルエンザ(Influenza)

ユーザーが「インフルエンザ 夏の沖縄(Okinawa in the summer of influenza)」を検索しようとすると「沖縄のインフルエンサー(Influencer in Okinawa)」に関する結果が多く出てきてしまうことがあるが、これはデータベース上のコンテンツに基づく関連性スコアが後者において高いことによるものだ。

当然、混乱を招くような検索結果となり、ユーザー体験も良くはない。

当社ではAltisプラットフォームに実装されているElasticsearchを使用し、検索結果の関連性を改善することに成功している。

プレシジョンとリコール

全文検索システムの有効性を評価する基本的な指標として「プレシジョン」と「リコール」がある。「プレシジョン」は検索された結果の総数に対する関連する結果の比率を測定することで、検索結果の正確さを定量化するもので、システムが関連性のない情報を回避する能力を反映している。逆に「リコール」は、関連する文書をすべて検索するシステムの能力を測定し、適切な情報の省略をどの程度回避できるかを示す。

例えば、高い精度を示す検索システムでは、「電話(phone)」という用語を入力すると「電話」に分類されるアイテムのみを返すなど、検索キーワードに関連する結果のみを返す。逆に、リコール性の強い検索では「電話(phone)」という用語を含むすべての項目を検索し、楽器のサックス(※英語でsaxophone。綴りにphoneを含む)を含む単なる電気通信機器にとどまらない多様な文脈を含める。

プレシジョンとリコールの間にある、本質的な妥協点を認識することが不可欠になってくる。これらの指標のバランスを取るには、自社での使用に必要な要件に合わせていくことが必要である。検索のパフォーマンスを最適化する上ではテストと調整を繰り返し行い、自社独自の要件を満たすことが欠かせないのだ。

技術的実装の概要

ほとんどのヨーロッパ言語では、単語は空白で区切られているため、文章を単語に分割するのは容易である。AltisのElasticsearchではアナライザーがうまく機能しており、Kuromoji indexに存在する単語に基づいて文章の分割を行っている。

しかしながら日本語(そして中国語、韓国語)では単語を区切る空白が存在しない。

日本語では、主に以下の2つの方法で転置インデックスの作成を行う。

  • n-gram分析:文字列をN文字で区切る
  • 形態素解析:辞書を使って意味のある単語に分割する

ただし、それぞれ単独では不十分である。

  • n-gram分析では、インデックスが肥大化する傾向がある。品詞情報に基づく処理ができず、無意味な分割が多くなる。(検索漏れは減るが、検索ノイズは増える)
  • 形態素解析は新語(未知の言葉)に弱い。辞書ベースの場合、辞書にない単語は検出できない。(検索ノイズは少ないが、検索漏れが多い)

つまり、日本語の検索関連性を高めるためには、両方の分析が必要なのだ。

  • n-gram分析を使用し検索漏れを減らす
  • 形態素解析を使用し検索ノイズを減らす

これらを実現させるため、当社ではAltisに既にインストールされているElasticsearch用の拡張機能を2つ使用。詳細についてはこちらの参考資料を参照いただきたい。

  • ICU解析プラグイン: Lucene ICU モジュールを Elasticsearch に統合し、ICU ライブラリを使用した拡張 Unicode サポート(アジア言語の解析、Unicode 正規化、Unicode を意識した大文字小文字の折りたたみ、照合順序のサポート、音訳など)を追加
  • 日本語(Kuromoji)解析プラグイン:Lucene Kuromoji解析モジュールを Elasticsearch に統合

n-gram分析と形態素解析を組み合わせることで、当社ではAltis上のElasticsearchにおける日本語の検索関連性を大幅に改善。

ICU解析プラグインと日本語(Kuromoji)解析プラグインを戦略的に導入することで、検索漏れの最小化と検索ノイズの低減の絶妙なバランスを取っている。

この綿密なアプローチを通して、当社の検索システムが日本語という複雑な言語環境においても、正確で包括的な検索結果を提供することが可能になっている。そしてこれらの機能強化により、ユーザーにとっては検索精度と関連性が向上し、大幅に改善された検索体験をすることができるようになっている。
検索機能の可能性を最大限に引き出すことにご興味のある方は、ぜひ当社の最適化されたソリューションをご覧いただくか、お問い合わせください。貴社にとってどのようなメリットがあるかをご紹介させていただきます。