関係知識を利用する全文検索システム QE4Solr Version1.0


目次

関係知識を利用する全文検索システム QE4Solr とは


 関係知識を利用する全文検索システム QE4Solr とは、異表記辞書や同義語辞書、単語間意味的関係知識等を用いてクエリを自動拡張する全文検索システムです。大量の異表記、同義語、意味的関係知識によりクエリ拡張することで、検索漏れの防止や、意外だが有用な情報の発見が期待できます。また、索引付けと検索の並列処理が可能で、Webアーカイブ等の大規模な文書データも効率的に処理できます。異表記辞書や同義語辞書、単語間意味的関係知識等は、高度言語情報融合フォーラム ALAGIN を通して入手可能です。以下に挙げるような知識を得ることができます。

 本システムは、索引付けと検索のコアエンジンとして Apache Solr を使用しています。

関係知識を利用する全文検索システム QE4Solr とは

 Apache SolrにはSynonymFilterという機能があり、これを利用することでQE4Solrの自動クエリ拡張機能の一部と同じような効果が期待できます。しかし、QE4Solrと違い、拡張の結果得られた語のスコア(あるいは、拡張で得られた語を検索の際どの程度重視するか)をユーザが自由に調整することはできません。例えば、ユーザが入力した元のクエリ「情報漏洩」のスコアを1として、自動拡張の結果得られた語「暗号化ソフトウェア」のスコアを0.5にする、というようなことはApache Solrには不可能で、QE4Solrにしかできません。またQE4Solrでは、自動クエリ拡張にどの辞書を使用するかを、検索を実行するたびに、ユーザが選択できるようになっています。これもApache Solrにはない機能です。詳しくは「検索の事前準備」で述べます。

新着情報


動作環境


本システムの動作環境は次のとおりです。

※本ページの説明では、Linuxを用います(Windowsを用いた説明はこちら)。

実行に必要なツール


本システムを実行するには以下のツールが必要です。

なお、本ページの説明ではサーブレットコンテナにSolr同梱のJettyを用います。

以下にSolr、Senの具体的なインストール方法を記載します。

Solrのインストール

  1. 必要なツールの準備

    この作業にはSubversionとAntのツールが必要となります。

    Ant (apache-ant-1.8.2で動作確認済)※URLは変更になる場合があります

  2. Solr1.4.2devのチェックアウト

    SolrのSVNリポジトリから、Solr1.4.2devのソースコードを取得します。

    > cd /home/user_name
    > svn co https://svn.apache.org/repos/asf/lucene/solr/branches/branch-1.4
    
  3. ビルド

    Solr1.4.2devをビルドします。成功すると branch-1.4/example/webapps/solr.war ができます。

    > cd branch-1.4
    > ant example
    

    なお、インターネットへの接続をプロキシサーバ経由で行なっている場合は、 branch-1.4/contrib/clustering/build.xml にプロキシの設定(下記の赤字の部分)を加えた後、ビルドを行なってください。

    <project name="solr-clustering" default="build">
    
      <property name="solr-path" value="../.."/>
      <setproxy proxyhost="[ホスト名]" proxyport="[ポート番号]" />
      <import file="../../common-build.xml"/>
    
  4. ディレクトリ名のリネーム

    ディレクトリ名を変更します。以降の説明では、Solrがインストールされたディレクトリの場所を$SOLRと記載します。

    > cd ..
    > mv branch-1.4 solr
    

Senのインストール

  1. 必要なツールの準備

    この作業にはSubversionのツールとAntが必要となります。

    Ant (apache-ant-1.8.2で動作確認済)※URLは変更になる場合があります

  2. Senのチェックアウト

    SenのSVNリポジトリから、ソースコードを取得します。

    まず、Senのソースコードをチェックアウトします。

    > cd /home/user_name
    > svn co https://svn.java.net/svn/sen~svn/tags/SEN_1_2_2_1/sen
    > mv sen sen-1.2.2.1
    

    以降の説明では、Senがインストールされたディレクトリ(/home/user_name/sen-1.2.2.1)を$SEN_HOMEと記載します。

  3. build.xmlの設定

    $SEN_HOME/build.xml を変更します。具体的には、下のようにcppを実行する部分をコメントアウトします。

    <!--
    <exec executable="cpp" output="${src.dir}/net/java/sen/util/DoubleArrayTrie.java" >
      <arg line="-P ${src.dir}/net/java/sen/util/DoubleArrayTrie.cpp"/>
    </exec>
    -->
    
  4. Senのビルド

    $SEN_HOME に移動し、antを実行します。

    > cd sen-1.2.2.1
    > ant
    

