Tika Textextraktion: Einführung & Beispiel
Tika ist ein Framework für die Extraktion von Inhalten, das auf den besten Open-Source-Bibliotheken für die Extraktion von Inhalten wie…
Tika ist ein Framework für die Extraktion von Inhalten, das auf den besten Open-Source-Bibliotheken für die Extraktion von Inhalten wie Apache PDFBox, Apache POI und anderen aufbaut und eine einzige, benutzerfreundliche API für die Erkennung des Inhaltstyps (Mime-Typ) und die anschließende Extraktion von Volltext und Metadaten bietet. In Kombination mit der Apache Solr Content Extraction Library (Solr Cell) war die Suche nach umfangreichen Inhaltstypen noch nie so einfach. In diesem Artikel führt Tika-Committer und Lucene PMC-Mitglied Sami Siren in die Verwendung der Tika-API ein und demonstriert anschließend deren Integration in Apache Solr über das Solr Cell-Modul.
Einführung
In diesem Artikel werde ich eine grundlegende Einführung in Apache Tika, seine Komponenten, API und ein einfaches Beispiel für die Extraktion von Inhalten geben. Außerdem werfe ich einen Blick auf die kürzlich veröffentlichte Komponente zur Inhaltsextraktion, die auf Apache Solr (auch bekannt als Solr Cell) aufbaut.
Den vollständigen Quellcode für die enthaltenen Beispiele und Links zu weiteren Informationen zu diesem Thema finden Sie im Abschnitt Ressourcen am Ende dieses Artikels.
Was ist Apache Tika?
Apache Tika ist ein Framework zur Erkennung von Inhaltstypen und zur Extraktion von Inhalten. Tika bietet eine allgemeine Anwendungsprogrammierschnittstelle, mit der Sie den Inhaltstyp eines Dokuments erkennen und Textinhalte und Metadaten aus verschiedenen Dokumentformaten analysieren können. Tika versucht nicht, die ganze Vielfalt der verschiedenen Dokumentenformate selbst zu verstehen, sondern delegiert die eigentliche Arbeit an verschiedene bestehende Parser-Bibliotheken wie Apache POI für Microsoft-Formate, PDFBox für Adobe PDF, Neko HTML für HTML usw.
Die große Idee hinter Tika ist, dass es eine generische Schnittstelle für das Parsen mehrerer Formate bietet. Die Tika-API verbirgt die technischen Unterschiede der verschiedenen Parser-Implementierungen. Das bedeutet, dass Sie nicht für jedes Format, das Sie verwenden, eine eigene API erlernen und verwenden müssen, sondern stattdessen eine einzige API verwenden können – die Tika-API. Intern delegiert Tika die Parsing-Arbeit in der Regel an bestehende Parsing-Bibliotheken und passt das Parse-Ergebnis so an, dass Client-Anwendungen problemlos eine Vielzahl von Formaten verwalten können.
Tika zielt darauf ab, die verfügbaren Ressourcen (hauptsächlich RAM) beim Parsen effizient zu nutzen. Die Tika-API ist strömungsorientiert, so dass das geparste Quelldokument nicht auf einmal in den Speicher geladen werden muss, sondern nur, wenn es benötigt wird. Letztendlich wird die Menge der verbrauchten Ressourcen jedoch von den Parser-Bibliotheken bestimmt, die Tika verwendet.
Zum Zeitpunkt der Erstellung dieses Artikels unterstützt Tika direkt etwa 30 Dokumentformate. Siehe Liste der unterstützten Dokumentformate . Die Liste der unterstützten Dokumentenformate wird von Tika in keiner Weise eingeschränkt. Im einfachsten Fall können Sie die Unterstützung für neue Dokumentformate hinzufügen, indem Sie einen Thin-Adapter implementieren, der die Schnittstelle Parser
für das neue Dokumentformat implementiert.
Tabelle 1. Unterstützte Dokumentformate
Tika-Funktionen
Die beiden Hauptfunktionen von Tika sind die Mime-Type-Erkennung und das Parsen von Inhalten. Die Mime-Typ-Erkennung dient dazu, den Dateityp einer Datei zu ermitteln, wenn er vorher nicht bekannt ist. Tika enthält eine Klasse namens AutoDetectParser
, die die Mime-Type-Erkennung nutzt, um den Mime-Type einer Datei herauszufinden, und diese Information dann verwendet, um die Parsing-Aufgabe an einen Parser zu senden, der das Format versteht. Durch die Verwendung von AutoDetectParser
müssen Sie sich keine Gedanken über verschiedene Parser machen, das übernimmt Tika für Sie.
Die Mime-Type-Erkennung in Tika kann auf verschiedene verfügbare Informationen zurückgreifen, wenn sie versucht, das Format einer Datei zu erkennen. Zu diesen Hinweisen gehören übermittelte Mime-Type-Strings, Ressourcennamen (Dateinamenerweiterung) und schließlich die Rohbytes des Dokuments. Die Datenstrukturen der Mime-Type-Erkennung sind konfigurierbar, so dass Sie problemlos neue Funktionen zusammen mit neuen Parser-Adaptern hinzufügen können.
Die wichtigste Fähigkeit von Tika ist das Parsen von Inhalten. Tika bietet einen dünnen Wrapper/Adapter für bestehende Parser, die über die Schnittstelle Parser
definiert sind. Die Schnittstelle Parser
ist in folgendem Beispiel zu sehen:
Beispiel 1. Tika Parser Schnittstelle
public interface Parser { /** * Parses a document stream into a sequence of XHTML SAX events. * Fills in related document metadata in the given metadata object. * * The given document stream is consumed but not closed by this method. * The responsibility to close the stream remains on the caller. * * @param stream the document stream (input) * @param handler handler for the XHTML SAX events (output) * @param metadata document metadata (input and output) * @throws IOException if the document stream could not be read * @throws SAXException if the SAX events could not be processed * @throws TikaException if the document could not be parsed */ void parse(InputStream stream, ContentHandler handler, Metadata metadata) throws IOException, SAXException, TikaException; }
Wie Sie sehen können, ist die Schnittstelle zum Tika-Parser extrem einfach. Sie nimmt nur drei Parameter entgegen. Der (Eingabe-)Parameter stream
wird benötigt, damit der Parser die Rohdaten des Dokuments lesen kann. Der (Ausgabe-)Parameter handler
wird verwendet, um Callback-Benachrichtigungen über den logischen Inhalt eines Dokuments zurück an Ihre Anwendung zu senden. Die Schnittstelle des Handlers ist vom Typ org.xml.sax.ContentHandler
und entspricht genau der Schnittstelle, die in der Java SAX 2.0 API verwendet wird.
Notiz
Tika bietet einige fertige ContentHandler-Implementierungen, die Sie beim Parsen von Inhalten mit Tika nützlich finden könnten.
Der Parameter metadata
(input/output) schließlich liefert dem Parser zusätzliche Daten als Eingabe und kann zusätzliche Metadaten aus dem Dokument zurückgeben. Beispiele für Metadaten sind Dinge wie der Name des Autors, die Anzahl der Seiten, das Erstellungsdatum usw.
Parsen von Inhalten mit Tika
Im folgenden Beispiel zeige ich Ihnen, wie Sie ein PDF-Dokument analysieren können. Ich verwende Tika, um Titel, Autor und Text des Dokuments als reinen Text zu extrahieren. Der vollständige Quellcode, der alles enthält, was Sie zum Erstellen und Ausführen des Beispiels benötigen, ist verfügbar (siehe Ressourcen).
Beispiel 2. Parsing von Inhalt und Metadaten aus einer PDF-Datei
InputStream input = new FileInputStream(new File(resourceLocation)); ContentHandler textHandler = new BodyContentHandler(); Metadata metadata = new Metadata(); PDFParser parser = new PDFParser(); parser.parse(input, textHandler, metadata); input.close(); out.println("Title: " + metadata.get("title")); out.println("Author: " + metadata.get("Author")); out.println("content: " + textHandler.toString());
In dem obigen Beispiel erstelle ich zunächst einen FileInputStream, der das zu analysierende Dokument enthält. Dann verwende ich einen Tika Content-Handler namens BodyContentHandler
, der intern einen Content-Handler-Dekorator vom Typ XHTMLToTextContentHandler konstruiert. Der Dekorator ist dafür verantwortlich, aus den SAX-Ereignissen, die der Parser ausgibt, die Klartextausgabe zu bilden.
Als nächstes instanziere ich direkt einen PDFParser, rufe die Parse-Methode auf und schließe den Stream. Der explizite Aufruf der Close-Methode von InputStream ist erforderlich, da es nicht in der Verantwortung eines Parsers liegt, diese für Sie aufzurufen.
Im wirklichen Leben sollten Sie wahrscheinlich die Methode AutoDetectParser oder getParser(String mimeType) von TikaConfig verwenden, anstatt die einzelnen Tika-Parser direkt zu erstellen und aufzurufen.
Führen Sie das Beispiel aus:
- Laden Sie das Beispiel-Quellpaket herunter und entpacken Sie es.
- Beispiel kompilieren: mvn clean install
- Ausführen mvn exec:java -Dexec.mainClass=com.lucidimagination.article.tika.TikaParsePdf -Dexec.args=src/test/resources/SampleDocument.pdf
Nachdem ich Ihnen nun gezeigt habe, wie Sie mit Tika einfache Textinhalte aus PDF-Dokumenten analysieren können, liegt es nahe, diese Daten auch zu durchsuchen. Grant Ingersoll hat vor kurzem ein neues Modul für Apache Solr hinzugefügt, mit dem wir genau dies sehr einfach tun können.
Einführung in Solr Cell (ExtractingRequestHandler
)
Der Extracting Request Handler ist ein Solr-Beitragsmodul, mit dem Benutzer binäre Dokumente an Solr übermitteln können. Der Handler verwendet Tika zur Erkennung des Inhaltstyps und zur Extraktion indizierbarer Inhalte, sowohl Text als auch Metadaten, aus den an ihn übermittelten Dokumenten. Der Extracting Request Handler ist recht flexibel, wenn es darum geht, wie er Inhalte verschiedenen Feldern zuordnet, wie er bestimmte Felder verstärkt, usw. Ausführlichere Informationen über alle verfügbaren Optionen finden Sie auf der Wiki-Seite von Solr zum Extracting Request Handler.
Beispiel für das Extrahieren eines Request Handlers
Im folgenden Beispiel werde ich Solr herunterladen und installieren, den Extracting Request Handler konfigurieren und das PDF-Dokument zur Indizierung an Solr senden.
Vorgehensweise 1. Führen Sie das Beispiel aus
- Laden Sie die nächtliche Version (oder 1.4 oder höher) herunter und entpacken Sie sie.
- Beispiel-Quellpaket herunterladen und entpacken
- Indexschema einrichten.
Tipp
Sie können das im Beispielpaket enthaltene Schema verwenden. Es enthält ein sehr einfaches Schema, in dem die Dokumente nur drei Felder Id, Titel und Text enthalten.
Beispiel 3. Dokumentstruktur der bereitgestellten schema.xml<field name="id" type="string" indexed="true" stored="true" required="true" /> <field name="title" type="text" indexed="true" stored="true"/> <field name="text" type="text" indexed="true" stored="false" multiValued="true"/>
- Richten Sie den Extracting Request Handler ein und konfigurieren Sie ihn.
Tipp
Sie können die im Beispielpaket enthaltene Datei verwenden. Die Datei, in der Sie den Handler konfigurieren, heißt solrconfix.xml und befindet sich im Verzeichnis solr/conf.
Beispiel 4. Extrahieren der Request Handler-Konfiguration in solrconfig.xml<requestHandler name="/update/extract"> <lst name="defaults"> <str name="ext.map.Last-Modified">last_modified</str> <bool name="ext.ignore.und.fl">true</bool> </lst> </requestHandler>
- Solr starten
Notiz
Sobald Sie Ihre Solr-Instanz (wieder) gestartet haben, sollte sie bereit sein, alle von Tika unterstützten Dokumentformate zu verarbeiten.
- Senden Sie das zu indizierende Dokument an Solr
Tipp
Sie können das Kommandozeilenprogramm curl (auf den meisten *NIX-Systemen verfügbar) verwenden, um das Dokument zu senden: curl „http://localhost:8983/solr/update/extract?ext.idx.attr=true&ext.def.fl=text“ -F „myfile=@src/test/resources/SampleDocument.pdf“ Jedes andere Tool oder Programm, das die Datei per HTTP POST in der Multipart-Formular-Kodierung senden kann, sollte ebenfalls funktionieren.
- Senden Sie eine Commit-Nachricht an solr.
Tipp
Sie müssen einen Commit ausführen, damit das Dokument durchsuchbar wird. Sie können curl verwenden, um die Übergabe durchzuführen:
curl „http://localhost:8983/solr/update/“ -H „Content-Type: text/xml“ –data-binary ‚<commit waitFlush=“false“/>‘
- Öffnen Sie die Solr-Verwaltungsoberfläche und überprüfen Sie, ob das von uns indizierte Dokument tatsächlich durchsuchbar ist.
Tipp
Die Solr-Verwaltungskonsole ist standardmäßig unter der Adresse http://localhost:8983/solr/admin verfügbar .
Fazit
Apache Solr in Kombination mit dem Extraction Request Handler ist eine sehr leistungsstarke und einfach einzurichtende Kombination mit viel Potenzial. Der Hauptvorteil der Parsing- und Extraktionskomponente auf der Serverseite besteht darin, dass der Client nicht alle Formate verstehen oder sogar Java-basiert sein muss. Durch die Verwendung von Tika ist es auch recht einfach, Parser für neue Dateitypen hinzuzufügen, sobald diese verfügbar sind, ohne dass Sie Solr ändern oder Code hinzufügen müssen.
In einigen Fällen benötigen Sie die Extraktion von Inhalten außerhalb der Suche oder mit einer bestehenden Lucene-Implementierung. In diesem Fall können Sie Tika eigenständig verwenden, wie ich im ersten Teil dieses Artikels gezeigt habe. Außerdem gibt es mindestens einen Anwendungsfall mit Solr, in dem es sinnvoll ist, Tika auf der Client-Seite zu verwenden. Wenn Sie nur die Metadaten eines Dokuments indizieren und durchsuchen möchten (d.h. nicht den vollständigen Text) und Ihre Dateien recht groß sind, dann ist es am sinnvollsten, die Dokumente auf der Client-Seite zu parsen und nur die Metadaten an Solr zu senden, um zu vermeiden, dass Sie große Dateien über die Leitung an Solr senden müssen.
Ressourcen
- Apache Tika Unterstützte Dokumentformate
- ContentHandler (Java 2 Plattform SE 5.0)
- Extrahieren des Request Handlers im Solr Wiki
- Solr Nightly Integration Build
MS Office und verwandte Anwendungen sind eine Marke der Microsoft Corporation. PDF ist eine Marke von Adobe, Inc.