teclado por entrada ejemplos archivos perl pdf full-text-search

por - ¿Cómo puedo hacer una búsqueda de texto completo de archivos PDF desde Perl?



entrada por teclado perl (6)

Tengo un montón de archivos PDF y mi programa Perl necesita hacer una búsqueda de texto completo para devolver los que contienen una cadena específica. Hasta la fecha he estado usando esto:

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

donde $ string es el texto a buscar. Sin embargo, esto falla para la mayoría de los pdf porque el formato de archivo obviamente no es ASCII.

¿Qué puedo hacer que sea más fácil?

Aclaración: hay aproximadamente 300 pdf cuyo nombre no sé de antemano. PDF :: Core es probablemente excesivo. Estoy intentando que pdftotext y grep jueguen bien entre sí dado que no conozco los nombres de los pdf, todavía no puedo encontrar la sintaxis correcta.

Solución final usando la sugerencia de Adam Bellaire a continuación:

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


El índice / búsqueda de texto completo más fácil que he usado es mysql. Simplemente inserta en la tabla con el índice apropiado. Necesitas dedicar algo de tiempo a calcular las ponderaciones relativas de los campos (una coincidencia en el título podría tener una puntuación más alta que una coincidencia en el cuerpo), pero todo esto es posible, aunque con algunos sql peludos.

Plucene está en desuso (no ha habido ningún trabajo activo en él en los últimos dos años afaik) a favor de KinoSearch. KinoSearch creció, en parte, sin entender las limitaciones arquitectónicas de Plucene.

Si tiene ~ 300 pdfs, una vez que haya extraído el texto del PDF (suponiendo que el PDF tenga texto y no solo imágenes de texto) y según sus volúmenes de consulta, puede encontrar que grep es suficiente.

Sin embargo, recomiendo encarecidamente la ruta mysql / kinosearch, ya que han cubierto una gran cantidad de terreno (stemming, stopwords, ponderación de términos, análisis sintáctico de tokens) que no te beneficia si te atascas.

KinoSearch es probablemente más rápido que la ruta mysql, pero la ruta mysql le proporciona software / herramientas / experiencia de desarrollador más ampliamente utilizados. Y obtiene la capacidad de utilizar el poder de sql para mejorar sus consultas de búsqueda de texto libre.

Así que a menos que esté hablando de GRANDES conjuntos de datos y volúmenes de consultas locos, mi dinero estaría en mysql.


El hilo PerlMonks aquí habla sobre este problema.

Parece que para su situación, puede ser más simple obtener pdftotext (la herramienta de línea de comandos), entonces puede hacer algo como:

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


Yo segundo la solución de Adam Bellaire. Utilicé la utilidad pdftotext para crear un índice de texto completo de mi biblioteca de libros electrónicos. Es algo lento pero hace su trabajo. En cuanto al texto completo, prueba PLucene o KinoSearch para almacenar el índice de texto completo.


Mi biblioteca, CAM :: PDF , tiene soporte para extraer texto, pero es un problema inherentemente difícil dada la orientación gráfica de la sintaxis de PDF. Entonces, el resultado a veces es un galimatías. CAM :: PDF incluye un programa getpdftext.pl , o puede invocar la funcionalidad como sigue :

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


Podrías probar Lucene (el puerto de Perl se llama Plucene). Las búsquedas son increíblemente rápidas y sé que PDFBox ya sabe cómo indexar archivos PDF con Lucene. PDFBox es Java, pero es probable que haya algo muy similar en algún lugar de CPAN. Incluso si no puede encontrar algo que ya agregue archivos PDF a un índice de Lucene, no debe haber más de unas pocas líneas de código para hacerlo usted mismo. Lucene le dará bastantes más opciones de búsqueda que simplemente buscar una cadena en un archivo.

También hay una manera muy rápida y sucia. El texto en un archivo PDF se almacena en realidad como texto sin formato. Si abre un PDF en un editor de texto o usa ''cadenas'', puede ver el texto allí. La basura binaria usualmente está integrada en fuentes, imágenes, etc.