【ElasticSearch】significant terms aggregation API を試してみよう! | SiTest (サイテスト) ブログ

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

【ElasticSearch】significant terms aggregation API を試してみよう!

ElasticSearch は Lucene ベースの全文検索エンジンです。
特徴として、拡張性が容易と言われている分散型の検索システムです。
API も非常に豊富であり、通常の全文検索だけでなく、aggregation 機能も充実しています。特に今回は significant terms aggregation APIについてご紹介を行おうと思います。

  • ■ significant terms aggregation って?

significant terms aggregation は検索された中で関連する重要な単語を抽出が出来る API です。
通常は、検索した単語に関連する単語を抽出するには、比較的単純なアルゴリズムの手法を使うとしても、
対象となる全てのドキュメント集合に対して形態素解析を行って単語ごとに分割を行います。
そして、それらの分割された単語の集合をドキュメントごとに単語の出現頻度等の集計を行い、それらの単語集合をベクトル化を行い、
作成されたベクトルに対し様々な計算をしなくてはならず非常に手間が掛かってしまいます。
ところが、ElasticSearch の aggregation 機能 の API の一つである significant terms aggregation を利用すれば、お手軽に実現できてしまいます。
とても素晴らしい API ですね!

■ 試してみよう!

当社では、「SPAIA」という、従来のスポーツニュースメディアとは違った、スポーツデータを AI によって解析し、新しいスポーツの見方や楽しみ方が実現できるサービスを提供しており、弊社独自で編集部が取材・編集したオリジナルコンテンツも掲載しています。
SPAIA で提供しているコラム記事の集合に対して、significant terms aggregation を試してみます。
これらのコラム記事は、すでに ElasticSearch 上にインデキシングされています。これらのインデキシングしているドキュメントの集合に対して significant terms aggregation のクエリを投げてみましょう。クエリは以下のようになります。

    curl -XGET 'http://localhost:9201/c_index/c_type/_search?pretty' -d '{
      "query":{
        "match":{
          "body":"スケート"
        }
      },
      "aggregations": {
        "significantCrimeTypes": {
          "significant_terms": {
            "field": "body"
          }
        }
      }
    }
    '

上記のcurlのリクエストの応答の一部が以下になります。
スケートに関する記事から、関連している単語が抽出されているようです。

    "aggregations" : {
      "significantCrimeTypes" : {
        "doc_count" : 154,
        "buckets" : [ {
          "key" : "スケート",
          "doc_count" : 154,
          "score" : 21.616883116883116,
          "bg_count" : 154
        }, {
          "key" : "フィギュア",
          "doc_count" : 119,
          "score" : 15.733028335301062,
          "bg_count" : 126
        }, {
          "key" : "skating",
          "doc_count" : 62,
          "score" : 8.558369274510278,
          "bg_count" : 63
        }, {
          "key" : "figure",
          "doc_count" : 58,
          "score" : 7.997049835482591,
          "bg_count" : 59
        }, {
          "key" : "浅田",
          "doc_count" : 50,
          "score" : 6.87448533132261,
          "bg_count" : 51
        }, {
          "key" : "真央",
          "doc_count" : 48,
          "score" : 6.737729802664867,
          "bg_count" : 48
        }, {
          "key" : "演技",
          "doc_count" : 84,
          "score" : 6.362975206611568,
          "bg_count" : 150
        }, {
          "key" : "ショートプログラム",
          "doc_count" : 46,
          "score" : 6.313252925576772,
          "bg_count" : 47
        }, {
          "key" : "スケーティング",
          "doc_count" : 39,
          "score" : 5.195007795498767,
          "bg_count" : 41
        }, {
          "key" : "isu",
          "doc_count" : 38,
          "score" : 5.190938931198672,
          "bg_count" : 39
        } ]
      }}

この API の機能は色々なドキュメントの解析に利用できそうですね!

■ 最後に

今回は、検索されたドキュメントで関連する重要な単語の抽出が出来る API である significant terms aggregation をご紹介しました。
お手軽に重要な単語の抽出ができました。
当社では、今後 、この API を利用して SPAIA で提供している記事に対して、関連する単語のタグ付けをする機能を開発する予定です。
一度、ElasticSearch のAPI の一つである significant terms aggregation を利用してみては、いかがでしょうか。