Analisi dei contenuti con Apache Tika

1. Panoramica

Apache Tika è un toolkit per estrarre contenuti e metadati da vari tipi di documenti , come Word, Excel e PDF o anche file multimediali come JPEG e MP4.

Tutti i file di testo e multimediali possono essere analizzati utilizzando un'interfaccia comune, rendendo Tika una libreria potente e versatile per l'analisi dei contenuti.

In questo articolo, daremo un'introduzione ad Apache Tika, inclusa la sua API di analisi e come rileva automaticamente il tipo di contenuto di un documento. Verranno inoltre forniti esempi di lavoro per illustrare le operazioni di questa libreria.

2. Introduzione

Per analizzare i documenti utilizzando Apache Tika, abbiamo bisogno di una sola dipendenza Maven:

 org.apache.tika tika-parsers 1.17 

L'ultima versione di questo artefatto può essere trovata qui.

3. L' API Parser

L' API Parser è il cuore di Apache Tika, che astrae la complessità delle operazioni di analisi . Questa API si basa su un unico metodo:

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

I significati dei parametri di questo metodo sono:

  • streaming - un InputStream istanza creata dal documento da analizzare
  • handler - un oggetto ContentHandler che riceve una sequenza di eventi XHTML SAX analizzati dal documento di input; questo gestore elaborerà quindi gli eventi ed esporterà il risultato in una forma particolare
  • metadata : un oggetto Metadata che trasmette le proprietà dei metadati dentro e fuori il parser
  • contesto - una ParseContext un'istanza trasportano informazioni di contesto specifico, utilizzato per personalizzare il processo di analisi

Il metodo di analisi genera una IOException se non riesce a leggere dal flusso di input, una TikaException se il documento preso dal flusso non può essere analizzato e una SAXException se il gestore non è in grado di elaborare un evento.

Durante l'analisi di un documento, Tika tenta di riutilizzare le librerie di parser esistenti come Apache POI o PDFBox il più possibile. Di conseguenza, la maggior parte delle classi di implementazione Parser sono solo adattatori a tali librerie esterne.

Nella sezione 5, vedremo come i parametri del gestore e dei metadati possono essere utilizzati per estrarre contenuto e metadati di un documento.

Per comodità, possiamo utilizzare la classe di facciata Tika per accedere alla funzionalità dell'API Parser .

4. Rilevamento automatico

Apache Tika può rilevare automaticamente il tipo di un documento e la sua lingua in base al documento stesso piuttosto che su informazioni aggiuntive.

4.1. Rilevamento del tipo di documento

Il rilevamento dei tipi di documento può essere eseguito utilizzando una classe di implementazione dell'interfaccia Detector , che ha un unico metodo:

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

Questo metodo accetta un documento e i relativi metadati associati, quindi restituisce un oggetto MediaType che descrive la migliore ipotesi relativa al tipo di documento.

I metadati non sono l'unica fonte di informazioni su cui si basa un rilevatore. Il rilevatore può anche fare uso di magic bytes, che sono un modello speciale vicino all'inizio di un file o delegare il processo di rilevamento a un rilevatore più adatto.

In effetti, l'algoritmo utilizzato dal rilevatore dipende dall'implementazione.

Ad esempio, il rilevatore predefinito funziona prima con i byte magici, quindi con le proprietà dei metadati. Se il tipo di contenuto non è stato trovato a questo punto, utilizzerà il caricatore di servizi per scoprire tutti i rilevatori disponibili e provarli a turno.

4.2. Rilevamento della lingua

Oltre al tipo di documento, Tika può anche identificare la sua lingua anche senza l'aiuto delle informazioni dei metadati.

Nelle versioni precedenti di Tika, la lingua del documento viene rilevata utilizzando un'istanza LanguageIdentifier .

Tuttavia, LanguageIdentifier è stato deprecato a favore dei servizi Web, il che non è chiarito nella documentazione introduttiva.

I servizi di rilevamento della lingua vengono ora forniti tramite sottotipi della classe astratta LanguageDetector . Utilizzando i servizi Web, puoi anche accedere a servizi di traduzione online completi, come Google Translate o Microsoft Translator.

Per motivi di brevità, non esamineremo questi servizi in dettaglio.

5. Tika in azione

Questa sezione illustra le funzionalità di Apache Tika utilizzando esempi di lavoro.

The illustration methods will be wrapped in a class:

public class TikaAnalysis { // illustration methods }

5.1. Detecting Document Types

Here's the code we can use to detect the type of a document read from an InputStream:

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(); }

Assume we have a PDF file named tika.txt in the classpath. The extension of this file has been changed to try to trick our analysis tool. The real type of the document can still be found and confirmed by a test:

@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(); }

It's clear that a wrong file extension can't keep Tika from finding the correct media type, thanks to the magic bytes %PDF at the start of the file.

For convenience, we can re-write the detection code using the Tika facade class with the same result:

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

5.2. Extracting Content

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

Questo tutorial si è concentrato sull'analisi del contenuto con Apache Tika. Utilizzando le API Parser e Detector , possiamo rilevare automaticamente il tipo di un documento, nonché estrarne il contenuto e i metadati .

Per casi d'uso avanzati, possiamo creare classi Parser e Detector personalizzate per avere un maggiore controllo sul processo di analisi.

Il codice sorgente completo per questo tutorial può essere trovato su GitHub.