Analyse de contenu avec Apache Tika

1. Vue d'ensemble

Apache Tika est une boîte à outils pour extraire du contenu et des métadonnées à partir de différents types de documents , tels que Word, Excel et PDF ou même des fichiers multimédias comme JPEG et MP4.

Tous les fichiers texte et multimédia peuvent être analysés à l'aide d'une interface commune, ce qui fait de Tika une bibliothèque puissante et polyvalente pour l'analyse de contenu.

Dans cet article, nous présenterons Apache Tika, y compris son API d'analyse et comment il détecte automatiquement le type de contenu d'un document. Des exemples de travail seront également fournis pour illustrer les opérations de cette bibliothèque.

2. Premiers pas

Pour analyser des documents à l'aide d'Apache Tika, nous n'avons besoin que d'une seule dépendance Maven:

 org.apache.tika tika-parsers 1.17 

La dernière version de cet artefact peut être trouvée ici.

3. L' API Parser

L' API Parser est le cœur d'Apache Tika, éliminant la complexité des opérations d'analyse . Cette API repose sur une seule méthode:

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

Les significations des paramètres de cette méthode sont:

  • stream - une instance InputStream créée à partir du document à analyser
  • handler - un objet ContentHandler recevant une séquence d'événements XHTML SAX analysés à partir du document d'entrée; ce gestionnaire traitera ensuite les événements et exportera le résultat sous une forme particulière
  • metadata - un objet Metadata qui transmet les propriétés des métadonnées dans et hors de l'analyseur
  • context - une instance ParseContext transportant des informations spécifiques au contexte, utilisée pour personnaliser le processus d'analyse

La méthode parse lève une IOException si la lecture du flux d'entrée échoue, une TikaException si le document extrait du flux ne peut pas être analysé et une SAXException si le gestionnaire est incapable de traiter un événement.

Lors de l'analyse d'un document, Tika tente de réutiliser autant que possible les bibliothèques d'analyseurs existantes telles que Apache POI ou PDFBox. En conséquence, la plupart des classes d'implémentation Parser ne sont que des adaptateurs pour ces bibliothèques externes.

Dans la section 5, nous verrons comment le gestionnaire et les paramètres de métadonnées peuvent être utilisés pour extraire le contenu et les métadonnées d'un document.

Pour plus de commodité, nous pouvons utiliser la classe de façade Tika pour accéder aux fonctionnalités de l' API Parser .

4. Détection automatique

Apache Tika peut détecter automatiquement le type d'un document et sa langue en se basant sur le document lui-même plutôt que sur des informations supplémentaires.

4.1. Détection du type de document

La détection des types de documents peut être effectuée à l'aide d'une classe d'implémentation de l' interface Detector , qui a une seule méthode:

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

Cette méthode prend un document et ses métadonnées associées - puis retourne un objet MediaType décrivant la meilleure estimation concernant le type du document.

Les métadonnées ne sont pas la seule source d'informations sur laquelle s'appuie un détecteur. Le détecteur peut également utiliser des octets magiques, qui sont un modèle spécial au début d'un fichier ou déléguer le processus de détection à un détecteur plus approprié.

En fait, l'algorithme utilisé par le détecteur dépend de l'implémentation.

Par exemple, le détecteur par défaut fonctionne d'abord avec les octets magiques, puis avec les propriétés des métadonnées. Si le type de contenu n'a pas été trouvé à ce stade, il utilisera le chargeur de service pour découvrir tous les détecteurs disponibles et les essayer à son tour.

4.2. Détection de la langue

En plus du type de document, Tika peut également identifier sa langue même sans l'aide des informations de métadonnées.

Dans les versions précédentes de Tika, la langue du document est détectée à l'aide d'une instance LanguageIdentifier .

Cependant, LanguageIdentifier est obsolète au profit des services Web, ce qui n'est pas précisé dans la documentation de mise en route.

Les services de détection de langue sont désormais fournis via des sous-types de la classe abstraite LanguageDetector . À l'aide des services Web, vous pouvez également accéder à des services de traduction en ligne à part entière, tels que Google Translate ou Microsoft Translator.

Par souci de concision, nous ne passerons pas en revue ces services en détail.

5. Tika en action

Cette section illustre les fonctionnalités d'Apache Tika à l'aide d'exemples de travail.

Les méthodes d'illustration seront encapsulées dans une classe:

public class TikaAnalysis { // illustration methods }

5.1. Détection des types de documents

Voici le code que nous pouvons utiliser pour détecter le type d'un document lu à partir d'un 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(); }

Supposons que nous ayons un fichier PDF nommé tika.txt dans le chemin de classe . L'extension de ce fichier a été modifiée pour tenter de tromper notre outil d'analyse. Le type réel du document peut encore être trouvé et confirmé par un 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(); }

Il est clair qu'une mauvaise extension de fichier ne peut pas empêcher Tika de trouver le bon type de média, grâce aux octets magiques % PDF au début du fichier.

Pour plus de commodité, nous pouvons réécrire le code de détection en utilisant la classe de façade Tika avec le même résultat:

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

5.2. Extraction de contenu

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

Ce tutoriel s'est concentré sur l'analyse de contenu avec Apache Tika. En utilisant les API Parser et Detector , nous pouvons détecter automatiquement le type d'un document, ainsi qu'en extraire son contenu et ses métadonnées .

Pour les cas d'utilisation avancés, nous pouvons créer des classes d' analyseur et de détecteur personnalisées pour avoir plus de contrôle sur le processus d'analyse.

Le code source complet de ce didacticiel se trouve à l'adresse over sur GitHub.