プロが教えるわが家の防犯対策術!

再質問することにします。

Linux(debian wheezy) で
あるディレクトリにある
pdf ファイル群の中身のテキストを検索したいのですが、
find /directory_path |xargs grep -i keyword
とやって検索する場合に比べて
namazu groonga
を使うメリットってどのくらいあるでしょうか?
(他にもやり方はあるのでしょうか?)

namazu を文字化けせず使うためには
$ sudo update-locale LANG=ja_JP.EUC-JP LANGUAGE="ja_JP:ja"
を実行しておいて
ロケールを EUC-JP に変更しなければいけないので
この辺りが原因で後で何か面倒なことが発生しないかも少し気になります。

どのやり方でもまず
pdf を txt化しておかねばなりません。
ファイル名からやっかいな空白を削除するためには
どこかのサイトに書いてあったことを使い、
pdftotext の処理には以前の質問で教えていただいたことを応用
(応用というかほとんどそのままですが)して
$ find . -name "* *" | rename 's/ /_/g'
$ find ./ -name '*.pdf' -print | while read line;do ${line} ${line%.pdf}.txt;done
とやればいいと思います。

A 回答 (4件)

・grep対象のテキストファイルの文字コードが統一されていて(異なるのはnkf等で事前に統一)


・grepで指定する文字列の文字コードもそれと同じで
・ファイル数やファイルサイズも少なくて
・PDFが更新されるたびにテキスト化する手間が惜しくなく(ないしは、アップロード時に変換を自動化しておくか)
・検索結果の一覧やそのリンクのHTML化するのも自力で行う(ないしは、HTML化は不要)
ってことならgrepでも いいんじゃないですかね。

逆にいうと、同一ファイルに対して何度も検索をしていて、
その対象となるデータ量が多いとか、今後増える予定ってことなら、
grep検索では実用的な応答速度にならないかもしれませんので、
その場合は、全文検索エンジンを使うべきかと。


なお、mknmzで PDFファイルが
Unable to convert pdf file (maybe copying protection)
のエラーになる件は、 実際にPDFにパスワードロックがかかっているのでなく
デフォルトロケールをEUC-JPにすると解決するということなら、
xpfdの設定ファイル(xpdfrc)のunicodeMapで指定しているファイルがないってことかも。
(パス間違いとかで・・)
    • good
    • 0
この回答へのお礼

ありがとうございます。

ファイル数やファイルサイズは
そんなに大きくはならない範囲で使っていくことになると思います。
それと、検索語句がどのファイルに含まれているかが分かれば十分ですので、
HTML化したいとは考えておりません。
(HTML化するとどういうメリットがあるかが分からないのですが・・・)

namazu のインデックス作成は
一つのファイルのみを書き換えた時でも
全ファイルをスキャンしなおす、
という面倒なやり方になっているのも少し気になります。
groonga は debian の安定版ではまだ使えないので私は試せない状況ですが、
こちらはどうでしょう?

> xpfdの設定ファイル(xpdfrc)のunicodeMapで指定しているファイルがないってことかも。
> (パス間違いとかで・・)

xpdf はインストールしていなかったので、
poppler を探してみましたが、どれが設定ファイルか分かりません。

$ sudo find / -name '*poppler*'
/var/lib/dpkg/info/poppler-utils.list
(中略)
/var/lib/dpkg/info/libpoppler-glib8:amd64.md5sums
/usr/share/doc/libpoppler19
/usr/share/doc/poppler-data
/usr/share/doc/libpoppler-glib8
/usr/share/doc/poppler-utils
/usr/share/poppler
/usr/lib/x86_64-linux-gnu/libpoppler-glib.so.8
/usr/lib/x86_64-linux-gnu/tumbler-1/plugins/tumbler-poppler-thumbnailer.so
/usr/lib/x86_64-linux-gnu/libpoppler.so.19.0.0
/usr/lib/x86_64-linux-gnu/libpoppler-glib.so.8.2.0
/usr/lib/x86_64-linux-gnu/libpoppler.so.19
[1]+ 終了 xpdf

xpdf もインストールしてみたのですが