Sen用辞書(IPA辞書)の構築

 Sen用辞書(IPA辞書)の構築は以下の手順で行ないます。

  1. 辞書の構築に必要なツールの準備

    辞書の構築にはPerl、Antが必要となります。

    Perl (Perl 5.8.8で動作確認済)

    Ant (apache-ant-1.8.2で動作確認済)
       ※URLは変更になる場合があります

  2. 辞書の文字コード設定

    $SEN_HOME下にある次の3ファイルを修正します。

    $SEN_HOME/conf/sen.xml   → charsetをutf-8に変更
    $SEN_HOME/conf/sen-processor.xml   → charsetをutf-8に変更
    $SEN_HOME/dic/dictionary.properties   → sen.charsetをUTF-8に変更
  3. CLASSPATH設定

    以下のコマンドを実行します。コマンド中の $SEN_HOME はSenをインストールしたディレクトリに置き換えてください。

    > export CLASSPATH=$CLASSPATH:$SEN_HOME/lib/sen.jar:$SEN_HOME/lib/commons-logging.jar
    
  4. 辞書のインストール

    $SEN_HOME/dic に移動し、antコマンドを実行します。

    > cd $SEN_HOME/dic
    > ant
    

    ※プロキシを経由して辞書をインストールする場合は、プロキシのホスト名とポート番号を指定してください。
       コマンド: ant -Dproxy.host=[ホスト名] -Dproxy.port=[ポート番号]

ダウンロード


パッケージのダウンロード

下のパッケージをダウンロードしてください。

パッケージ構成

関係知識を利用する全文検索システムパッケージには、次のものが含まれます。

辞書サンプルには次のものが含まれます。

パッケージの展開

パッケージの展開は以下の手順で行ないます。

  1. 以下のコマンドを実行し、ダウンロードしたパッケージを展開します。展開すると、QE4Solrディレクトリができます。
    ※/home/user_name/workにパッケージをダウンロードした場合
    > cd /home/user_name/work
    > tar xfz QE4Solr.tar.gz
    または
    > unzip QE4Solr.zip
    
  2. インデックス作成制御プログラム(IndexingControl)を/home/user_nameに移動します。辞書サンプル(sampleDic)もディレクトリごと/home/user_nameに移動します。
    > mv QE4Solr/IndexingControl /home/user_name
    > mv QE4Solr/sampleDic /home/user_name
    

    異表記辞書、関係辞書の配置図は次のとおりです。全てsampleDicディレクトリに格納します。

    /home/user_name/sampleDic
                        |
                        +--- allographic-pairs-v1.utf8.tsv.txt    # 異表記辞書       
                        |
                        +--- all-caus.cln.dfflt.sort.nomrp_0.5.txt  # 関係辞書(因果)
                        |
                        +--- all-prev.cln.dfflt.sort.nomrp_0.5.txt  # 関係辞書(予防)
                        |
                        +--- all-mate.cln.dfflt.sort.nomrp_0.5.txt  # 関係辞書(材料)
    
  3. 検索システム本体(QE4SolrApp.war)と検索対象文書サンプル(search_target)を$SOLR/example/webappsに移動し、Solrを起動します。この操作により検索システム本体が$SOLR/example/workに展開されます。
    > mv QE4Solr/search_target $SOLR/example/webapps
    > mv QE4Solr/QE4SolrApp.war $SOLR/example/webapps
    ※Solrの起動方法は、下の「Solrの起動・停止」を参照してください。
    

※Solrの起動・停止

$SOLR/exampleにあるstart.jarを実行するとSolrが起動します。Solrを停止する場合は、実行中のstart.jarをCtrl+Cで停止します。

> cd $SOLR/example
> java -jar start.jar

検索の事前準備


必要なデータ

本システムの検索処理に必要なデータは次のとおりです。

次に、検索対象文書と辞書のそれぞれの形式と項目について説明します。

インデックスの作成

 検索対象文書から検索用のインデックスを作成します。インデックス作成時には、辞書(異表記、関係)を参照します。
