プロジェクト

全般

プロフィール

日本語全文検索の環境づくり » 履歴 » バージョン 13

Masanori Machii, 2011/10/12 16:57

1 1 Masanori Machii
h1. 日本語全文検索の環境づくり
2
3
{{>toc}}
4
5 2 Masanori Machii
文書管理プラグイン DMFS(オリジナル版)は,検索エンジンに Xapian を利用しています.そのため,日本語による検索が事実上,不可能になっています.そこで Xapian を Hyper Estraier へ置き換えるのですが,それでも例えば PDF や MS-Office 文書からテキストを抽出する機能もサーバー上へ構築しなければなりません.
6 1 Masanori Machii
7
この環境づくりに関する手順はネット上でも探せますが,特にバージョンの相性については,ノウハウが共有できているとは言えない状況です.ここでは Linux に限って,明らかになったノウハウを少しずつ,蓄積しようと思っています.
8 2 Masanori Machii
9
この環境を構築する上で重要なのは,P系やR系の言語が必要とするライブラリです.そのライブラリがすべての構成要素で共通になるため,yum などの管理機能を使わず,ソースコードから1つずつビルドしていく必要があります.
10
11
最も厄介な問題は,他のシステムと共存させるために,ライブラリのバージョンを変えられない,ということです.幸いなことに,UNIX系のOSではライブラリのパスで回避できますので,環境を構築する前に,すでに稼動しているサービスをよく調べておき,構築後の設計図を作っておくべきでしょう.ビルドもそれにしたがって計画的に行わないと,試行錯誤を何度も繰り返すことになってしまうでしょう.
12
13
全文検索環境と一口にいっても,対象となるフォーマットにより,必要な機能が異なりますし,OSS世界の発展により,やり方も変わって来ました.例えば以前は何事にも X Window System が必要で,そのために Xvfb(Xのヴァーチャル・フレーム・バッファ)を常時稼動させておく必要がありました.しかし最近は,Xなしの環境でも機能を果たすものが増えました.
14
15
これだけとっても,環境が複雑,つまりライブラリの依存関係が複雑なことが理解できるでしょう.なので,ここでは基本ソフトに CentOS 5.6 を採用して全体を通します.
16
5.5で断念した主な理由が,共有ライブラリ glibc のバージョンを管理するのが難しかったからです.また,日本語コードは utf-8 に限定です.
17
18
19
h2. 前提となる基本的な環境とは?
20
21 13 Masanori Machii
少々クラシックな変換「コマンド」で対応する方式と,OpenOfficeサーバーで対応する方式[1]の2つが考えられます.
22 1 Masanori Machii
23 13 Masanori Machii
fn1. OpenOfficeサーバーを用いるのは上級編として後日,紹介します.
24
25 2 Masanori Machii
今回は,コマンド方式を紹介します.
26
27
 
