Skip to content

ku-nlp/TSUBAKI

Repository files navigation

検索エンジン基盤 TSUBAKI

TSUBAKIは、科研特定領域研究「情報爆発」(2006年度〜2010年度)において、京 都大学黒橋・河原研究室が中心となって開発した検索エンジン基盤です。その 特徴は、構文・格解析、同義語・句のマッチングなど深い言語解析技術に基づ く検索です。1CPUあたり100万文書程度の検索が可能で、複数CPUの並列化によ り大規模文書集合の検索に対応しています。現在、日本語文書と英語文書の検 索が可能です。

以下の説明では、1CPU(localhostのみ)で検索を行うことを想定しています。並 列化による100万件以上の文書の検索については、本README最後の注意事項をご 覧ください。

準備

必要なライブラリ、モジュールのインストール

  • 必要なライブラリのインストール
  • 必要なPerlモジュールのインストール (CPAN等を用いてインストール)
    • Unicode::Japanese
    • PerlIO::gzip
    • IO::Uncompress::Gunzip
    • Archive::Zip
    • XML::LibXML
    • XML::Writer
    • CDB_File
    • BerkeleyDB
    • MLDBM
    • Text::Darts
    • Error (Module::Metadata, version, Perl::OSType, Module::Buildも必要)

本パッケージのcpanディレクトリに、上記のPerlモジュールのtarballを同梱していますので、必要に応じてご利用ください。

言語解析ツール・データベースのインストール

  • 以下の依存ツールをこのディレクトリに設置する必要があります
    • www2sf
    • Utils
    • SynGraph
  • 日本語の文書を検索する場合に必要なツール・データベースのインストール
    • 日本語形態素解析システムJUMANのインストール
      • Perlモジュールもインストールしてください
    • 日本語構文・格解析システムKNPのインストール
      • Perlモジュールもインストールしてください
    • SynGraph日本語データベース(同義語・句の辞書)のダウンロード
      • データをダウンロードし、TSUBAKI直下(このディレクトリ)にて展開してください。データベースがSynGraph/syndb以下に展開されます。
    • 複合名詞の文書頻度データベースのダウンロード
      • データをダウンロードし、TSUBAKI直下のdataディレクトリに設置してください。
  • 英語の文書を検索する場合に必要なツールのインストール
    • Stanford Parserのインストール
    • 英語の同義語・句のデータを別途用意すれば、SynGraphデータベース形式に変換して使うことができます。詳細は、SynGraphのドキュメントをご覧ください。

TSUBAKI設定ファイルの生成

以下では、このREADMEがあるディレクトリを$TSUBAKI_DIRと表します。

$TSUBAKI_DIRにおいて以下のように./setup.shを実行することにより、インデックスデータの場所や解析ツールのインストール場所などを含むTSUBAKIの設定ファイルを自動生成します。

  • 例1: 日本語サンプル文書データを対象にする場合
./setup.sh -s sample_doc/ja/src_doc -d /somewhere/data -L

(/somewhere/data以下にインデックスなどのデータを出力します)

  • 例2: 英語サンプル文書データを対象にする場合
./setup.sh -e -s sample_doc/en/src_doc -d /somewhere/data -L -f /somewhere/stanford-parser-full-2013-06-20
  • 例3: あるディレクトリ(/somewhere/src_doc_html)以下にあるHTML文書データ(gzip済み)を対象にする場合
./setup.sh -s /somewhere/src_doc -d /somewhere/data -z

(/somewhere/src_doc以下の"*.html.gz"ファイルを再帰的に探索します)

./setup.shの重要なオプションの説明

-s 検索対象文書パス       : 検索対象文書の場所を指定
-d 出力データパス         : インデックスなどのデータ出力場所を指定 (絶対パスで)
-j                        : 日本語の文書を検索する場合 (default)
-e                        : 英語の文書を検索する場合
-f Parserのパス           : 英語の文書を検索する場合に、Stanford Parserの場所を指定
-c 出力設定ファイル名	  : 出力する設定ファイル名を指定 (default: $TSUBAKI_DIR/conf/configure)
-z                        : 検索対象文書がgzip圧縮されている場合に指定
-L                        : 検索対象文書をシンボリックリンクではなくコピーする場合に指定
-u                        : HTMLがUTF-8化されている場合に指定
-Z                        : 検索対象文書がzipで固められている場合に指定
-a                        : 検索対象文書を追加する場合に指定

以下では、上記の例1を実行し、日本語サンプル文書データを対象にしていると して説明します。日本語サンプル文書データ以外を用いる場合に設定が必要な 箇所にはその旨を記述しています。

ID付与