インデックスの作成には、インデックス作成制御プログラム(IndexingControl)と検索システム本体(QE4SolrApp.war)を用います。インデックス作成制御プログラムを起動すると、検索システムのインデックス処理が開始します。具体的には以下の手順で行ないます。

  1. Solrの設定

    インストールしたSolrの設定を本システム用に変更します。具体的な変更点は次の3点です。

    ■ログディレクトリの作成

     ログファイルを出力するディレクトリを作成します。ここにはインデックス作成時のログ(log.txt)と検索時のログ(QE4Solr.log)が出力されます。

    > mkdir $SOLR/example/solr/data/log
    

    ■スキーマの設定

      $SOLR/example/solr/conf/schema.xml の<fields>要素と<types>要素の内容を変更します。

     

     

  2. Javaライブラリの設置

    Javaライブラリをlibディレクトリに設置します。

     

  3. プロパティファイルの設定

    インデックス作成制御プログラム(IndexingControl)と検索システムが読み込むプロパティファイル(QE4Solr.properties)を作成します。システムプロパティおよび辞書に関する以下の項目を指定してください。なお、ファイルやディレクトリを指定する際は、必ず絶対パスで指定してください。

     

  4. プロパティファイルの設置

    1.で設定したプロパティファイルを下のディレクトリに移動します。

    $SOLR/example/work/Jetty_0_0_0_0_8983_QE4SolrApp.war__QE4SolrApp__[******]/webapp/properties
    (*は半角英数字)

     

  5. Solr再起動

    Solrを再起動することでプロパティファイルの設定を読ませます。$SOLR/exampleに移動し、Solrを再起動してください。(起動・停止方法

     

  6. インデックス作成制御プログラム起動

    IndexingControlディレクトリにあるexec.shを起動します。

    「プロパティファイルのパスを指定してください。」と表示されますので、3.で設置したパスを指定し、リターンキーを押します。

    > /home/user_name/IndexingControl/exec.sh
    「プロパティファイルのパスを指定してください。」と表示されるので、3.で設置したパスを入力してEnterを押す。
    > $SOLR/example/work/Jetty_0_0_0_0_8983_QE4SolrApp.war__QE4SolrApp__[******]/webapp/properties/QE4Solr.properties
    

    インデックス作成制御プログラムは、プロパティファイルの「ServerURLs」項目に指定されたサーバに対して、インデックス作成を行なうよう命令します。

    処理が終わると、「すべての処理が終了しました。」というメッセージが表示され、処理を終了します。なお、インデックスデータは$SOLR/example/solr/data/indexディレクトリにできます。

検索システム起動

 検索システムの起動は、以下の手順で行ないます。

  1. プロパティファイルの設定

    必要に応じて検索実行に関わる設定を変更します。以下の4項目が該当します。

    #   DISPLAY_RELATION_COUNT  事前抽出した関係知識の表示数
    #                           (スコアの降順の上位「表示数」件表示)を指定します。
    DISPLAY_RELATION_COUNT=5
    #   RELATION_COUNT  クエリ拡張に用いる知識数(異表記知識と関係知識のそれぞれについて、
    #                   スコア降順の上位「知識数」件を用いる)を指定します。
    RELATION_COUNT=5
    #   SearchURLs   サーバのホスト名:ポート番号を指定します。
    #                複数のサーバを指定する場合は、ホスト名:ポート番号を半角カンマ区切りで記載します。
    SearchURLs=localhost:8983
    #   SHOW_RELATION_LIST  事前抽出した(クラス|関係)知識を表示するか否かON、OFFのいずれかで指定します。
    SHOW_RELATION_LIST=ON
    
  2. prototype.jsの配置

    prototype.jsを次のディレクトリに設置します。
      $SOLR/example/work/Jetty_0_0_0_0_8983_QE4SolrApp.war__QE4SolrApp__[******]/webapp/js
       (*は半角英数字)

    > cp -p prototype.js $SOLR/example/work/Jetty_0_0_0_0_8983_QE4SolrApp.war__QE4SolrApp__[******]/webapp/js
    
  3. Solr起動

    $SOLR/exampleに移動し、Solrを起動します。既に起動している場合は一度停止し、改めて起動してください。(起動・停止方法

検索方法


検索インターフェース

本システムは、ウェブアプリケーションとして使用します。次のURLにアクセスすると、検索画面に移動します。

  http://[Solrをインストールしたサーバのホスト名]:8983/QE4SolrApp/

以下、検索画面、検索設定画面、検索結果画面について説明します。

検索の仕組み

本システムの検索の流れは次のとおりです。

  1. ユーザが検索式を入力する。
  2. システムが入力された検索式の拡張を行なう。
  3. システムは拡張された検索式で検索実行する。

以下、検索の流れから検索式、検索式の拡張、検索実行を詳しく説明します。

  1. 検索式

    本システムが受け付ける検索式を以下に示します。

    構文要素 検索式の例 説明
    単語 カード払い 入力された単語で検索
    論理演算子
    AND, OR, NOT
    (カード払い OR クレジット払い) AND (手数料 OR リボ) NOT お勧め 論理演算子と括弧による検索式の組み立てが可能
    複数単語 カード払い クレジット払い 複数単語でAND検索。AND演算子が省略されたものとみなされる
    フレーズ(連続) "代金 引換料" 複数の単語の連続出現
    フレーズ(近傍) "クレジットカード 払い"~5 複数の単語の近傍出現。単語間に指定した数未満の単語しか介在し得ないことを示す

     

  2. 検索式の拡張

    入力された検索式の知識(異表記辞書、関係辞書)を利用した単語およびフレーズの拡張について説明します。なお、NOT論理式内では、単語およびフレーズの拡張は行いません。

     

  3. 検索実行

    システムの検索処理について説明します。
      検索式は、検索対象文書中のタイトルと内容の文字列に対して照合されます。また検索画面で「形態素解析する」と「形態素解析しない」を選択することができます。「形態素解析する」場合は、形態素解析によるインデックスを使って検索を行います。「形態素解析しない」場合は、文字バイグラムによるインデックスを使って検索を行います。

    QE4Solrのスコアリングは、Solrのデフォルトの機能をそのまま用いて行なっています。詳細は、スコアリングを行なうSimilarity クラスの説明をご覧ください(こちら)。

    なお、コマンドライン上から全文検索システムを操作する場合は、パッケージ同梱のコマンドラインツール(QE4Scommand)をお使いください。使い方など詳細はQE4Scommandディレクトリ下のREADMEをご覧ください。

分散検索


Solrには、複数ノード(Solr)にインデックスを分散配置し、各ノードのインデックスを横断的に検索する機能があります。本システムは、この機能を用いた分散検索が可能です。以下、分散検索を実施する場合の具体的な方法を説明します。

 

インデックスの作成

  各ノードにパッケージのダウンロード、実行に必要なツール、本システムのインストールを行ない、インデックスの作成を実施します。このとき、インデックス作成制御プログラムの実行を各ノードで行う必要はありません。1台のインデックス作成制御プログラムを実行することで各ノードのインデックス作成処理を一斉に開始できます。つまり、A、B、Cの3サーバでインデックス作成を行なう場合、Aに設置したインデックス作成制御プログラムを実行することで、A、B、Cサーバのインデックス作成処理を一斉に開始できます。

そのためには、以下の設定を行う必要があります。

なお、インデックス作成制御プログラムは、検索対象文書を各ノードに配布する機能も備えています。例えばA、B、Cの3サーバにインデックスを置きたいが検索対象文書はAサーバにまとまっている場合、Aサーバでインデックス作成制御プログラムを起動することで、Aサーバにある検索対象文書をB、Cサーバに分配し、インデックス作成処理を開始することが可能です。検索対象文書の配布を行なう場合、インデックス作成制御プログラムが読み込むプロパティファイルに次の設定を行ってください。

インデックス作成制御プログラムから配布された検索対象文書は、各ノードのプロパティファイルの「SEARCH_TARGET_DATA」項目に指定されたディレクトリに保存されます。

 

検索システムの起動

プロパティファイルの「SearchURLs」項目にSolrサーバのホスト名:ポート番号を半角カンマ区切りで指定します。

 

大規模文書用形式

【ウェブ標準フォーマット】

本システムは大規模文書用形式として、ウェブ標準フォーマットを受け付けます。ウェブ標準フォーマットとは、下に示したDTDで定義されるフォーマットを指します。

<!ELEMENT StandardFormat (Header,Text+)>
<!ATTLIST StandardFormat
OriginalEncoding CDATA #REQUIRED
Time CDATA #REQUIRED
Url CDATA #REQUIRED>
<!ELEMENT Header (Title?,InLinks?,OutLinks?)>
<!ELEMENT Title (RawString,Annotation?)>
<!ELEMENT Keywords (RawString,Annotation?)
<!ELEMENT Description (RawString,Annotation?)
<!ELEMENT InLinks (InLink+)>
<!ELEMENT InLink (RawString,Annotation?,DocID+)>
<!ELEMENT OutLinks (OutLink+)>
<!ELEMENT OutLink (RawString,Annotation?,DocID+)>
<!ELEMENT DocID (#PCDATA)>
<!ELEMENT Text (S+)>
<!ATTLIST Text
Author CDATA #IMPLIED
Date CDATA #IMPLIED
Title CDATA #IMPLIED
Type (default|blog|comment) "default">
<!ELEMENT S (RawString,Annotation?)>
<!ATTLIST S
Id CDATA #REQUIRED
Length CDATA #REQUIRED
Offset CDATA #REQUIRED>
<!ELEMENT RawString (#PCDATA)>
<!ELEMENT Annotation (#PCDATA)>
<!ATTLIST Annotation
Scheme CDATA #REQUIRED>

ウェブ標準フォーマットに明示されている情報は次のとおりです。

タグ名 内容
StandardFormat 標準フォーマットのルートタグ

属性: Url: 元となるウェブページのURL
        OriginalEncoding: 元となるウェブページの文字コード
        Time: ページが取得された日時(「yyyy-mm-dd hh:mm:ss」形式)
子要素: Header,Text

Header ヘッダー要素を表すタグ
属性: なし
子要素: Title,InLinks,OutLinks
Title 元となるページのタイトルを表すタグ.
属性: Offset: ファイル先頭からのオフセット
         Length: タイトルの長さ(バイト長)
         Id: 文ID
子要素: RawString,Annotation
Keywords 元となるページのKeywordsを表すタグ.
属性: Offset:
        Length: キーワードの長さ(バイト長)
        is_Japanese_Sentence:
子要素: RawString,Annotation
Description 元となるページのDescriptionを表すタグ.
属性: Offset:
        Length: Descriptionの長さ(バイト長)
        is_Japanese_Sentence:
子要素: RawString,Annotation
InLinks 元となるページへのインリンクの集合を表すタグ.
属性: なし
子要素: InLink
InLink 元となるページへのインリンクを表すタグ.
属性: なし
子要素: RawString,Annotation,DocIDs
OutLinks 元となるページからのアウトリンクの集合を表すタグ.
属性: なし
子要素: OutLink
OutLink 元となるページからのアウトリンクを表すタグ.
属性: なし
子要素: RawString,Annotation,DocIDs
DocIDs 文書ID の集合を表すタグ.
属性: なし
子要素: DocID
DocID 文書ID を表すタグ.
属性: なし
子要素: 文書ID を表す数字列
Text 元となるページの本文の内容を表すタグ.
属性: Type: ウェブページのタイプ(通常のページ,ブログのエントリなど)
子要素: S
S ページに含まれる一文を表すタグ.
属性: Offset: ファイル先頭からのオフセット
         Length: タイトルの長さ(バイト長)
         Id: 文ID
子要素: RawString,Annotation
RawString 一文として抽出された文字列を表すタグ.
属性: なし
子要素: 一文として抽出された文字列
Annotation 一文として抽出された文字列の解析結果を表すタグ.
属性: Scheme: 解析に用いたツール名(e.x., Juman,Knp など)
子要素: ツールの解析結果

 

ウェブ標準フォーマットに明示されている情報のうち、本システムのXMLファイルフォーマットの必須項目に相当するものは次のとおりです。

   タイトル・・・Titleタグの子要素であるRawStringの値

   内容・・・Textタグの子要素であるSタグの子要素RawStringの値

   URL・・・StandardFormatタグのUrl属性の値

また、検索対象文書がウェブ標準フォーマットである場合、次のデータを保存文書に含みます。

   キーワード・・・Keywordsタグの子要素RawStringの値

   説明文・・・Descriptionタグの子要素RawStringの値

大規模文書用形式のファイルはgzip形式で圧縮し、zipファイルにまとめて格納します。

ウェブ標準フォーマットの文書を検索対象文書として用いる場合は、プロパティファイルの「Solr_Format」項目をNOにしてください。

著作権&ライセンス


 本ソフトウェアはフリーソフトウェアですが、著作権は、国立研究開発法人 情報通信研究機構に帰属します。本ソフトウェアは、BSDライセンス (Modified BSDLicense)、LGPL (GNU Lesser General Public License)、または、GPL (GNU General Public License) に従って使用、改変、再配布することができます。



情報分析研究室(2011年度より言語基盤グループから改称)
国立研究開発法人 情報通信研究機構
Copyright © National Institute of Information and Communications Technology (NICT). All Rights Reserved.