Wie kann ich eine Volltextsuche von PDF-Dateien aus Perl durchführen?

8

Ich habe eine Reihe von PDF-Dateien und mein Perl-Programm muss eine Volltextsuche durchführen, um herauszufinden, welche eine bestimmte Zeichenfolge enthalten. Bis heute benutze ich das:

%Vor%

Dabei ist $ string der zu suchende Text. Dies schlägt jedoch bei den meisten PDFs fehl, da das Dateiformat offensichtlich kein ASCII ist.

Was kann ich am einfachsten tun?

Klärung: Es gibt ungefähr 300 pdfs, deren Name ich nicht im Voraus weiß. PDF :: Core ist wahrscheinlich übertrieben. Ich versuche, pdftotext und grep zu bekommen, um nett miteinander zu spielen, da ich die Namen der pdfs nicht kenne, kann ich die richtige Syntax noch nicht finden.

Endgültige Lösung mit Adam Bellaires Vorschlag unten:

%Vor%     
aurelien 26.09.2008, 12:07
quelle

6 Antworten

9

Der PerlMonks-Thread hier spricht über dieses Problem.

Es scheint, dass es für Ihre Situation am einfachsten ist, pdftotext (das Befehlszeilentool) zu erhalten. Dann können Sie Folgendes tun:

%Vor%     
Adam Bellaire 26.09.2008, 12:21
quelle
2
___ antwort139130 ___

Ich zweite Adam Bellaire Lösung. Ich habe das Dienstprogramm pdftotext verwendet, um den Volltextindex meiner eBook-Bibliothek zu erstellen. Es ist etwas langsam, aber macht seine Arbeit. Wie für Volltext, versuchen Sie PLucene oder KinoSearch, um den Volltextindex zu speichern.

    
___ qstntxt ___

Ich habe eine Reihe von PDF-Dateien und mein Perl-Programm muss eine Volltextsuche durchführen, um herauszufinden, welche eine bestimmte Zeichenfolge enthalten. Bis heute benutze ich das:

%Vor%

Dabei ist $ string der zu suchende Text. Dies schlägt jedoch bei den meisten PDFs fehl, da das Dateiformat offensichtlich kein ASCII ist.

Was kann ich am einfachsten tun?

Klärung: Es gibt ungefähr 300 pdfs, deren Name ich nicht im Voraus weiß. PDF :: Core ist wahrscheinlich übertrieben. Ich versuche, pdftotext und grep zu bekommen, um nett miteinander zu spielen, da ich die Namen der pdfs nicht kenne, kann ich die richtige Syntax noch nicht finden.

Endgültige Lösung mit Adam Bellaires Vorschlag unten:

%Vor%     
___ answer139255 ___

Vielleicht möchten Sie sich PDF :: Core ansehen.

    
___ answer151907 ___

Meine Bibliothek, CAM :: PDF , unterstützt das Extrahieren von Text, aber es ist ein von Natur aus hartes Problem angesichts der grafischen Ausrichtung der PDF-Syntax. Also, die Ausgabe ist manchmal Kauderwelsch. CAM :: PDF bündelt ein getpdftext.pl Programm, oder Sie können die Funktionalität wie aufrufen Also:

%Vor%     
___ tag123perl ___ Perl ist eine prozedurale, allgemeine Programmiersprache für allgemeine Zwecke, die für ihre native Unterstützung von regulären Ausdrücken und String-Parsing-Funktionen bekannt ist. Bitte verwenden Sie diesen Tag für Fragen zu Perl im Allgemeinen. Für Dinge, die mit der neuen (aber verwandten) Sprache "Perl 6" zu tun haben, verwenden Sie bitte das perl6-Tag. Verwenden Sie für reguläre Ausdrücke nach Perl-Art in anderen Sprachen das Regex-Tag oder, falls sie auf der PCRE-Bibliothek basieren, das PCRE-Tag. ___ answer139432 ___

Der einfachste Volltextindex / Suche, den ich verwendet habe, ist mysql. Sie fügen nur in die Tabelle mit dem entsprechenden Index ein. Sie müssen einige Zeit damit verbringen, die relativen Gewichtungen für Felder auszuarbeiten (eine Übereinstimmung im Titel könnte höher sein als eine Übereinstimmung im Körper), aber dies ist alles möglich, wenn auch mit etwas haarigem SQL.

Plucene ist veraltet (es gab in den letzten zwei Jahren keine aktive Arbeit afaik) zugunsten von KinoSearch. KinoSearch entwickelte sich zum Teil aus dem Verständnis der architektonischen Grenzen des Pluzän.

Wenn Sie ~ 300 pdfs haben, dann, sobald Sie den Text aus der PDF extrahiert haben (vorausgesetzt, die PDF hat Text und nicht nur Bilder von Text;) und abhängig von Ihren Abfragevolumen finden Sie vielleicht grep.

Allerdings würde ich die mysql / kinosearch-Route sehr empfehlen, da sie viel Grund (Stemming, Stoppwörter, Termswosing, Token-Parsing) umfasst, von dem Sie nicht profitieren können.

KinoSearch ist wahrscheinlich schneller als die mysql-Route, aber die mysql-Route bietet Ihnen mehr gebräuchliche Standardsoftware / Tools / Entwickler-Erfahrung. Und Sie erhalten die Fähigkeit, die Fähigkeiten von SQL zu nutzen, um Ihre Freitext-Suchanfragen zu verändern.

Wenn Sie also nicht riesige Datensätze und irrsinnige Abfragevolumes sprechen, wäre mein Geld auf mysql.

    
___ answer162992 ___