$ find /usr -name '*xpdfrc*'
/usr/share/xpdf/xpdfrc-greek
/usr/share/xpdf/xpdfrc-turkish
/usr/share/xpdf/xpdfrc-chinese-simplified
/usr/share/xpdf/xpdfrc-arabic
/usr/share/xpdf/xpdfrc-hebrew
/usr/share/xpdf/xpdfrc-latin2
/usr/share/xpdf/xpdfrc-korean
/usr/share/xpdf/xpdfrc-thai
/usr/share/xpdf/xpdfrc-japanese
/usr/share/xpdf/xpdfrc-chinese-traditional
/usr/share/xpdf/xpdfrc-cyrillic
/usr/share/man/man5/xpdfrc.5.gz
$ cat /usr/share/xpdf/xpdfrc-japanese | grep unicodeMap
unicodeMap ISO-2022-JP /usr/share/poppler/unicodeMap/ISO-2022-JP
unicodeMap EUC-JP /usr/share/poppler/unicodeMap/EUC-JP
unicodeMap Shift-JIS /usr/share/poppler/unicodeMap/Shift-JIS

となっていまして、utf-8 は全くありません。

PDFテキスト化のための
自作のスクリプト pdf_trf.sh を走らせたたのですが、
エラーが出ております。

$ cat ~/Desktop/pdf_trf.sh
find ./ -name '*.pdf' | while read line;do
# find ./ -name '*.pdf'-print | while read line;do
if [ -e ${line%.pdf}.txt ]
then
echo ${line},'skip'
else
pdftotext ${line} ${line%.pdf}.txt
fi
done
$ bash ~/Desktop/pdf_trf.sh
/home/ykok/Desktop/pdf_trf.sh: 3 行: [: ./01: 二項演算子が予期されます
pdftotext version 0.18.4
Copyright 2005-2011 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2004 Glyph & Cog, LLC
Usage: pdftotext [options] <PDF-file> [<text-file>]
-f <int> : first page to convert
(以下略)

お礼日時:2014/12/17 00:20

> namazu のインデックス作成は


>一つのファイルのみを書き換えた時でも
>全ファイルをスキャンしなおす、
>という面倒なやり方になっているのも少し気になります。

そんなことはありません。
インデックス済のファイルは、更新されない限りは再度インデックス化されることはありません。

もしかして、元ファイルが更新されていなくても、 テンポラリファイルを毎回作り直して
そのテンポラリファイルをインデックス化しているのではないですか?
その場合、テンポラリファイルを生成するシェル側として、
元ファイルが更新したものだけ、テンポラリファイルを作り直すようにすれば解決する問題です。
(findの -newer など使って)


> (HTML化するとどういうメリットがあるかが分からないのですが・・・)

ヒットしたファイルの一覧や ヒットした前後の文章や そのファイルへのリンクが
HTMLで生成してあれば視認性が高まりますし、該当ファイルの閲覧のナビゲーションが簡単にできます。
もちろん、検索結果をどう使うのかの 用途次第ですが。
    • good
    • 1
この回答へのお礼

ありがとうございます。
コメントが遅くなり申し訳ありません。

> そんなことはありません。
> インデックス済のファイルは、更新されない限りは再度インデックス化されることはありません。

ネットで見つけた
とあるプレゼン用のpdfファイルに
私が書いたように書いてあったのですが、
実際に自分のシステムで確かめてみましたが
そのpdfに書いてあったことは間違いだったようです。

テンポラリファイル
(pdftotextが生成するtxtファイルのことでしょうか)
を毎回作り直すということはやっていませんが、
既にあるpdfを更新する時は
ファイル名を少し変えることによって対応させようと思っておりました。

自作スクリプトはこれからまたいじってみます。
スクリプトによる処理は
Google で検索すると難しいやり方でやっているものが多いようです。
なぜ自分がやろうとしている単純なやり方でやらないのかが
多少不思議ではあります。

お礼日時:2014/12/19 23:05

質問に対する回答はNo1のおっしゃっている通りと思いますが、


これではNamazuがあまりにも不憫な気がします。
> Namazu を文字化けせず使うためには $ sudo update-locale …
  sudoしなければならないような特権は必要ありません
  適切に運用すれば文字化けしません

> どのやり方でもまずpdf を txt化しておかねばなりません。
  ドキュメントの通りにすればpdfからindexを生成することができます。

> ファイル名からやっかいな空白
  スペースがあるファイルもちゃんとNamazuで検索できます。



一方、デメリットの追加:
・Namazuで検索する(インデックスを構築する)のとgrepでは結果が異なる可能性があります。
・groongaの方は運用次第でインデックス構築方法を変更できる。

原因についてはgroongaのマニュアルに(理解できるかどうかはさておき)書いてありますが、ここでは結果が異なる可能性があると言う事実だけ知っておけば十分でしょう。

この回答への補足

$ namazu -v
namazu of Namazu 2.0.21
Copyright (C) 1997-1999 Satoru Takabayashi All rights reserved.
Copyright (C) 2000-2011 Namazu Project All rights reserved.
This is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

補足日時:2014/12/15 08:33
    • good
    • 0
この回答へのお礼

ありがとうございます。

> > Namazu を文字化けせず使うためには $ sudo update-locale …
>  sudoしなければならないような特権は必要ありません
>  適切に運用すれば文字化けしません

これは私の環境に起因する問題なのでしょうか。

$ sudo update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
$ update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
bash: update-locale: コマンドが見つかりません

となって、UTF-8 をロケールに設定している状態では次のようになります。

$ mknmz -c ../s1
�����оݤΥե�������Ĵ�٤Ƥ��ޤ�...
1�ĤΥե����뤬�����ǥå����������оݤȤ��Ƹ��Ĥ����ޤ���
1/1 - /home/ykok/Desktop/nmz/database-dir/../s1/Namazu.pdf Unable to convert pdf file (maybe copying protection)
[����]
����: Mon Dec 15 08:53:46 2014
�狼������: /usr/bin/chasen -i e -j -F "%m "
�����ƥ�: linux
Perl: 5.014002
Namazu: 2.0.21

$ mknmz -b ../s1
�����оݤΥե�������Ĵ�٤Ƥ��ޤ�...
1�ĤΥե����뤬�����ǥå����������оݤȤ��Ƹ��Ĥ����ޤ���
1/1 - /home/ykok/Desktop/nmz/database-dir/../s1/Namazu.pdf Unable to convert pdf file (maybe copying protection)
[����]
����: Mon Dec 15 08:57:07 2014
�狼������: no
�����ƥ�: linux
Perl: 5.014002
Namazu: 2.0.21

$ mknmz -k ../s1
Can't locate Text/Kakasi.pm in @INC (@INC contains: /usr/sha
re/namazu/filter /usr/share/namazu/pl . /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl) at /usr/bin/mknmz line 956.
$ mknmz -m ../s1
�����оݤΥե�������Ĵ�٤Ƥ��ޤ�...
1�ĤΥե����뤬�����ǥå����������оݤȤ��Ƹ��Ĥ����ޤ���
1/1 - /home/ykok/Desktop/nmz/database-dir/../s1/Namazu.pdf Unable to convert pdf file (maybe copying protection)
[����]
����: Mon Dec 15 08:58:10 2014
�狼������: /usr/bin/chasen -i e -j -F "%m %H\n"
�����ƥ�: linux
Perl: 5.014002
Namazu: 2.0.21

