INFORMATION
サブスクリプション

リアルタイムクラスタリングについて

ロンウイットのSolrサブスクリプション・パッケージはバージョン0.10から、お客様からご要望の多かったリアルタイムクラスタリング(クラスタリング検索)に対応しました。本記事ではその新機能を簡単に紹介します。

「クラスタリング検索」とは?

クラスタリングは検索結果文書を適当にラベル付けされたテーマ別グループ、つまりクラスタに自動分類する機能です。

クラスタリング機能はファセット機能と並び、大量にヒットした文書から、目的の文書をすばやく見つけるための絞り込みを行うのに役立ちます。フィールドファセットと異なり、あらかじめ絞り込み用のフィールドを整備する必要がなく、検索にヒットした文書内容をリアルタイムに解析することからしばしば「リアルタイムクラスタリング」などと呼ばれることもあります。

さらにR&Dなど創造性が重視される部門においては、クラスタリングの結果を可視化(後述)することでスコアの低い文書を掘り起こし、いろいろな「気づき」を与えてくれるなどの効用もあるようです。

Solrは1.4からCarrot2を使ったクラスタリング機能を提供していましたが、日本語に対応できていませんでした。弊社では「企業内検索システムでもクラスタリング検索機能を提供したい」というご要望を多数いただいておりましたが、今回のリリースで日本語でも本機能をご利用いただけるように機能追加をいたしました。

まずは使ってみる

ロンウイットのSolrサブスクリプション・パッケージ(以下、サブスクリプションと記す)は、インストール後すぐにいろいろな機能を試せるように、日本語のサンプルデータといくつかの目的別に設定された環境(solrconfig.xmlやschema.xmlなどの設定ファイル)が付属しています。日本語のサンプルデータとしては、歴代の内閣総理大臣の所信表明演説が付属していますので、ここではそのデータをそのまま使ってみます。また環境は、シングルコア構成のbasic環境を使います(マルチコア構成でももちろん使えますが、説明の中ではシングルコア構成のURLを示します)。

ではさっそくクラスタリング検索を試してみましょう。サンプルデータを登録してあるbasic環境を起動したら、Webブラウザから次のURLにアクセスしてください:
http://localhost:8080/solr/clustering?q=*:*&indent=on&carrot.produceSummary=false

通常の検索と同様、qパラメータに検索語を指定します。ここではクラスタリングの効果がよくわかるよう、ヒット件数を多くさせるために全件検索を行う記号*:*を使いました。するとSolrは、通常の検索結果に加えて、次のようにヒットした文書をクラスタに分類してくれます:
<arr name="clusters">
  <lst>
    <arr name="labels">
      <str>中央省庁再編 行政改革 構造改革</str>
    </arr>
    <double name="score">33.0189575133715</double>
    <arr name="docs">
      <str>151</str>
      <str>147</str>
    </arr>
  </lst>
  <lst>
    <arr name="labels">
      <str>原発事故</str>
    </arr>
    <double name="score">17.126660289899434</double>
    <arr name="docs">
      <str>179</str>
      <str>178</str>
    </arr>
  </lst>
  <lst>
    <arr name="labels">
      <str>国会議員 国民主権</str>
    </arr>
    <double name="score">14.497463982910967</double>
    <arr name="docs">
      <str>176</str>
      <str>174</str>
    </arr>
  </lst>
  <lst>
    <arr name="labels">
      <str>地球環境</str>
    </arr>
    <double name="score">11.076105371471503</double>
    <arr name="docs">
      <str>169</str>
      <str>168</str>
    </arr>
  </lst>
  <lst>
    <arr name="labels">
      <str>戦略指針 イノベーション</str>
    </arr>
    <double name="score">23.15966298517712</double>
    <arr name="docs">
      <str>166</str>
      <str>165</str>
    </arr>
  </lst>
  <lst>
    <arr name="labels">
      <str>景気対策 財政再建 中長期的 経済成長</str>
    </arr>
    <double name="score">20.59828815969397</double>
    <arr name="docs">
      <str>171</str>
      <str>170</str>
    </arr>
  </lst>
  <lst>
    <arr name="labels">
      <str>金融機関</str>
    </arr>
    <double name="score">15.820047599526195</double>
    <arr name="docs">
      <str>173</str>
      <str>143</str>
    </arr>
  </lst>
</arr>

なお、日本語のクラスタリング機能はSolrのClusteringComponentを使っていて、英語をはじめとする欧州各国語にも対応しています。また、ハイライトやファセット、もしかして検索などと一緒に使うことももちろん可能です。

solrconfig.xmlの設定

ここでは、クラスタリング機能に必要なsolrconfig.xmlの設定について詳しく見ていきましょう。主要な設定は、サーチコンポーネントとリクエストハンドラの2つですが、contribパッケージであるクラスタリング機能を使うためのライブラリのパス設定が追加で必要になります。まずはそのパス設定から見てみましょう。