すべてのhtml文書は、「(10桁のID).html」の形式で扱います。以下を実行す ることにより、sample_doc/ja/src_doc以下のhtml文書に対して、10桁のIDを 付与し、$DATADIR/html以下に配置します。

make html

setup.shで-Zオプションを利用した場合はテンポラリディレクトリが大きい必要があるので、/tmpよりも大きいディレクトリをTMP_DIR_BASEオプションで指定してください。

make TMP_DIR_BASE=/somewhere/tmp html

元のhtmlのファイル名とIDの対応は$DATADIR/html/filename2sidに出力されていますので、IDから元のhtmlのファイル名に戻したい時はこのファイルを参照してください。

TSUBAKI標準フォーマット変換, インデックス生成

検索対象文書に言語解析を適用し、その解析結果をXML形式で出力します。(以 後、このXML形式を「TSUBAKI標準フォーマット」と呼びます。) そして、 TSUBAKI標準フォーマットデータからインデックスを生成します。 $TSUBAKI_DIR において次のように実行してください。

make indexing

テンポラリディレクトリとしてデフォルトでは/tmpを使いますが、/tmpに 十分な容量がない場合は、次のようにテンポラリディレクトリを指定して ください。100万文書あたり100GB程度必要です。

make TMP_DIR_BASE=/somewhere/tmp indexing

indexingを一度にすべてではなく、例えば、1,000万ページずつ行いたい場合、 sf2index/Makefile$(HTML_FIRST_DIR)を修正する。 以下の例では0000,0001, ..., 0009以下だけをindexingの対象とする(=合計1,000万ページ)。

(修正前)
HTML_FIRST_DIR := $(HTML_TOP_DIR)/????
(修正後)
HTML_FIRST_DIR := $(HTML_TOP_DIR)/000?

検索サーバプログラムのコンパイル

$DATADIR/idx/average_doc_length.txtに文書数と平均文書長が書かれています。

num of docs: xxx
ave doc length: yy

上記の値で、$TSUBAKI_DIR/search/common.hの以下の行を書きかえて下さい。

#define TOTAL_NUMBER_OF_DOCS 100132750
#define AVERAGE_DOC_LENGTH 907

そして、$TSUBAKI_DIRにおいて、makeを実行してください。 コンパイルできない場合は,コンパイルの指定を試してみて下さい。

make CC=gcc CXX=g++

検索

検索テスト

$TSUBAKI_DIRにおいて、"./search.sh -c conf/configure クエリ" を実行して検索のテストをします。クエリはUTF-8で入力してください。

./search.sh -c conf/configure 京大	# hitcountが6になる
./search.sh -c conf/configure 紅葉	# hitcountが5になる

./search.sh -c conf/configure 京大の場合、以下のような出力が得られます。