28 1 Masanori Machii
この方式では,前提となる基本的な環境が,対象となるフォーマットで異なります.
29
30 13 Masanori Machii
* PDF
31 1 Masanori Machii
GNU PDFプロジェクトの成果を取り入れます.
32 13 Masanori Machii
33
bq. 注)GNU PDFプロジェクトはその使命を終えて,FSFの最重要プロジェクトから外れたと,2011年10月にアナウンスされました.
34
35
* オフィス文書
36
GNOMEプロジェクトのうち,GNOME Officeの成果[2]を取り入れます.
37
38
fn2. ビルドするためには,GNOMEアーキテクチャと呼ばれる一群やX Window Systemsも必要です.
39
40
bq. GNOME Office 以下の3ソフトウェアから構成されますが,本件ではデータベースは除きます.
41 1 Masanori Machii
** AbiWord - ワードプロセッサ
42
** Gnumeric - 表計算ソフト
43 2 Masanori Machii
** GNOME-DB w:en:GNOME-DB - データベース
44 13 Masanori Machii
45
* PowerPoint
46 1 Masanori Machii
基本的にxlhtmlプロジェクトの成果を取り入れますが,修正コードは日本の方によるものです.
47 4 Masanori Machii
48 2 Masanori Machii
Linux環境全体を俯瞰するには,次のサイトが役に立つでしょう.よくわからないライブラリにぶつかった際には,索引の代わりになります.
49
50 13 Masanori Machii
* Linux From Scratchブック 日本語版[3]
51
* Beyond Linux(R) From Scratch[4]
52 2 Masanori Machii
53 13 Masanori Machii
fn3. Linux From Scratchブック 日本語版 http://sourceforge.jp/projects/lfsbookja/
54 12 Masanori Machii
55 13 Masanori Machii
fn4. Beyond Linux(R) From Scratch http://lfsbookja.sourceforge.jp/BLFS/svn.ja/index.html
56 2 Masanori Machii
57
58
h2. 他システムと共存させる環境の構築
59
60
h3. バージョンをどう調整するか?
61
62
やみくもにビルドしても,コンフィグレーションで上位のバージョンを要求されたり,あるいはコンパイルできなかったりなど,壁にぶつかります.また,すでにインストールされているライブラリとは異なるバージョンが必要になったりします.そこで,インストール状況の管理機能とインストールする場所の準備を真っ先に実施しましょう.
63
64
本件におけるバージョン調整の基本方針は次のとおりです.
65
66
# yumなどの管理ツールは一切使わず,すべてソースコードからビルドします.
67
# /usr/local へインストールします.
68
# 管理ツールとして Paco を使います.
69
#  共有ライブラリは新しく,最終ターゲットはそれなりの新しさで.
70
最終的に必要なのは変換コマンドです.ビルドするターゲットは,新しいほど様々なライブラリを取り込んでいるので,場合によってはコンパイルができなくなったりします.
71
72
73
h3. 解凍ツール
74
75
ダウンロードしたソースコードを解凍するために,最近ではXZ Utilsが必要になってきています.
76
77
http://tukaani.org/xz/
78
79
80
h3. インストールしたライブラリの管理
81
82
Pacoが便利です.是非,インストールしましょう.
83
そもそも,この環境づくりの作業は長いですから,どこで中断したのか?を把握するためにも,便利です.このコマンド "paco" は特権ユーザーでなくても実行できます.
84
85
86
【例】Pacoによるインストールとファイル場所の確認
87
<pre>
88
$ pwd
89
/usr/home/taro/fontconfig-2.5.91
90
$ env PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig  ./configure --prefix=/usr/local
91
$ make
92
$ sudo paco -D make install
93
$
94
$ paco -a
95
fontconfig-2.5.91 
96
      ・
97
      ・
98
      ・
99
100
$ paco -f fontconfig-2.5.91 
101
fontconfig-2.5.91:
102
/usr/local/bin/fc-cache
103
/usr/local/bin/fc-cat
104
/usr/local/bin/fc-list
105
/usr/local/bin/fc-match
106
/usr/local/etc/fonts/conf.avail/10-autohint.conf
107
/usr/local/etc/fonts/conf.avail/10-no-sub-pixel.conf
108
      ・
109
      ・
110
      ・