ライブラリパスの設定

ClusteringComponentやCarrot2はcontribパッケージとして提供されているため、ライブラリへのパスの設定が必要です。次のようにします:

<lib dir="${lusolr.dir}/solr/contrib/clustering/lib/" />
<lib dir="${lusolr.dir}/solr/dist/" regex="apache-solr-clustering-\d.*\.jar" />


ここでlusolr.dirは、Tomcat起動時にシステムプロパティとしてLucene/Solrのインストールディレクトリが与えられるとします。サブスクリプションを使っている場合は設定されているので、特に気にする必要はありません。

サーチコンポーネント

次に、サーチコンポーネントを見てみます:
<searchComponent name="clustering"
                 enable="${solr.clustering.enabled:true}"
                 class="solr.clustering.ClusteringComponent" >
  <lst name="engine">
    <str name="name">default</str>
    <str name="carrot.algorithm">org.carrot2.clustering.lingo.LingoClusteringAlgorithm</str>
    <str name="LingoClusteringAlgorithm.desiredClusterCountBase">20</str>
    <str name="carrot.lexicalResourcesDir">clustering/carrot2</str>
    <str name="PreprocessingPipeline.tokenizerFactory">com.rondhuit.solr.search.JaBuzzPhraseCarrot2TokenizerFactory</str>
  </lst>
</searchComponent>

ここで大事なのは、PreprocessingPipeline.tokenizerFactoryにcom.rondhuit.solr.search.JaBuzzPhraseCarrot2TokenizerFactoryを設定しているところです。日本語文書解析用にJaBuzzPhraseCarrot2TokenizerFactoryの代わりにJapaneseCarrot2TokenizerFactoryを使うこともできますが、大抵の場合はJaBuzzPhraseCarrot2TokenizerFactoryの方がうまく処理されると思います。それ以外のパラメータについては、ClusteringComponentのWikiおよびCarrot2のマニュアルをご覧ください。

リクエストハンドラ

次にリクエストハンドラの定義を見てみます:
<requestHandler name="/clustering"
                startup="lazy"
                enable="${solr.clustering.enabled:true}"
                class="solr.SearchHandler">
  <lst name="defaults">
    <bool name="clustering">true</bool>
    <str name="clustering.engine">default</str>
    <bool name="clustering.results">true</bool>
    <str name="carrot.title">title</str>
    <str name="carrot.url">id</str>
    <str name="carrot.snippet">statement</str>
    <bool name="carrot.produceSummary">true</bool>
    <bool name="carrot.outputSubClusters">false</bool>
    <str name="df">statement</str>
    <str name="rows">20</str>
    <str name="fl">title</str>
  </lst>
  <arr name="last-components">
    <str>clustering</str>
  </arr>
</requestHandler>

ここで重要なのは、last-componentsで前述のサーチコンポーネントであるclusteringを指定していることです。これにより、通常の検索に追加してクラスタリング機能を実行するようになっています。

クラスタリング結果表示の可視化

クラスタリング機能はファセット検索などと比べると、グループ化対象のフィールド値が統制されていない分、思わぬ発見をすることがあるようです。そのため、R&Dなど創造性が重視される部門で、クラスタリングの結果は視覚的にも楽しいグラフィカルな表示にするといろいろな発見を支援することにつながります。

クラスタリングの結果をグラフィカルに表示するには、JavaScriptを使います。以下に参考として、D3.jsというOSSのJavaScriptを使った場合の、クラスタリングの結果表示に適当と思われる画面例を示します。

クラスタリングの結果を視覚化する

クラスタリングの結果を視覚化する



まとめ

本稿ではサブスクリプション・パッケージ0.10から可能になった日本語対応のクラスタリング機能について、簡単にご説明しました。クラスタリング機能はファセット機能と並び、大量にヒットした文書から、目的の文書をすばやく見つけるための絞り込みに役立ちます。R&Dなど創造性が重視される部門においては、クラスタリングの結果を可視化することでスコアの低い文書を掘り起こし、いろいろな「気づき」を与えてくれるなどの効用もあるようですので、企業内検索などでチャレンジされてみてはいかがでしょうか。


KandaSearch

KandaSearch はクラウド型企業向け検索エンジンサービスです。
オープンAPIでカスタマイズが自由にできます。

  • セマンティックサーチ

    人間が理解するように検索エンジンがテキストや画像を理解して検索できます。

  • クローラー

    検索対象文書を収集するWebクローラーが使えます。

  • 簡単操作のUIと豊富なライブラリー

    検索や辞書UIに加え、定義済み専門用語辞書/類義語辞書やプラグインがあります。

  • ローコードで低コスト導入

    検索UIで使い勝手を調整した後、Webアプリケーションを自動生成できます。

セミナー

企業が検索エンジンを選定する際のポイントから、
実際の導入デモをお客様ご自身でご体験!