Inhaltsanalyse mit Apache Tika

1. Übersicht

Apache Tika ist ein Toolkit zum Extrahieren von Inhalten und Metadaten aus verschiedenen Arten von Dokumenten wie Word, Excel und PDF oder sogar Multimediadateien wie JPEG und MP4.

Alle textbasierten und Multimediadateien können über eine gemeinsame Oberfläche analysiert werden. Dies macht Tika zu einer leistungsstarken und vielseitigen Bibliothek für die Inhaltsanalyse.

In diesem Artikel geben wir eine Einführung in Apache Tika, einschließlich der Parsing-API und der automatischen Erkennung des Inhaltstyps eines Dokuments. Es werden auch Arbeitsbeispiele bereitgestellt, um die Funktionsweise dieser Bibliothek zu veranschaulichen.

2. Erste Schritte

Um Dokumente mit Apache Tika zu analysieren, benötigen wir nur eine Maven-Abhängigkeit:

 org.apache.tika tika-parsers 1.17 

Die neueste Version dieses Artefakts finden Sie hier.

3. Die Parser- API

Die Parser- API ist das Herzstück von Apache Tika und abstrahiert die Komplexität der Parsing-Vorgänge . Diese API basiert auf einer einzigen Methode:

void parse( InputStream stream, ContentHandler handler, Metadata metadata, ParseContext context) throws IOException, SAXException, TikaException

Die Bedeutung der Parameter dieser Methode ist:

  • stream - Eine InputStream- Instanz, die aus dem zu analysierenden Dokument erstellt wurde
  • Handler - Ein ContentHandler- Objekt, das eine Folge von XHTML SAX-Ereignissen empfängt, die aus dem Eingabedokument analysiert wurden. Dieser Handler verarbeitet dann Ereignisse und exportiert das Ergebnis in eine bestimmte Form
  • Metadaten - Ein Metadatenobjekt , das Metadateneigenschaften in und aus dem Parser überträgt
  • context - Eine ParseContext- Instanz mit kontextspezifischen Informationen, die zum Anpassen des Analyseprozesses verwendet wird

Die Parse - Methode ein wirft IOException , wenn er nicht aus dem Eingangsstrom zu lesen, ein TikaException , wenn das Dokument aus dem Strom nicht mehr aufgenommen wird und eine analysiert werden SAXException , wenn die Prozedur nicht in der Lage , ein Ereignis zu verarbeiten.

Beim Parsen eines Dokuments versucht Tika, vorhandene Parser-Bibliotheken wie Apache POI oder PDFBox so weit wie möglich wiederzuverwenden. Daher sind die meisten Parser- Implementierungsklassen nur Adapter für solche externen Bibliotheken.

In Abschnitt 5 werden wir sehen, wie die Handler- und Metadatenparameter zum Extrahieren von Inhalten und Metadaten eines Dokuments verwendet werden können.

Der Einfachheit halber können wir die Fassadenklasse Tika verwenden, um auf die Funktionalität der Parser- API zuzugreifen .

4. Automatische Erkennung

Apache Tika kann den Typ eines Dokuments und seine Sprache automatisch anhand des Dokuments selbst und nicht anhand zusätzlicher Informationen erkennen.

4.1. Dokumenttyperkennung

Die Erkennung von Dokumenttypen kann mithilfe einer Implementierungsklasse der Detector- Schnittstelle erfolgen , die über eine einzige Methode verfügt:

MediaType detect(java.io.InputStream input, Metadata metadata) throws IOException

Diese Methode verwendet ein Dokument und die zugehörigen Metadaten und gibt dann ein MediaType- Objekt zurück, das die beste Vermutung hinsichtlich des Dokumenttyps beschreibt.

Metadaten sind nicht die einzige Informationsquelle, auf die sich ein Detektor stützt. Der Detektor kann auch magische Bytes verwenden, die ein spezielles Muster am Anfang einer Datei darstellen, oder den Erkennungsprozess an einen geeigneteren Detektor delegieren.

Tatsächlich ist der vom Detektor verwendete Algorithmus implementierungsabhängig.

Beispielsweise arbeitet der Standarddetektor zuerst mit magischen Bytes und dann mit Metadateneigenschaften. Wenn der Inhaltstyp zu diesem Zeitpunkt noch nicht gefunden wurde, verwendet er den Service Loader, um alle verfügbaren Detektoren zu ermitteln und nacheinander zu testen.

4.2. Spracherkennung

Neben dem Typ eines Dokuments kann Tika auch ohne Hilfe von Metadateninformationen seine Sprache identifizieren.

In früheren Versionen von Tika wurde die Sprache des Dokuments mithilfe einer LanguageIdentifier- Instanz erkannt .

Allerdings LanguageIdentifier in den Getting Started docs wurde zugunsten von Web Services ist veraltet, die nicht klar gemacht wird.

