Как я могу сделать полнотекстовый поиск файлов PDF из Perl? - PullRequest
8 голосов
/ 26 сентября 2008

У меня есть несколько файлов PDF, и моей программе на Perl необходимо выполнить их полнотекстовый поиск, чтобы узнать, какие из них содержат конкретную строку. На сегодняшний день я использую это:

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

где $ string - текст для поиска. Однако это не удается для большинства PDF, потому что формат файла явно не ASCII.

Что я могу сделать, это проще всего?

Разъяснение: Есть около 300 PDF, чье имя я не знаю заранее. PDF :: Core, вероятно, излишним. Я пытаюсь заставить pdftotext и grep хорошо играть друг с другом, учитывая, что я не знаю названий pdf, я не могу найти правильный синтаксис.

Окончательное решение по предложению Адама Беллера ниже:

@search_results = `for i in \$( ls ); do pdftotext \$i - | grep --label="\$i" -i -l "$search_string"; done`;

Ответы [ 6 ]

9 голосов
/ 26 сентября 2008

Поток PerlMonks здесь говорит об этой проблеме.

Кажется, что в вашей ситуации проще всего получить pdftotext (инструмент командной строки), тогда вы можете сделать что-то вроде:

my @search_results = `pdftotext myfile.pdf - | grep -i -l \"$string\"`;
2 голосов
/ 30 сентября 2008

Моя библиотека, 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;
}
2 голосов
/ 26 сентября 2008

Возможно, вы захотите посмотреть PDF :: Core .

2 голосов
/ 26 сентября 2008

Я второе решение Адама Беллера. Я использовал утилиту pdftotext для создания полнотекстового индекса моей библиотеки электронных книг. Это немного медленно, но делает свою работу. Что касается полнотекстового, попробуйте PLucene или KinoSearch для хранения полнотекстового индекса.

1 голос
/ 26 сентября 2008

Самым простым полнотекстовым индексом / поиском, который я использовал, является mysql. Вы просто вставляете в таблицу соответствующий индекс. Вам нужно потратить некоторое время на разработку относительных весовых коэффициентов для полей (совпадение в названии может быть выше, чем совпадение в теле), но это все возможно, хотя и с некоторой ошибкой sql.

Plucene устарела (за последние два года на нем не велось активной работы) в пользу KinoSearch. KinoSearch отчасти вырос из понимания архитектурных ограничений Plucene.

Если у вас ~ 300 PDF-файлов, то после того, как вы извлекли текст из PDF (при условии, что в PDF есть текст, а не только изображения текста;) и, в зависимости от объема запросов, вы можете найти, что grep достаточно.

Тем не менее, я бы настоятельно рекомендовал маршрут mysql / kinosearch, так как он охватил большую часть основ (стемминг, стоп-слова, взвешивание терминов, разбор токенов), от которых вам не удастся увязнуть.

KinoSearch, вероятно, быстрее, чем маршрут mysql, но маршрут mysql дает вам более широко используемое стандартное программное обеспечение / инструменты / опыт разработчика. И вы получаете возможность использовать возможности sql для увеличения количества поисковых запросов в свободном тексте.

Так что, если вы не говорите ОГРОМНЫЕ наборы данных и безумные объемы запросов, мои деньги будут на mysql.

0 голосов
/ 02 октября 2008

Вы можете попробовать Lucene (порт Perl называется Plucene). Поиск невероятно быстр, и я знаю, что PDFBox уже знает, как индексировать PDF-файлы с помощью Lucene. PDFBox - это Java, но есть вероятность, что где-то в CPAN что-то очень похожее. Даже если вы не можете найти что-то, что уже добавляет PDF-файлы в индекс Lucene, для этого нужно всего несколько строк кода, чтобы сделать это самостоятельно. Lucene предоставит вам гораздо больше возможностей поиска, чем просто поиск строки в файле.

Есть также очень быстрый и грязный способ. Текст в файле PDF на самом деле хранится в виде простого текста. Если вы откроете PDF в текстовом редакторе или используете «строки», вы можете увидеть текст там. Двоичный мусор обычно включает в себя шрифты, изображения и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...