PerlからPDFファイルの全文検索を行うにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/139015

  •  02-07-2019
  •  | 
  •  

質問

PDFファイルがたくさんあるので、Perlプログラムで全文検索を実行して特定の文字列を含むファイルを返す必要があります。 これまで私はこれを使用しています:

my @search_results = `grep -i -l \"$string\" *.pdf`;

$ stringは検索するテキストです。 ただし、ファイル形式が明らかにASCIIではないため、ほとんどのPDFでこれは失敗します。

最も簡単なことは何ですか?

明確化: 名前が事前にわからない約300のPDFがあります。 PDF :: Coreはおそらく過剰です。私はpdftotextとgrepをお互いにうまく再生しようとしていますが、pdfの名前がわからないので、まだ正しい構文が見つかりません。

以下のAdam Bellaireの提案を使用した最終的な解決策:

@search_results = `for i in \$( ls ); do pdftotext \$i - | grep --label="\$i" -i -l "$search_string"; done`;
役に立ちましたか?

解決

PerlMonksスレッドこちらでこの問題について説明しています。

あなたの状況では、 pdftotext (コマンドラインツール)を取得するのが最も簡単かもしれませんが、次のようなことができます:

my @search_results = `pdftotext myfile.pdf - | grep -i -l \"$string\"`;

他のヒント

2番目のAdam Bellaireソリューション。 pdftotextユーティリティを使用して、電子書籍ライブラリのフルテキストインデックスを作成しました。それはやや遅いですが、その仕事をします。フルテキストについては、PLuceneまたはKinoSearchを試してフルテキストインデックスを保存してください。

私のライブラリ、 CAM :: PDF は、テキストの抽出をサポートしていますが、しかし、それはPDF構文のグラフィカルな向きを考えると、本質的に難しい問題です。そのため、出力が意味不明になる場合があります。 CAM :: PDFには、 getpdftext.pl プログラムがバンドルされています。または、次のように機能を呼び出すことができます。

my $doc = CAM::PDF->new($filename) || die "$CAM::PDF::errstr\n";
for my $pagenum (1 .. $doc->numPages()) {
   my $text = $doc->getPageText($pagenum);
   print $text;
}

PDF :: Core をご覧ください。

>

私が使用した中で最も簡単な全文索引/検索はmysqlです。適切なインデックスを持つテーブルに挿入するだけです。フィールドの相対的な重みを計算するのに少し時間をかける必要があります(タイトルの一致は本文の一致よりも高いスコアになる場合があります)が、これは毛むくじゃらのSQLを使用しても可能です。

Pluceneは、KinoSearchを支持して廃止されました(過去2年間、積極的な作業は行われていません)。 KinoSearchは、部分的に、Pluceneのアーキテクチャ上の制限を理解することから発展しました。

PDFが〜300個の場合、PDFからテキストを抽出すると(PDFにはテキストのイメージだけでなくテキストが含まれていると仮定します;)、クエリボリュームによってはgrepで十分な場合があります。

ただし、mysql / kinosearchのルートは、行き詰まりの恩恵を受けない多くの領域(ステミング、ストップワード、用語の重み付け、トークンの解析)をカバーしているため、強くお勧めします。

KinoSearchはおそらくmysqlルートよりも高速ですが、mysqlルートはより広く使用されている標準のsoftware / tools / developer-experienceを提供します。また、SQLの機能を使用して、フリーテキスト検索クエリを拡張することができます。

だからあなたが巨大なデータセットと非常識なクエリボリュームを話していない限り、私のお金はmysqlになります。

Luceneを試すことができます(PerlポートはPluceneと呼ばれます)。検索は非常に高速で、PDFBoxはLuceneでPDFファイルのインデックスを作成する方法をすでに知っていることを知っています。 PDFBoxはJavaですが、CPANのどこかに非常によく似たものがある可能性があります。既にPDFファイルをLuceneインデックスに追加するものが見つからない場合でも、それを自分で行うには数行のコードを超えないようにする必要があります。 Luceneは、単にファイル内の文字列を検索するよりも多くの検索オプションを提供します。

また、非常に迅速で汚れた方法があります。 PDFファイル内のテキストは、実際にはプレーンテキストとして保存されます。テキストエディタでPDFを開くか、「文字列」を使用すると、そこにテキストが表示されます。通常、バイナリジャンクは埋め込みフォント、画像などです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top