> > どのやり方でもまずpdf を txt化しておかねばなりません。
>  ドキュメントの通りにすればpdfからindexを生成することができます。

下記のようになったので
pdf を txt化しておかねばならないと思ったのですが、
もう少し
http://www.namazu.org/doc/manual.html
などを読み込んでみます。

$ ls -l ../s1
合計 360
-rwxrwxrwx 1 ykok ykok 363259 12月 15 08:34 N amazu.pdf
$ mknmz -c ../s1
検索対象のファイルを調べています...
1個のファイルがインデックス作成の対象として見つかりました
1/1 - /home/ykok/Desktop/nmz/database-dir/../s1/N%20amazu.pdf Unable to convert pdf file (maybe copying protection)
[基本]
日付: Mon Dec 15 09:22:24 2014
わかち書き: /usr/bin/chasen -i e -j -F "%m "
システム: linux
Perl: 5.014002
Namazu: 2.0.21

お礼日時:2014/12/15 08:31

namazu groonga を使用するメリットは『事前にイン


デックスを作っておけば、検索速度がめっちゃ速い』
ことです。

もし、処理手順を
 1. 検索を開始
 2. pdf からテキストを抽出
 3. 抽出したテキストから検索実行
 4. 結果表示
のようなことを考えているのであれば、namazu
groonga を使うのはデメリットしかありません。
(検索のためにインデックスを作る処理に時間が
かかるので、逆に遅くなってしまう)

namazu groonga を効率的に使えるのは
 ・事前にインデックスを作ることができる
 ・事前に作ったインデックスを使いまわして
  検索するケースが多い
場合です。
検索のたびに pdf が変わる前提のシステムなら使う
メリットは皆無です。
    • good
    • 0
この回答へのお礼

ありがとうございます。

検索するディレクトリの pdf は少しづつ追加されていき
そのたびにインデックスを作成しなおしておく、
というようにして使用していくことになると思います。

> 2. pdf からテキストを抽出
No.2 の方によると、namazu ではこれは必要ないということのようですね。

お礼日時:2014/12/15 08:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!