111
</pre>
112
113
h3. ビルドの作法
114
115
前述のように,オープンソースの世界では,対象となるフォーマットにより,必要な機能(コマンド,ライブラリ)が異なります.その一方,共通するライブラリもあります.本件で最も大きいのは,GTK+でしょう.加えて,そのビルド時には X Window Systems も必要です.すなわち,描画に関するライブラリです.
116
117
テキストを抽出する機能(=コマンド)自体は描画をしませんが,それだけを make することが,事実上,できません.どうしてもそれを包含する構成全体をビルドしなければなりません.それがこの全文検索機能の構築を難しくしています.
118
119
後述するように,例えば PDFからテキストを抽出する機能だけが必要であれば,GTK+全体をビルドする必要はありません.しかし,MS-Office文書を対象とするには,GTK+全体が必要になります.なので,これからビルドを始める前に,どの機能を必要とするのか?を決めておきましょう.
120
121
122
h3. 事前のチェック
123
124
ビルドに必要な基本的環境があります.それらの有無やバージョンをチェックしておきましょう.バージョンが旧ければ,各環境のビルド途中でそういうメッセージが表示されますので,それから準備しても間に合います.
125
126
* 対象となるサーバーの glibc のバージョンを 2.x以上で管理できるのならば,多少古いOSでも,以下の手順は可能です.
127
<pre>
128
$ /lib/libc.so*
129
GNU C Library stable release version 2.5, by Roland McGrath et al.
130
Copyright (C) 2006 Free Software Foundation, Inc.
131
132
133
134
</pre>
135
* pkg-configは,できるだけ新しいものをインストールしておきましょう.
136
<pre>
137
$ pkg-config --version
138
0.21
139
</pre>
140
* Perl
141
<pre>
142
$ which perl
143
$ perl --version
144
</pre>
145
* 環境変数
146
どちらも既に稼動しているサービスと共存させる場合は,例えば /usr/local へインストールしますが,その場合は,環境変数 PKG_CONFIG_PATH や  LD_LIBRARY_PATH の設定が必要になってきます.
147
148
PKG_CONFIG_PATH はコンフィグレーション時に設定されていれば充分ですが,LD_LIBRARY_PATH は,例えば .bashrc 内で恒久的に設定したほうが良いでしょう.
149
150
例:localを先に検索する
151 1 Masanori Machii
<pre>
152 2 Masanori Machii
env PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig  ./configure --prefix=/usr/local
153 1 Masanori Machii
</pre>
154
155 2 Masanori Machii
加えて,すでに /usr/local下に lib や pkgconfig などのディレクトリが存在しないか? /usr/lib/X11 や /usr/include/X11 などもあるか?をチェックしておきましょう.
156 1 Masanori Machii
157 2 Masanori Machii
ここでは,PDFやMS-Office,そしてPwerPointファイルからテキストを抽出すること目標にし,GTK+から構築していく手順を示します.
158 1 Masanori Machii
159 2 Masanori Machii
160
h2. GTK+-2.0のインストール
161
162 13 Masanori Machii
GTK+ライブラリのダウンロード元は,本家GTK+のサイト[5]からリンクをたどれます.
163 2 Masanori Machii
164 13 Masanori Machii
また,各ライブラリ間の依存関係はGNOME のサイト[6]に詳しい記述があります.本手順で解決できない場合は,参考になるでしょう.
165 2 Masanori Machii
166 13 Masanori Machii
fn5. 本家GTK+のサイト http://www.gtk.org/download/linux.php
167 11 Masanori Machii
168 13 Masanori Machii
fn6. GNOME のサイト http://developer.gnome.org/gtk3/stable/gtk-building.html
169 4 Masanori Machii
170 13 Masanori Machii
171 2 Masanori Machii
* libjpeg,libtiff.libpngのインストール
172
* gettextのインストール
173
* libxml-2のインストール
174
* fontconfig のインストール
175
* FreeTypeのインストール
176
177
* GLib
178
2.27.3以上を要求すると思います.もし旧ければ,ビルド時に新しいバージョンが要求されます.
179
* pixman
180
* ATK
181
1.29.2以上を要求すると思います.
182
* GdkPixbuf
183
2.21.0以上を要求すると思います.
184
* Cairo
185
 1.6以上を要求すると思います.
186
  GTK+のビルド時に,次の環境変数を追加する必要がありますので,位置を確認しておきましょう.
187
  CAIRO_BACKEND_CFLAGS=/usr/local/src/cairo-xx.yy.zz
188
  CAIRO_BACKEND_LIBS=/usr/local/lib
