プロジェクト

全般

プロフィール

日本語全文検索の環境づくり » 履歴 » リビジョン 8

リビジョン 7 (Masanori Machii, 2011/10/12 14:12) → リビジョン 8/15 (Masanori Machii, 2011/10/12 14:14)

h1. 日本語全文検索の環境づくり 

 {{>toc}} 

 文書管理プラグイン DMFS(オリジナル版)は,検索エンジンに Xapian を利用しています.そのため,日本語による検索が事実上,不可能になっています.そこで Xapian を Hyper Estraier へ置き換えるのですが,それでも例えば PDF や MS-Office 文書からテキストを抽出する機能もサーバー上へ構築しなければなりません. 

 この環境づくりに関する手順はネット上でも探せますが,特にバージョンの相性については,ノウハウが共有できているとは言えない状況です.ここでは Linux に限って,明らかになったノウハウを少しずつ,蓄積しようと思っています. 

 この環境を構築する上で重要なのは,P系やR系の言語が必要とするライブラリです.そのライブラリがすべての構成要素で共通になるため,yum などの管理機能を使わず,ソースコードから1つずつビルドしていく必要があります. 

 最も厄介な問題は,他のシステムと共存させるために,ライブラリのバージョンを変えられない,ということです.幸いなことに,UNIX系のOSではライブラリのパスで回避できますので,環境を構築する前に,すでに稼動しているサービスをよく調べておき,構築後の設計図を作っておくべきでしょう.ビルドもそれにしたがって計画的に行わないと,試行錯誤を何度も繰り返すことになってしまうでしょう. 

 全文検索環境と一口にいっても,対象となるフォーマットにより,必要な機能が異なりますし,OSS世界の発展により,やり方も変わって来ました.例えば以前は何事にも X Window System が必要で,そのために Xvfb(Xのヴァーチャル・フレーム・バッファ)を常時稼動させておく必要がありました.しかし最近は,Xなしの環境でも機能を果たすものが増えました. 

 これだけとっても,環境が複雑,つまりライブラリの依存関係が複雑なことが理解できるでしょう.なので,ここでは基本ソフトに CentOS 5.6 を採用して全体を通します. 
 5.5で断念した主な理由が,共有ライブラリ glibc のバージョンを管理するのが難しかったからです.また,日本語コードは utf-8 に限定です. 


 h2. 前提となる基本的な環境とは? 

 少々クラシックな変換「コマンド」で対応する方式と,{{fn(OpenOfficeサーバーで対応する方式,OpenOfficeサーバーを用いるのは上級編として後日,紹介します.)}}の2つが考えられます. 

 今回は,コマンド方式を紹介します. 

 
 この方式では,前提となる基本的な環境が,対象となるフォーマットで異なります. 

 # PDF 
 GNU PDFプロジェクトの成果を取り入れます. 
 # オフィス文書 
 GNOMEプロジェクトのうち,{{fn(GNOME Officeの成果,ビルドするためには,GNOMEアーキテクチャと呼ばれる一群やX Window Systemsも必要です.)}}を取り入れます. 
 GNOME Office 以下の3ソフトウェアから構成されますが,本件ではデータベースは除きます. 
 ** AbiWord - ワードプロセッサ 
 ** Gnumeric - 表計算ソフト 
 ** GNOME-DB w:en:GNOME-DB - データベース 
 # PowerPoint 
 基本的にxlhtmlプロジェクトの成果を取り入れますが,修正コードは日本の方によるものです. 

 bq. 注)GNU PDFプロジェクトはその使命を終えて,FSFの最重要プロジェクトから外れたと,2011年10月にアナウンスされました. 

 Linux環境全体を俯瞰するには,次のサイトが役に立つでしょう.よくわからないライブラリにぶつかった際には,索引の代わりになります. 

 * {{fn(Linux From Scratchブック 日本語版,"":http://sourceforge.jp/projects/lfsbookja/)}} 


 * Beyond Linux(R) From Scratch 
 http://lfsbookja.sourceforge.jp/BLFS/svn.ja/index.html 


 h2. 他システムと共存させる環境の構築 

 h3. バージョンをどう調整するか? 

 やみくもにビルドしても,コンフィグレーションで上位のバージョンを要求されたり,あるいはコンパイルできなかったりなど,壁にぶつかります.また,すでにインストールされているライブラリとは異なるバージョンが必要になったりします.そこで,インストール状況の管理機能とインストールする場所の準備を真っ先に実施しましょう. 

 本件におけるバージョン調整の基本方針は次のとおりです. 

 # yumなどの管理ツールは一切使わず,すべてソースコードからビルドします. 
 # /usr/local へインストールします. 
 # 管理ツールとして Paco を使います. 
 #    共有ライブラリは新しく,最終ターゲットはそれなりの新しさで. 
 最終的に必要なのは変換コマンドです.ビルドするターゲットは,新しいほど様々なライブラリを取り込んでいるので,場合によってはコンパイルができなくなったりします. 


 h3. 解凍ツール 

 ダウンロードしたソースコードを解凍するために,最近ではXZ Utilsが必要になってきています. 

 http://tukaani.org/xz/ 


 h3. インストールしたライブラリの管理 

 Pacoが便利です.是非,インストールしましょう. 
 そもそも,この環境づくりの作業は長いですから,どこで中断したのか?を把握するためにも,便利です.このコマンド "paco" は特権ユーザーでなくても実行できます. 


 【例】Pacoによるインストールとファイル場所の確認 
 <pre> 
 $ pwd 
 /usr/home/taro/fontconfig-2.5.91 
 $ env PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig    ./configure --prefix=/usr/local 
 $ make 
 $ sudo paco -D make install 
 $ 
 $ paco -a 
 fontconfig-2.5.91  
       ・ 
       ・ 
       ・ 

 $ paco -f fontconfig-2.5.91  
 fontconfig-2.5.91: 
 /usr/local/bin/fc-cache 
 /usr/local/bin/fc-cat 
 /usr/local/bin/fc-list 
 /usr/local/bin/fc-match 
 /usr/local/etc/fonts/conf.avail/10-autohint.conf 
 /usr/local/etc/fonts/conf.avail/10-no-sub-pixel.conf 
       ・ 
       ・ 
       ・ 
 </pre> 

 h3. ビルドの作法 

 前述のように,オープンソースの世界では,対象となるフォーマットにより,必要な機能(コマンド,ライブラリ)が異なります.その一方,共通するライブラリもあります.本件で最も大きいのは,GTK+でしょう.加えて,そのビルド時には X Window Systems も必要です.すなわち,描画に関するライブラリです. 

 テキストを抽出する機能(=コマンド)自体は描画をしませんが,それだけを make することが,事実上,できません.どうしてもそれを包含する構成全体をビルドしなければなりません.それがこの全文検索機能の構築を難しくしています. 

 後述するように,例えば PDFからテキストを抽出する機能だけが必要であれば,GTK+全体をビルドする必要はありません.しかし,MS-Office文書を対象とするには,GTK+全体が必要になります.なので,これからビルドを始める前に,どの機能を必要とするのか?を決めておきましょう. 


 h3. 事前のチェック 

 ビルドに必要な基本的環境があります.それらの有無やバージョンをチェックしておきましょう.バージョンが旧ければ,各環境のビルド途中でそういうメッセージが表示されますので,それから準備しても間に合います. 

 * 対象となるサーバーの glibc のバージョンを 2.x以上で管理できるのならば,多少古いOSでも,以下の手順は可能です. 
 <pre> 
 $ /lib/libc.so* 
 GNU C Library stable release version 2.5, by Roland McGrath et al. 
 Copyright (C) 2006 Free Software Foundation, Inc. 
           ・ 
           ・ 
           ・ 
 </pre> 
 * pkg-configは,できるだけ新しいものをインストールしておきましょう. 
 <pre> 
 $ pkg-config --version 
 0.21 
 </pre> 
 * Perl 
 <pre> 
 $ which perl 
 $ perl --version 
 </pre> 
 * 環境変数 
 どちらも既に稼動しているサービスと共存させる場合は,例えば /usr/local へインストールしますが,その場合は,環境変数 PKG_CONFIG_PATH や    LD_LIBRARY_PATH の設定が必要になってきます. 

 PKG_CONFIG_PATH はコンフィグレーション時に設定されていれば充分ですが,LD_LIBRARY_PATH は,例えば .bashrc 内で恒久的に設定したほうが良いでしょう. 

 例:localを先に検索する 
 <pre> 
 env PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig    ./configure --prefix=/usr/local 
 </pre> 

 加えて,すでに /usr/local下に lib や pkgconfig などのディレクトリが存在しないか? /usr/lib/X11 や /usr/include/X11 などもあるか?をチェックしておきましょう. 

 ここでは,PDFやMS-Office,そしてPwerPointファイルからテキストを抽出すること目標にし,GTK+から構築していく手順を示します. 


 h2. GTK+-2.0のインストール 

 GTK+ライブラリのダウンロード元は,{{fn(本家GDK+のサイト,"":http://www.gtk.org/download/linux.php)}}からリンクをたどれます. 


 また,各ライブラリ間の依存関係は{{fn(GNOME のサイト,"":http://developer.gnome.org/gtk3/stable/gtk-building.html)}}に詳しい記述があります.本手順で解決できない場合は,参考になるでしょう. 


 * libjpeg,libtiff.libpngのインストール 
 * gettextのインストール 
 * libxml-2のインストール 
 * fontconfig のインストール 
 * FreeTypeのインストール 

 * GLib 
 2.27.3以上を要求すると思います.もし旧ければ,ビルド時に新しいバージョンが要求されます. 
 * pixman 
 * ATK 
 1.29.2以上を要求すると思います. 
 * GdkPixbuf 
 2.21.0以上を要求すると思います. 
 * Cairo 
  1.6以上を要求すると思います. 
   GTK+のビルド時に,次の環境変数を追加する必要がありますので,位置を確認しておきましょう. 
   CAIRO_BACKEND_CFLAGS=/usr/local/src/cairo-xx.yy.zz 
   CAIRO_BACKEND_LIBS=/usr/local/lib 
 * Pango 
 1.20以上を要求すると思います. 

 上記ライブラリのコンパイル時に,何らかのエラーが生じた場合は,その内容によってはリビジョンを下げるなどの対処が必要になるかもしれません.リビジョンが一つ異なるだけで,結果が変わることもあります. 


 h2. PDF文書の検索 

 MS-Office文書はともかく,少なくともPDF文書だけでも検索したい,というのが一般的な優先順位かと思います. 

 一口にPDFといっても,何らかの電子的な文書から「PDF印刷」したものか,あるいはOCRで認識した文字列を埋め込んだものでなければ,テキストは抽出できません. 

 ここではPopplerというライブラリを利用しますが,その前に,GTK+を構成する一部のライブラリをインストールして,Popperをビルドする準備をします. 

 もし,MS-Office文書のテキスト抽出も目的であれば,GTK+はバージョン2.0以上の全体をインストールしましょう.(前述) 


 h3. GTK+を構成する一部のライブラリをインストール 

 ソースコードは,SourceForge.JPあるいは本家のHPからリンクをたどって, ダウンロードします.得体のしれないサイトからダウンロードをしないようにしましょう. 

 GTK+-2.0はできるだけ新しいバージョンをインストールしましょう.これも構成要素が多いですが,根気よくやりましょう. 

 インストール後のソースコードの場所は全て /usr/local/src とします. 
 すると,ビルド手順は一貫して,次のとおりになります. 

 環境変数の設定 
 <pre> 
 $ LD_LIBRARY_PATH=/usr/local/lib:/usr/lib 
 $ export LD_LIBRARY_PATH 
 $ PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig 
 $ export PKG_CONFIG_PATH 
 </pre> 

 ビルドとインストール 
 <pre> 
 $ ./configure --prefix=/usr/local 
 $ make 
 $ sudo paco -D make install 
 </pre> 

 なお,以下の並びには意味があります.最初のグループはいわば基本的なライブラリで,これを最初にビルドしておきます.GTK+関連のライブラリは最後になります. 

 多少古いOSでもビルドできるでしょう.できるだけ最新の安定版をインストールしましょう. 

 # libjpeg,libtiff.libpngのインストール 
 # gettextのインストール 
 # libxml-2のインストール 
 # fontconfig のインストール 
 # FreeTypeのインストール 

 ここまで済んだら,共有ライブラリを更新しておきましょう. 

 <pre> 
 $ /sbin/ldconfig  
 </pre> 

 Popplerのビルドではさらに日本語のフォント・データ,正確にはCJKですが,も追加します.本家サイトからダウンロードしましょう. 

 <pre> 
 $ wget http://poppler.freedesktop.org/poppler-data-0.4.5.tar.gz 
 </pre> 

 ここで注意すべき点は,上記のインストール場所と整合性を取ることです. 

 <pre> 
 $ sudo paco -D make install datadir=/usr/local/share 
 </pre> 

 最後に単体テストを実施して,終了です. 

 <pre> 
 $ which pdftotext 
 /usr/local/bin/pdftotext 
 $ pdftotext hoge.pdf foo.txt 
 $ less foo.txt 
       ・ 
       ・ 
       ・ 
 </pre> 

 bq. 注) 文字コードに一家言お持ちで,半角にも対応させいたいという方は,/usr/local/share/poppler 以下のフォントデータのMapファイルを修正すればよいでしょう.おすすめはしませんが. 

 ちなみにGTK+を利用するためには,他にGLib,ATK,Caito,Pangoもインストールしなければなりませんが,PDFの範囲であれば,上記までで充分です. 

 h2. MS-Excel文書の検索 

 PDFの次にニーズが高いフォーマットが,おそらくExcelでしょう.抽出コマンドには Gnumericに付属している ssconvert がベストです. 

 準備するライブラリは次のとおりです.GTK+はビルドを済ませておきましょう. 

 # PerlのXML-Parser 
 # intltool 
 # libIDL(ORBit-2.xの前に) 
 # ORBit-2.x(GConfの前に) 
 # GConf 
 # libgsf(GOFFICEの前に) 
 # libgoffice(GOFFICEの一部だがGOFFICEをまるごとビルド) 

 XML-ParserはCPANにあり,おそらく最新版が 2.36です.2007年から更新されていないと思います.CPANからダウンロードして解凍したら,次のようにインストールします. 

 <pre> 
 $ perl Makefile.PL 
 $ make 
 $ make test 
 $ sudo paco -D make install 
 </pre> 

 GOFFICEとGnumericのバージョンの関係には注意が必要です.両者はGNOMEのサイトからソースコードをダウンロードするのですが,できるだけ最新のバージョンをダウンロードするようにしましょう.そうすれば「整合性」が保てます. 


 Gnumericまでビルドが済んだら,単体テストを行います. 

 <pre> 
 $ mkdir hoge 
 $ ssconvert -S --export-type Gnumeric_stf:stf_csv <excelファイル名> '<適当な既存のディレクトリ名>/%n' 
 $ less hoge/* 
 </pre> 

 MS-Excelブックが複数のシートを含む場合は,ディレクトリ "hoge" の下に,0から始まる整数名のファイルが複数,生成されます. 

 h2. MS-Word文書の検索 

 AbiWordは,テキスト抽出ではコマンドとして利用しますが,本来はGUI環境で利用するワードプロセッサです.なのでビルドするには,GTK+あるいはGNOMEの基本的な環境が必要です.加えて,次のライブラリも必要です. 

 * wvWare 
 ソースコードは{{fn(AbiWordの本家サイト,"":http://www.abisource.com/downloads/)}}からダウンロードします. 
 * libRSVG 
 このライブラリは{{fn(GNOMEプロジェクトの一部,"":http://ftp.gnome.org/pub/gnome/sources/librsvg/)}}ですので,ソースコードもそこからダウンロードします. 
 * FriBiDi 
 ソースコードは{{fn(FriBiDiの本家サイト,"":http://fribidi.org/)}}からダウンロードしましょう. 


 bq. 注)ライブラリはできるだけ新しく,とバージョン調整の基本方針に書きましたが,このAbiWordはその例外になります.AbiWordはlibpngが1.5.x系ではコンパイルが出来ません.1.4.x系まで下げる必要があります.両バージョンは共存でき,pacoで管理できます.1.5.x系でコンパイルするにはC++ソースコードを修正する必要があります.これは上級編として,後日,記載します. 

 h2. PowerPoint文書の検索 

 AbiWordやGnumericはOpenDocumentフォーマットにも対応できるのですが,それと同様にコマンドで対応するには,xlhtmlに含まれるppthtmlというのがあります.これはあまり素性がよくない上に,事実0.5で開発が止まっている,64ビット環境下では素直にビルドできません.そこで,{{fn(市吉さんという日本人の方のメモ,!http://www.asahi-net.or.jp/~nd2s-icys/index.html!)}}を参考にして,あるパッチを適用し,ビルドすることにします. AbiWordやGnumericはOpenDocumentフォーマットにも対応できるのですが,それと同様にコマンドで対応するには,xlhtmlに含まれるppthtmlというのがあります.これはあまり素性がよくない上に,事実0.5で開発が止まっている,64ビット環境下では素直にビルドできません.そこで,{{fn(市吉さんという日本人の方のメモ,"http://www.asahi-net.or.jp/~nd2s-icys/index.html":http://www.asahi-net.or.jp/~nd2s-icys/index.html)}}を参考にして,あるパッチを適用し,ビルドすることにします. 

 なお,ppthtmlはHTMLファイルを出力しますが,Hyper EstraierがHTMLフォーマットのまま検索できますので,問題はありません. 

 <pre> 
 $ wget http://www.asahi-net.or.jp/~nd2s-icys/UNIX/xlhtml-0.5.1.tar.gz 
 $ wget http://www.asahi-net.or.jp/~nd2s-icys/UNIX/xlhtml-0.5.1-patch-05 
 $ tar zxvf xlhtml-0.5.1.tar.gz 
 $ cd xlhtml 
 $ patch -p1 < ../xlHtml-0.5.1-patch-05 
 </pre> 

 なお,本コードでも64ビット環境下では警告が出ますが,それは無視できます.config.guessというファイルを読めばわかりますが,CPUタイプに64ビットx86が想定されていません.また,rpmパッケージもありますが,どのくらいコナレテいるのかは不明です.