Spracherkennungsdienste werden jetzt über Untertypen der abstrakten Klasse LanguageDetector bereitgestellt . Über Webdienste können Sie auch auf vollwertige Online-Übersetzungsdienste wie Google Translate oder Microsoft Translator zugreifen.

Der Kürze halber werden wir diese Dienstleistungen nicht im Detail behandeln.

5. Tika in Aktion

In diesem Abschnitt werden die Funktionen von Apache Tika anhand von Arbeitsbeispielen erläutert.

Die Illustrationsmethoden werden in eine Klasse eingeschlossen:

public class TikaAnalysis { // illustration methods }

5.1. Dokumenttypen erkennen

Hier ist der Code, mit dem wir den Typ eines aus einem InputStream gelesenen Dokuments ermitteln können :

public static String detectDocTypeUsingDetector(InputStream stream) throws IOException { Detector detector = new DefaultDetector(); Metadata metadata = new Metadata(); MediaType mediaType = detector.detect(stream, metadata); return mediaType.toString(); }

Angenommen, wir haben eine PDF-Datei mit dem Namen tika.txt im Klassenpfad. Die Erweiterung dieser Datei wurde geändert, um unser Analysetool auszutricksen. Der tatsächliche Typ des Dokuments kann weiterhin durch einen Test gefunden und bestätigt werden:

@Test public void whenUsingDetector_thenDocumentTypeIsReturned() throws IOException { InputStream stream = this.getClass().getClassLoader() .getResourceAsStream("tika.txt"); String mediaType = TikaAnalysis.detectDocTypeUsingDetector(stream); assertEquals("application/pdf", mediaType); stream.close(); }

Es ist klar, dass eine falsche Dateierweiterung Tika dank der magischen Bytes % PDF am Anfang der Datei nicht davon abhalten kann, den richtigen Medientyp zu finden .

Der Einfachheit halber können wir den Erkennungscode mithilfe der Tika- Fassadenklasse mit demselben Ergebnis neu schreiben :

public static String detectDocTypeUsingFacade(InputStream stream) throws IOException { Tika tika = new Tika(); String mediaType = tika.detect(stream); return mediaType; }

5.2. Inhalte extrahieren

Let's now extract the content of a file and return the result as a String – using the Parser API:

public static String extractContentUsingParser(InputStream stream) throws IOException, TikaException, SAXException { Parser parser = new AutoDetectParser(); ContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); ParseContext context = new ParseContext(); parser.parse(stream, handler, metadata, context); return handler.toString(); }

Given a Microsoft Word file in the classpath with this content:

Apache Tika - a content analysis toolkit The Apache Tika™ toolkit detects and extracts metadata and text ...

The content can be extracted and verified:

@Test public void whenUsingParser_thenContentIsReturned() throws IOException, TikaException, SAXException { InputStream stream = this.getClass().getClassLoader() .getResourceAsStream("tika.docx"); String content = TikaAnalysis.extractContentUsingParser(stream); assertThat(content, containsString("Apache Tika - a content analysis toolkit")); assertThat(content, containsString("detects and extracts metadata and text")); stream.close(); }

Again, the Tika class can be used to write the code more conveniently:

public static String extractContentUsingFacade(InputStream stream) throws IOException, TikaException { Tika tika = new Tika(); String content = tika.parseToString(stream); return content; }

5.3. Extracting Metadata

In addition to the content of a document, the Parser API can also extract metadata:

public static Metadata extractMetadatatUsingParser(InputStream stream) throws IOException, SAXException, TikaException { Parser parser = new AutoDetectParser(); ContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); ParseContext context = new ParseContext(); parser.parse(stream, handler, metadata, context); return metadata; }

When a Microsoft Excel file exists in the classpath, this test case confirms that the extracted metadata is correct:

@Test public void whenUsingParser_thenMetadataIsReturned() throws IOException, TikaException, SAXException { InputStream stream = this.getClass().getClassLoader() .getResourceAsStream("tika.xlsx"); Metadata metadata = TikaAnalysis.extractMetadatatUsingParser(stream); assertEquals("org.apache.tika.parser.DefaultParser", metadata.get("X-Parsed-By")); assertEquals("Microsoft Office User", metadata.get("Author")); stream.close(); }

Finally, here's another version of the extraction method using the Tika facade class:

public static Metadata extractMetadatatUsingFacade(InputStream stream) throws IOException, TikaException { Tika tika = new Tika(); Metadata metadata = new Metadata(); tika.parse(stream, metadata); return metadata; }

6. Conclusion

Dieses Tutorial konzentrierte sich auf die Inhaltsanalyse mit Apache Tika. Mithilfe der Parser- und Detektor- APIs können wir den Typ eines Dokuments automatisch erkennen sowie dessen Inhalt und Metadaten extrahieren .

Für erweiterte Anwendungsfälle können wir benutzerdefinierte Parser- und Detektorklassen erstellen , um mehr Kontrolle über den Parsing-Prozess zu haben.

Den vollständigen Quellcode für dieses Tutorial finden Sie auf GitHub.