Analyse de contenu avec Apache Tika

Analyse de contenu avec Apache Tika

1. Vue d'ensemble

Apache Tika is a toolkit for extracting content and metadata from various types of documents, comme 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, faisant 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. Commencer

Pour analyser des documents avec Apache Tika, une seule dépendance Maven est nécessaire:


    org.apache.tika
    tika-parsers
    1.17

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

3. L'APIParser

The Parser API is the heart of Apache Tika, abstracting away the complexity of the parsing operations. 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 instanceInputStream créée à partir du document à analyser

  • handler un objetContentHandler 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 objetMetadata acheminant les propriétés des métadonnées dans et hors de l'analyseur

  • context une instanceParseContext contenant des informations spécifiques au contexte, utilisée pour personnaliser le processus d'analyse

La méthodeparse jette unIOException si la lecture du flux d'entrée échoue, unTikaException si le document extrait du flux ne peut pas être analysé et unSAXException si le gestionnaire est incapable de traiter un événement.

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

Dans la section 5, nous verrons comment les paramètreshandler etmetadata 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çadeTika pour accéder aux fonctionnalités de l'APIParser.

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 de type de document

The detection of document types can be done using an implementation class of the Detector interface, 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 renvoie un objetMediaType décrivant la meilleure estimation concernant le type du document.

Les métadonnées ne sont pas la seule source d’informations sur laquelle se fonde un détecteur. Le détecteur peut également utiliser des octets magiques, qui constituent un motif 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 la mise en œuvre.

Par exemple, le détecteur par défaut fonctionne d'abord avec les octets magiques, puis les propriétés de 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 d'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 instanceLanguageIdentifier.

Cependant,LanguageIdentifier a été abandonné au profit des services Web, ce qui n'est pas précisé dans la documentation deGetting Started.

Les services de détection de langage sont désormais fournis via des sous-types de la classe abstraiteLanguageDetector. À l'aide de services Web, vous pouvez également accéder à des services de traduction en ligne complets, tels que Google Translate ou Microsoft Translator.

Par souci de concision, nous n’examinerons pas ces services en détail.

5. Tika en action

Cette section illustre les fonctionnalités d’Apache Tika en utilisant des exemples concrets.

Les méthodes d’illustration seront regroupé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'unInputStream:

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 toujours ê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çadeTika 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

Extrayons maintenant le contenu d'un fichier et retournons le résultat sous forme deString - en utilisant l'APIParser:

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

Étant donné un fichier Microsoft Word dans le classpath avec ce contenu:

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

Le contenu peut être extrait et vérifié:

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

Encore une fois, la classeTika peut être utilisée pour écrire le code plus facilement:

public static String extractContentUsingFacade(InputStream stream)
  throws IOException, TikaException {

    Tika tika = new Tika();
    String content = tika.parseToString(stream);
    return content;
}

5.3. Extraction de métadonnées

En plus du contenu d'un document, l'APIParser peut également extraire des métadonnées:

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

Lorsqu'un fichier Microsoft Excel existe dans le chemin d'accès aux classes, ce scénario de test confirme que les métadonnées extraites sont correctes:

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

Enfin, voici une autre version de la méthode d'extraction utilisant la classe de façadeTika:

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. Using the Parser and Detector APIs, we can automatically detect the type of a document, as well as extract its content and metadata.

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

Le code source complet de ce didacticiel se trouve àover on GitHub.