高速検索エンジンElasticSearchを使ってみた!(More Like This 編) | SiTest (サイテスト) ブログ

メニューボタン閉じるボタン

高速検索エンジンElasticSearchを使ってみた!(More Like This 編)

前回は、ElasticSearchを使ってみて、その速さを体験体験してみました。
ElasticSearchの魅力は速度面だけでなく、類似文書を検索する機能や、ファジー検索、ファセット機能などがあります。そこで、今回は類似文書を検索して関連記事をレコメンドする機能を試してみたいと思います。ElasticSearchでは、「More Like This」 という機能を利用します。

  • ■ 試してみよう

弊社では、「SPAIA」という従来のスポーツニュースメディアとは違い、スポーツデータをAIによって解析し、新しいスポーツの見方や楽しみ方が実現できることに加え、弊社独自で編集部が取材・編集したオリジナルコンテンツを提供しています。
このスポーツコラム記事に対して、関連記事をレコメンドする機能を試してみます。

記事は、大相撲大阪場所のチケットはどのようにゲットできるの?という記事で見てみます。
記事内容としては、

「大相撲大阪場所のチケットはどのようにゲットできるの?

大阪場所はいつ開催される?
大相撲大阪場所は、毎年3月に開催されます。会場はエディオンアリーナ大阪(大阪府立体育会館)となっています。大阪という大都市でありながら、会場はそれほど広くないため、チケット争奪戦は相当激しいものとなるのです!
アクセス的にも、なんば駅から徒歩2分という絶好のロケーションにあるのも人気の秘密です。
特に千秋楽のチケットともなれば、販売開始時期をしっかりチェックして作戦を練って望まないと相当厳しいものとなります…」
といった、相撲のカテゴリであり且つ、相撲の会場の内容になっています。
ここで、関連記事として検索された記事を見てみましょう。

スクリーンショット 2017-03-24 11.48.25

10件程、関連記事が出ていますが、その中の一度でいいから生で観たい!大相撲観戦時におすすめの座席の種類を見てみましょう。

「大相撲観戦の座席は3種類
大相撲を観戦する時に気になる座席は、溜席(たまりせき)、マス席、イス席の3種類に分類されています。
溜席は、土俵から一番近い席で、別名“砂かぶり”と呼ばれることもあります。関係者が座る席とされていますが、一般での購入も可能です。一人ずつ独立した座布団に座って観戦できますが、取り組み後に力士がダイブしてくる可能性が否めないため、6歳未 満のお子さまと、高齢者など身体が不自由な方は購入不可となっています。
マス席は、1.3m四方の鉄パイプで囲まれたエリアに4枚の座布団が敷かれた座席で、イス席は国技館の2階にある席のことを指します。イス席の中には、テーブルや肘置きが付属した席もあります…」
記事内容的には、相撲のカテゴリであり且つ、相撲の会場の内容の記事が、良い感じで検索されています。

■ 類似記事検索の手法とは

類似記事を検索する手法としては、記事内容の重要語と見なされる語句 (Term) を記事ごとに抽出し、記事を行、出現する語句 (Term)を列とした行列ベクトルを構成します。
一般的な、重要語の抽出手法としては、以下の TF-IDF といったアルゴリズムが利用されます。

texclip20170324143054

これらの TF(単語の出現頻度) と IDF(文書頻度の逆数) を掛け合わせて計算を行います。
しかしながら、記事によって出現する語句 (Term) は様々ですので、作成した行列ベクトルは疎な行列 (sparse matrix) となってしまいます。
このままでは、作成した行列ベクトルにノイズが入ってしまい、類似度を計る計算精度が劣ってしまう可能性があります。

そこで、よく使われる手法として、svd (特異値分解) という手法が採用されてます。この手法で作成した行列ベクトルの情報を圧縮し、より情報量の高い行列を作成します。
作成した行列ベクトルに対して、コサイン類似度などのベクトル同士の成す角度の近さを計り、各記事の類似度のランキング付けを行い、類似記事の検索を行います。
実際にこのような手法をプログラミングしようとしたら、結構実装リソースが掛かってしまいます。

しかし、ElasticSearchなどのLucene API を利用した全文検索エンジンでは、簡単に実現可能です。
JSON形式で以下のようなクエリをElasticSearchに対して投げてあげるだけで、上記の例で試したようなことが、簡単に実現できてしまいます。

query = {
“size”: 11,
“query”: {
“more_like_this”: {
“fields”: [“body”],
“docs”: [{
“doc”: {
“body”:keyword
}
}],
“min_term_freq” : 2,
“max_query_terms” : 25
}
}
}
すごく簡単ですね!

■ 最後に

このようにElasticSearchには単純な全文検索以外の機能が用意されています。
他にもファジー検索、ファセット機能等などがあります。
全文検索システムを実装するには、ElasticSearch がおすすめです。
次回は、ファジー(曖昧)検索機能を試してみたいと思います。
また、弊社のサービスの 「SPAIA」 では類似記事の検索機能だけでなく、個人の閲覧履歴等のデータに基づいたパーソナライズされたレコメンド機能も近日公開予定ですので、楽しみにしていてください。