189
* Pango
190
1.20以上を要求すると思います.
191
192
上記ライブラリのコンパイル時に,何らかのエラーが生じた場合は,その内容によってはリビジョンを下げるなどの対処が必要になるかもしれません.リビジョンが一つ異なるだけで,結果が変わることもあります.
193
194
195
h2. PDF文書の検索
196
197
MS-Office文書はともかく,少なくともPDF文書だけでも検索したい,というのが一般的な優先順位かと思います.
198
199
一口にPDFといっても,何らかの電子的な文書から「PDF印刷」したものか,あるいはOCRで認識した文字列を埋め込んだものでなければ,テキストは抽出できません.
200
201
ここではPopplerというライブラリを利用しますが,その前に,GTK+を構成する一部のライブラリをインストールして,Popperをビルドする準備をします.
202
203
もし,MS-Office文書のテキスト抽出も目的であれば,GTK+はバージョン2.0以上の全体をインストールしましょう.(前述)
204
205
206
h3. GTK+を構成する一部のライブラリをインストール
207
208
ソースコードは,SourceForge.JPあるいは本家のHPからリンクをたどって, ダウンロードします.得体のしれないサイトからダウンロードをしないようにしましょう.
209
210
GTK+-2.0はできるだけ新しいバージョンをインストールしましょう.これも構成要素が多いですが,根気よくやりましょう.
211
212
インストール後のソースコードの場所は全て /usr/local/src とします.
213
すると,ビルド手順は一貫して,次のとおりになります.
214
215
環境変数の設定
216
<pre>
217
$ LD_LIBRARY_PATH=/usr/local/lib:/usr/lib
218
$ export LD_LIBRARY_PATH
219
$ PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig
220
$ export PKG_CONFIG_PATH
221
</pre>
222
223
ビルドとインストール
224
<pre>
225
$ ./configure --prefix=/usr/local
226
$ make
227
$ sudo paco -D make install
228
</pre>
229
230
なお,以下の並びには意味があります.最初のグループはいわば基本的なライブラリで,これを最初にビルドしておきます.GTK+関連のライブラリは最後になります.
231
232
多少古いOSでもビルドできるでしょう.できるだけ最新の安定版をインストールしましょう.
233
234
# libjpeg,libtiff.libpngのインストール
235
# gettextのインストール
236
# libxml-2のインストール
237
# fontconfig のインストール
238
# FreeTypeのインストール
239
240
ここまで済んだら,共有ライブラリを更新しておきましょう.
241
242
<pre>
243
$ /sbin/ldconfig 
244
</pre>
245
246
Popplerのビルドではさらに日本語のフォント・データ,正確にはCJKですが,も追加します.本家サイトからダウンロードしましょう.
247
248
<pre>
249
$ wget http://poppler.freedesktop.org/poppler-data-0.4.5.tar.gz
250
</pre>
251
252
ここで注意すべき点は,上記のインストール場所と整合性を取ることです.
253
254
<pre>
255
$ sudo paco -D make install datadir=/usr/local/share
256
</pre>
257
258
最後に単体テストを実施して,終了です.
259
260
<pre>
261
$ which pdftotext
262
/usr/local/bin/pdftotext
263
$ pdftotext hoge.pdf foo.txt
264
$ less foo.txt
265
266
267
268
</pre>
269
270
bq. 注) 文字コードに一家言お持ちで,半角にも対応させいたいという方は,/usr/local/share/poppler 以下のフォントデータのMapファイルを修正すればよいでしょう.おすすめはしませんが.
271
272
ちなみにGTK+を利用するためには,他にGLib,ATK,Caito,Pangoもインストールしなければなりませんが,PDFの範囲であれば,上記までで充分です.
273
274
h2. MS-Excel文書の検索
275
276
PDFの次にニーズが高いフォーマットが,おそらくExcelでしょう.抽出コマンドには Gnumericに付属している ssconvert がベストです.
277
278
準備するライブラリは次のとおりです.GTK+はビルドを済ませておきましょう.
279
280
# PerlのXML-Parser
281
# intltool
282
# libIDL(ORBit-2.xの前に)
283
# ORBit-2.x(GConfの前に)
284
# GConf
285
# libgsf(GOFFICEの前に)
286
# libgoffice(GOFFICEの一部だがGOFFICEをまるごとビルド)
287
288
XML-ParserはCPANにあり,おそらく最新版が 2.36です.2007年から更新されていないと思います.CPANからダウンロードして解凍したら,次のようにインストールします.
289
290
<pre>
291
$ perl Makefile.PL
292
$ make
293
$ make test
294
$ sudo paco -D make install
295
</pre>
296
297
GOFFICEとGnumericのバージョンの関係には注意が必要です.両者はGNOMEのサイトからソースコードをダウンロードするのですが,できるだけ最新のバージョンをダウンロードするようにしましょう.そうすれば「整合性」が保てます.
298
299
300
Gnumericまでビルドが済んだら,単体テストを行います.
301
302 1 Masanori Machii
<pre>
303
$ mkdir hoge
304
$ ssconvert -S --export-type Gnumeric_stf:stf_csv <excelファイル名> '<適当な既存のディレクトリ名>/%n'
305 2 Masanori Machii
$ less hoge/*
306
</pre>
307 1 Masanori Machii
308 2 Masanori Machii
MS-Excelブックが複数のシートを含む場合は,ディレクトリ "hoge" の下に,0から始まる整数名のファイルが複数,生成されます.
309 1 Masanori Machii
310
h2. MS-Word文書の検索
311
312
AbiWordは,テキスト抽出ではコマンドとして利用しますが,本来はGUI環境で利用するワードプロセッサです.なのでビルドするには,GTK+あるいはGNOMEの基本的な環境が必要です.加えて,次のライブラリも必要です.
313
314
* wvWare
315 13 Masanori Machii
ソースコードはAbiWordの本家サイト[7]からダウンロードします.
316 1 Masanori Machii
* libRSVG
317 13 Masanori Machii
このライブラリは GNOMEプロジェクトの一部[8]ですので,ソースコードもそこからダウンロードします.
318 2 Masanori Machii
* FriBiDi
319 13 Masanori Machii
ソースコードはFriBiDiの本家サイト[9]からダウンロードしましょう.
320 10 Masanori Machii
321 2 Masanori Machii
322 10 Masanori Machii
bq. 注)ライブラリはできるだけ新しく,とバージョン調整の基本方針に書きましたが,このAbiWordはその例外になります.AbiWordはlibpngが1.5.x系ではコンパイルが出来ません.1.4.x系まで下げる必要があります.両バージョンは共存でき,pacoで管理できます.1.5.x系でコンパイルするにはC++ソースコードを修正する必要があります.これは上級編として,後日,記載します.
323 2 Masanori Machii
324 13 Masanori Machii
fn7. AbiWordの本家サイト http://www.abisource.com/downloads/
325
326
fn8. GNOMEプロジェクトの一部 http://ftp.gnome.org/pub/gnome/sources/librsvg/
327
328
fn9. FriBiDiの本家サイト http://fribidi.org/
329
330 1 Masanori Machii
h2. PowerPoint文書の検索
331 2 Masanori Machii
332 13 Masanori Machii
AbiWordやGnumericはOpenDocumentフォーマットにも対応できるのですが,それと同様にコマンドで対応するには,xlhtmlに含まれるppthtmlというのがあります.これはあまり素性がよくない上に,事実0.5で開発が止まっている,64ビット環境下では素直にビルドできません.そこで,日本人の方のメモ[10]を参考にして,あるパッチを適用し,ビルドすることにします.
333 10 Masanori Machii
334 2 Masanori Machii
なお,ppthtmlはHTMLファイルを出力しますが,Hyper EstraierがHTMLフォーマットのまま検索できますので,問題はありません.
335
336
<pre>
337
$ wget http://www.asahi-net.or.jp/~nd2s-icys/UNIX/xlhtml-0.5.1.tar.gz
338
$ wget http://www.asahi-net.or.jp/~nd2s-icys/UNIX/xlhtml-0.5.1-patch-05
339 1 Masanori Machii
$ tar zxvf xlhtml-0.5.1.tar.gz
340 2 Masanori Machii
$ cd xlhtml
341
$ patch -p1 < ../xlHtml-0.5.1-patch-05
342
</pre>
343
344
なお,本コードでも64ビット環境下では警告が出ますが,それは無視できます.config.guessというファイルを読めばわかりますが,CPUタイプに64ビットx86が想定されていません.また,rpmパッケージもありますが,どのくらいコナレテいるのかは不明です.
345 13 Masanori Machii
346
fn10. 市吉さんのメモ http://www.asahi-net.or.jp/~nd2s-icys/index.html