プロジェクト

全般

プロフィール

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

Masanori Machii, 2011/10/12 14:17

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