Sie könnten Lucene ausprobieren (der Perl-Port heißt Plucene). Die Suche ist unglaublich schnell und ich weiß, dass PDFBox bereits weiß, wie man PDF-Dateien mit Lucene indexiert. PDFBox ist Java, aber wahrscheinlich gibt es irgendwo in CPAN etwas sehr ähnliches. Auch wenn Sie etwas nicht finden können, das bereits PDF-Dateien zu einem Lucene-Index hinzufügt, sollte es nicht mehr als ein paar Zeilen Code sein, um es selbst zu machen. Lucene gibt Ihnen einige Suchmöglichkeiten, anstatt nur nach einer Zeichenkette in einer Datei zu suchen.

Es gibt auch einen sehr schnellen und schmutzigen Weg. Text in einer PDF-Datei wird tatsächlich als einfacher Text gespeichert. Wenn Sie ein PDF in einem Texteditor öffnen oder 'Strings' verwenden, können Sie den Text dort sehen. Der binäre Müll ist in der Regel eingebettete Schriftarten, Bilder, etc.

    
___ tag123pdf ___ Das Portable Document Format (PDF) ist ein offener Standard für den elektronischen Dokumentenaustausch, der von der Internationalen Organisation für Normung (ISO) gepflegt wird. Fragen können zum Erstellen, Lesen, Bearbeiten von PDFs mit verschiedenen Sprachen sein. ___ tag123fulltextsearch ___ Bei der Volltextsuche werden Dokumente gesucht, die normalerweise unstrukturierten Text enthalten, im Gegensatz zu Textfeldern in einer strukturierten Datenbank. ___ answer139077 ___

Der PerlMonks-Thread hier spricht über dieses Problem.

Es scheint, dass es für Ihre Situation am einfachsten ist, pdftotext (das Befehlszeilentool) zu erhalten. Dann können Sie Folgendes tun:

%Vor%     
___ qstnhdr ___ Wie kann ich eine Volltextsuche von PDF-Dateien aus Perl durchführen? ___
aku 26.09.2008 12:31
quelle
2

Meine Bibliothek, CAM :: PDF , unterstützt das Extrahieren von Text, aber es ist ein von Natur aus hartes Problem angesichts der grafischen Ausrichtung der PDF-Syntax. Also, die Ausgabe ist manchmal Kauderwelsch. CAM :: PDF bündelt ein getpdftext.pl Programm, oder Sie können die Funktionalität wie aufrufen Also:

%Vor%     
Chris Dolan 30.09.2008 05:52
quelle
2

Vielleicht möchten Sie sich PDF :: Core ansehen.

    
dsm 26.09.2008 12:50
quelle
1

Der einfachste Volltextindex / Suche, den ich verwendet habe, ist mysql. Sie fügen nur in die Tabelle mit dem entsprechenden Index ein. Sie müssen einige Zeit damit verbringen, die relativen Gewichtungen für Felder auszuarbeiten (eine Übereinstimmung im Titel könnte höher sein als eine Übereinstimmung im Körper), aber dies ist alles möglich, wenn auch mit etwas haarigem SQL.

Plucene ist veraltet (es gab in den letzten zwei Jahren keine aktive Arbeit afaik) zugunsten von KinoSearch. KinoSearch entwickelte sich zum Teil aus dem Verständnis der architektonischen Grenzen des Pluzän.

Wenn Sie ~ 300 pdfs haben, dann, sobald Sie den Text aus der PDF extrahiert haben (vorausgesetzt, die PDF hat Text und nicht nur Bilder von Text;) und abhängig von Ihren Abfragevolumen finden Sie vielleicht grep.

Allerdings würde ich die mysql / kinosearch-Route sehr empfehlen, da sie viel Grund (Stemming, Stoppwörter, Termswosing, Token-Parsing) umfasst, von dem Sie nicht profitieren können.

KinoSearch ist wahrscheinlich schneller als die mysql-Route, aber die mysql-Route bietet Ihnen mehr gebräuchliche Standardsoftware / Tools / Entwickler-Erfahrung. Und Sie erhalten die Fähigkeit, die Fähigkeiten von SQL zu nutzen, um Ihre Freitext-Suchanfragen zu verändern.

Wenn Sie also nicht riesige Datensätze und irrsinnige Abfragevolumes sprechen, wäre mein Geld auf mysql.

    
mintywalker 26.09.2008 13:14
quelle
0

Sie könnten Lucene ausprobieren (der Perl-Port heißt Plucene). Die Suche ist unglaublich schnell und ich weiß, dass PDFBox bereits weiß, wie man PDF-Dateien mit Lucene indexiert. PDFBox ist Java, aber wahrscheinlich gibt es irgendwo in CPAN etwas sehr ähnliches. Auch wenn Sie etwas nicht finden können, das bereits PDF-Dateien zu einem Lucene-Index hinzufügt, sollte es nicht mehr als ein paar Zeilen Code sein, um es selbst zu machen. Lucene gibt Ihnen einige Suchmöglichkeiten, anstatt nur nach einer Zeichenkette in einer Datei zu suchen.

Es gibt auch einen sehr schnellen und schmutzigen Weg. Text in einer PDF-Datei wird tatsächlich als einfacher Text gespeichert. Wenn Sie ein PDF in einem Texteditor öffnen oder 'Strings' verwenden, können Sie den Text dort sehen. Der binäre Müll ist in der Regel eingebettete Schriftarten, Bilder, etc.

    
jm4 02.10.2008 15:24
quelle

Tags und Links