検索エンジンを作る

第14回 テキスト情報の抽出[その1]

この記事を読むのに必要な時間:およそ 3 分

全文検索エンジンは,文書ファイルからテキスト情報を抽出して,インデックスを作成することで,高速に全文検索を行えるようにするソフトウェアです。当然ながら文書ファイルからなんらかの手段でテキスト情報を抽出しない限り,次のインデックス作成の処理に移れません。今回から,一般の文書ファイルからテキスト情報を抽出するテーマを扱っていきます。

文書フィルタ

連載の第10回目にFINDSPOTではカスタマイズ性を向上させるために,文書フィルタという独立したプログラムを経由して文書ファイルからテキスト情報を抽出する構造になっていることを説明しました。独自のファイル型式を検索対象にしたいのならば,独自ファイル形式用の文書フィルタを用意すれば良いしくみです。

文書フィルタは引数で入力ファイル名と出力ファイル名を受け取り,入力ファイルを解析してテキスト情報を抽出し,UTF-8でエンコーディングされたFINDSPOTの所定のXML型式により,抽出したテキスト情報やプロパティの内容を出力します。文書フィルタのプログラムは実行できればシェルスクリプトでも,PerlやRubyなどのスクリプトでも,C/C++/Java等で書いたプログラムでも構いません。

FINDSPOTには,テキストファイル用の文書フィルタ,HTMLの文書フィルタ,IFilterというインターフェースを利用したMicrosoft Word/Excel/PowerPoint, PDF, 一太郎などのファイルを対象とする文書フィルタが付属しています。また,FINDSPOTを使う開発案件などでは検索対象となるXMLファイルの専用の文書フィルタを開発することもあります。それぞれについて,どのような構造で実現しているかについて説明していきます。

テキストファイル文書フィルタ

テキストファイルはテキストの実体なので,そのままではないかと思われるかもしれませんが,さまざまな文字セット・エンコーディング(以降文字コード)や改行コードに対応するとなると,意外と大変です。

FINDSPOTのテキストファイル用の文書フィルタでは,次の文字コードのテキストファイルに,コマンドラインから文字コード名を指定することで対応しています。

us-ascii
utf-7
utf-8
utf-16
utf-32
utf-16be
utf-16le
utf-32be
utf-32le
iso-2022-jp
euc-jp
Shift_JIS
cp932
EUC-JP-MS
iso-8859-1
iso-8859-2
iso-8859-3
iso-8859-4
iso-8859-5
iso-8859-6
iso-8859-7
iso-8859-8
iso-8859-9
iso-8859-10
iso-8859-13
iso-8859-14
iso-8859-15

複数の文字コードのテキストファイルが検索対象となっている場合にも対応できるようにするために,FINDSPOTのテキスト文書フィルタは日本語で使われる文字コードの自動判定機能も備えています。自動的に判定できる文字コードは次の通りです。

utf-8
utf-16
utf-16le
utf-16be
iso-2022-jp
Shift_JIS
euc-jp

文字コードの自動判定

文字コードの自動判定機能は,テキストファイルの情報から特定のエンコーディングルールで特徴的に現れるパターンや,固有の文字コード領域の文字が使われているか等を手がかりにして判定します。このあたりの日本語文字コードの検出に関しては,次の本の解説が参考になります。

『日本語情報処理』Ken Lunde著/春遍雀來,鈴木武生訳/ソフトバンク/ISBN4-89052-708-7

さらに,Unicodeの場合にはファイルの先頭にBOMというエンディアンを指定するための特殊文字が付いていることもあるので,これも大きな手がかりになります。

日本語の文字コードの自動判定はどうしても100%完全というわけにはいかず,時折誤判定することがあります。たとえばShift_JISとeuc-jpでは,お互いに重なった領域を文字コードの表現として利用します。テキストファイルの中に重なった領域の文字しか存在しない場合には,Shift_JISなのかeuc-jpなのかという特定は困難なため,文書によっては正確に判定できないことがあるのです。

たとえば,琥珀という文字列はeuc-jpでは16進表現では,E0 E8 E0 E1というバイト列になります。このバイト列は,Shift_JISでは琲珮という文字列に該当します。テキストファイルの本文がE0 E8 E0 E1というバイト列だった場合には,このファイルがeuc-jpなのかShift_JISなのかを区別するには,形態素解析を行うなど別の方法に頼らなければなりません。このあたりのロジックに関してはまだまだ研究の余地がありそうです。

ファイル情報

ファイルサーバ上に置かれたファイルの場合には,ファイルシステム上の属性である所有者情報や,ファイルの作成日付時刻の情報なども検索の手がかりになります。テキストファイル文書フィルタでは,所有者情報,日付時刻情報を取得して,文書プロパティの所有者情報,日付時刻情報として出力しています。このような文書プロパティは,所有者を指定した検索や,日付範囲を指定した検索に利用できます。

著者プロフィール

工藤智行(くどうともゆき)

有限会社サイパック取締役社長。システム構築・管理のコンサルティング,ローカライゼーション,文書処理や障害者向けソフトウェアを中心とするプログラミングを長年手がける。 近著『UNIXプログラミングの道具箱』『システム管理現場の鉄則FreeBSD編』等

URLhttp://www.cypac.co.jp/

著書

コメント

コメントの記入