--- QUERY (sexp) ---
( (ROOT (OR_MAX ((京大/きょうだい 1 3 1 0 0)) ((京大/きょうだい<反義語> 1 3 0 0 0)) ((s31570:京都大学 1 3 0 0 0)) ((s31570:京都大学<反義語> 1 3 0 0 0)) ) (OR_MAX ((京大/きょうだい 3 3 1 2 0)) ((京大/きょうだい<反義語\
> 3 3 0 2 0)) ((s31570:京都大学 3 3 0 2 0)) ((s31570:京都大学<反義語> 3 3 0 2 0)) ) ) )
--- RESULT ---
11      110.38  176     0       1       1       6       6       [京大/きょうだい 22.6443 1 3,s31570:京都大学 16.8055 0.495 3,OR_MAX 22.6443 1 3,] [京大/きょうだい,6#s31570:京都大学,6#OR_MAX,6#]
8       109.784 245     0       1       1       65      65      [京大/きょうだい 21.9826 1 3,s31570:京都大学 16.0798 0.495 3,OR_MAX 21.9826 1 3,] [京大/きょうだい,65#s31570:京都大学,65#OR_MAX,65#]
28      109.406 291     0       1       1       222     222     [京大/きょうだい 21.5626 1 3,s31570:京都大学 15.6299 0.495 3,OR_MAX 21.5626 1 3,] [京大/きょうだい,222#s31570:京都大学,222#OR_MAX,222#]
35      104.536 238     0       1       1       111     111     [s31570:京都大学 16.1506 0.495 3,OR_MAX 16.1506 0.495 3,] [s31570:京都大学,111#OR_MAX,111#]
41      103.708 334     0       1       1       287     287     [s31570:京都大学 15.2315 0.495 3,OR_MAX 15.2315 0.495 3,] [s31570:京都大学,287#OR_MAX,287#]
32      99.6438 1045    0       1       1       481     481     [s31570:京都大学 10.7153 0.495 3,OR_MAX 10.7153 0.495 3,] [s31570:京都大学,481#OR_MAX,481#]

hitcount 6
HOSTNAME basil200 39999
SEARCH_TIME 1.80221
SCORE_TIME 0.0479221 0.000953674
SORT_TIME 0.000953674
TOTAL_TIME 1.86992

「QUERY (sexp)」はQueryの内部表現を表しており、一番内側の括弧内の意味は順に以下のとおりです。

  • term
  • termタイプ(必須:1, オプショナル:3)
  • 文書頻度
  • nodeタイプ(termが単語の場合:1, SYNノードの場合:0)
  • indexタイプ(termが単語の場合:0, 係り受けの場合:1, 単語の場合(アンカー用):2, 係り受けの場合(アンカー用):3)
  • FeatureBit(その他の素性)

「RESULT」以下はヒットした文書を表しており、一行が1文書で、その意味は順に以下のとおりです。

  • 文書ID
  • スコア
  • 文書長
  • ページランク
  • strict_term_feature
  • proximate_feature
  • スニペット始まり位置
  • スニペット終わり位置
  • [マッチしたterm集合(pos list)]: 「#」がterm区切り, 「term, (pos集合)」

SCORE_TIMEの1番目は検索必須のtermに対するスコア計算、2番目はオプショナルのtermに対するスコア計算にかかった時間を表しています。

ブラウザからの検索

ブラウザから検索するためには、localhostでsshdとhttpdが起動している必要 があります。次のようにして、sshdとhttpdが起動していることを確認してくだ さい。

ps aux | grep sshd
ps aux | grep httpd

これらが起動していない場合は、システム設定を変更して起動してください。

TSUBAKIでは、検索サーバとスニペットサーバを利用します(構成図: doc/tsubaki-configuration.pdf)。検索サーバとスニペットサーバを次のよう にして起動します。このスクリプトの実行によって、localhostにsshし、これ らのサーバを起動しています。

scripts/server-all.sh -c conf/configure start

サーバを止めるには、上記のstartをstopとして実行してください。

検索フロントエンド($TSUBAKI_DIR/cgi/index.cgi)にWebブラウザでアクセスし、 クエリを入力して検索を実行します。

例) http://localhost//var/www/htmlディレクトリに対応している場合 は、ln -s `pwd` /var/www/htmlを実行することによって、 /var/www/html直下にTSUBAKIディレクトリへのシンボリックリンクをは ります。Webブラウザでhttp://localhost/TSUBAKI/cgi/index.cgi にア クセスします。

ブラウザでindex.cgiのソースコードが表示される場合は、httpdの設定で CGIが実行可能となっていることを確認してください (Apacheでは Options ExecCGIAddHandler cgi-script .cgiを追加し、#Loadmodule cgi_module libexec/apache2/mod_cgi.soの行のコメントを外してください)。

APIによる検索

samplecode/ 以下にC, Java, Perl, Pythonによるサンプルコードがありますので、そちらを参照して下さい。

注意事項

  • 検索対象文書の形式としては、現在のところHTMLのみに対応しています。
  • 大規模文書セットに対するTSUBAKI標準フォーマット変換およびインデックス 生成を行う場合に、これらに要する時間を短縮するために並列化することを お勧めします。このためには、"make"に"-j 並列数"オプションを付けて実行 します。さらに、クラスタ環境で並列に実行するには、gxp makeを利用する ことができます。詳細は、http://www.logos.ic.i.u-tokyo.ac.jp/gxp/ を参 照してください。
  • 100万件以上の文書を検索するには、複数の検索サーバとスニペットサーバを 起動する必要があります。このためには、設定ファイル(conf/configure)に おいて、次のようにSEARCH_SERVERSとSNIPPET_SERVERSの行をサーバ台数分コ ピーし、サーバ名を記入してください。
SEARCH_SERVERS	server01	39999	/somewhere/data/idx/0000	none
SEARCH_SERVERS	server02	39999	/somewhere/data/idx/0001	none
SNIPPET_SERVERS	server01	59001	0000
SNIPPET_SERVERS	server02	59001	0001
  • scripts/copy-idx-localdisk.shを使ってidxファイルをローカルディス クに配置して下さい。使い方はscripts/copy-idx-localdisk.shを参照して 下さい。
  • 複数の文書セットに対して検索するためには、「TSUBAKI設定ファイルの生成」 において、./setup.shに"-c 出力設定ファイル名"を付けて実行し、異なる名 前の設定ファイルを生成してください。また、cgi/tsubaki-cgi.confにその 設定ファイル名を記入してください。

ドキュメント

より詳細なドキュメントは、TSUBAKI Wikiを参照してください。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •