Inhoudsanalyse met Apache Tika

1. Overzicht

Apache Tika is een toolkit voor het extraheren van inhoud en metadata uit verschillende soorten documenten, zoals Word, Excel en PDF of zelfs multimediabestanden zoals JPEG en MP4.

Alle tekstgebaseerde en multimediabestanden kunnen worden geparseerd met behulp van een gemeenschappelijke interface, waardoor Tika een krachtige en veelzijdige bibliotheek is voor inhoudsanalyse.

In dit artikel geven we een inleiding tot Apache Tika, inclusief de parsing-API en hoe het automatisch het inhoudstype van een document detecteert. Er worden ook werkvoorbeelden gegeven om de werking van deze bibliotheek te illustreren.

2. Aan de slag

Om documenten te ontleden met Apache Tika, hebben we slechts één Maven-afhankelijkheid nodig:

 org.apache.tika tika-parsers 1.17 

De nieuwste versie van dit artefact is hier te vinden.

3. Het Parser API

De Parser API is het hart van Apache Tika, waardoor de complexiteit van de ontledingsbewerkingen wordt geabstraheerd. Deze API is gebaseerd op een enkele methode:

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

De betekenissen van de parameters van deze methode zijn:

  • stroom een InputStream instantie gemaakt op basis van het document dat moet worden geparseerd
  • handler een ContentHandler object dat een reeks XHTML SAX-gebeurtenissen ontvangt die uit het invoerdocument zijn geparseerd; deze handler zal dan gebeurtenissen verwerken en het resultaat in een bepaalde vorm exporteren
  • metadata een Metadata object dat metadata-eigenschappen in en uit de parser overbrengt
  • context een ParseContext instantie met contextspecifieke informatie, gebruikt om het parseerproces aan te passen

De ontleden methode gooit een IOException als het niet lukt om uit de invoerstroom te lezen, a TikaException als het document uit de stream niet kan worden geparseerd en een SAXException als de handler een gebeurtenis niet kan verwerken.

Bij het ontleden van een document probeert Tika bestaande parserbibliotheken zoals Apache POI of PDFBox zoveel mogelijk te hergebruiken. Als gevolg hiervan zijn de meeste Parser implementatieklassen zijn slechts adapters voor dergelijke externe bibliotheken.

In sectie 5 zullen we zien hoe de handler en metadata parameters kunnen worden gebruikt om inhoud en metadata van een document te extraheren.

Voor het gemak kunnen we de gevelklasse gebruiken Tika om toegang te krijgen tot de functionaliteit van het Parser API.

4. Automatische detectie

Apache Tika kan automatisch het type document en zijn taal detecteren op basis van het document zelf in plaats van op aanvullende informatie.

4.1. Detectie van documenttypen

De detectie van documenttypen kan worden gedaan met behulp van een implementatieklasse van de Detector koppel, die een enkele methode heeft:

MediaType-detectie (java.io.InputStream-invoer, Metadata-metadata) genereert IOException

Deze methode gebruikt een document en de bijbehorende metagegevens - en retourneert vervolgens een Mediatype object dat de beste schatting beschrijft met betrekking tot het type document.

Metadata is niet de enige informatiebron waarop een detector vertrouwt. De detector kan ook gebruik maken van magische bytes, die een speciaal patroon zijn aan het begin van een bestand, of het detectieproces delegeren aan een geschiktere detector.

In feite is het algoritme dat door de detector wordt gebruikt, afhankelijk van de implementatie.

De standaarddetector werkt bijvoorbeeld eerst met magische bytes en vervolgens met metadata-eigenschappen. Als het inhoudstype op dit punt niet is gevonden, gebruikt het de servicelader om alle beschikbare detectoren te ontdekken en ze beurtelings uit te proberen.

4.2. Taaldetectie

Naast het type document kan Tika ook de taal ervan identificeren, zelfs zonder hulp van metadata-informatie.

In eerdere releases van Tika werd de taal van het document gedetecteerd met behulp van een LanguageIdentifier voorbeeld.

Echter, LanguageIdentifier is vervangen door webservices, wat niet duidelijk wordt gemaakt in de Aan de slag-documenten.

Taaldetectiediensten worden nu geleverd via subtypen van de abstracte klasse LanguageDetector. Met webservices krijgt u ook toegang tot volwaardige online vertaaldiensten, zoals Google Translate of Microsoft Translator.

Kortheidshalve zullen we deze services niet in detail bespreken.

5. Tika in actie

Dit gedeelte illustreert Apache Tika-functies met behulp van werkvoorbeelden.

De illustratiemethoden worden in een klasse verpakt:

openbare klasse TikaAnalysis {// illustratiemethoden}

5.1. Documenttypes detecteren

Hier is de code die we kunnen gebruiken om het type document te detecteren dat wordt gelezen van een InputStream:

openbare statische String detectDocTypeUsingDetector (InputStream stream) gooit IOException {Detector detector = nieuwe DefaultDetector (); Metadata metadata = nieuwe Metadata (); MediaType mediaType = detector.detect (stream, metadata); retourneer mediaType.toString (); }

Stel dat we een pdf-bestand hebben met de naam tika.txt in het klassenpad. De extensie van dit bestand is gewijzigd om te proberen onze analysetool te misleiden. Het echte type van het document kan nog steeds worden gevonden en bevestigd door een test:

@Test openbare leegte whenUsingDetector_thenDocumentTypeIsReturned () gooit IOException {InputStream stream = this.getClass (). GetClassLoader () .getResourceAsStream ("tika.txt"); String mediaType = TikaAnalysis.detectDocTypeUsingDetector (stream); assertEquals ("applicatie / pdf", mediaType); stream.close (); }

Het is duidelijk dat een verkeerde bestandsextensie niet kan voorkomen dat Tika het juiste mediatype vindt, dankzij de magische bytes % PDF aan het begin van het bestand.

Voor het gemak kunnen we de detectiecode herschrijven met de Tika gevelklasse met hetzelfde resultaat:

openbare statische String detectDocTypeUsingFacade (InputStream stream) gooit IOException {Tika tika = nieuwe Tika (); String mediaType = tika.detect (stream); retour mediaType; }

5.2. Inhoud extraheren

Laten we nu de inhoud van een bestand extraheren en het resultaat retourneren als een Draad - de ... gebruiken Parser API:

openbare statische String extractContentUsingParser (InputStream stream) gooit IOException, TikaException, SAXException {Parser parser = nieuwe AutoDetectParser (); ContentHandler-handler = nieuwe BodyContentHandler (); Metadata metadata = nieuwe Metadata (); ParseContext context = nieuwe ParseContext (); parser.parse (stream, handler, metadata, context); return handler.toString (); }

Gegeven een Microsoft Word-bestand in het klassenpad met deze inhoud:

Apache Tika - een toolkit voor inhoudanalyse De Apache Tika ™ -toolkit detecteert en extraheert metadata en tekst ...

De inhoud kan worden geëxtraheerd en geverifieerd:

@Test openbare leegte whenUsingParser_thenContentIsReturned () gooit IOException, TikaException, SAXException {InputStream stream = this.getClass (). GetClassLoader () .getResourceAsStream ("tika.docx"); String content = TikaAnalysis.extractContentUsingParser (stream); assertThat (content, containsString ("Apache Tika - een toolkit voor inhoudanalyse")); assertThat (content, containsString ("detecteert en extraheert metadata en tekst")); stream.close (); }

Nogmaals, de Tika class kan worden gebruikt om de code gemakkelijker te schrijven:

openbare statische String extractContentUsingFacade (InputStream stream) gooit IOException, TikaException {Tika tika = new Tika (); String content = tika.parseToString (stream); inhoud teruggeven; }

5.3. Metadata extraheren

Naast de inhoud van een document, de Parser API kan ook metadata extraheren:

openbare statische Metadata extractMetadatatUsingParser (InputStream stream) gooit IOException, SAXException, TikaException {Parser parser = nieuwe AutoDetectParser (); ContentHandler-handler = nieuwe BodyContentHandler (); Metadata metadata = nieuwe Metadata (); ParseContext context = nieuwe ParseContext (); parser.parse (stream, handler, metadata, context); metadata retourneren; }

Wanneer er een Microsoft Excel-bestand bestaat in het klassenpad, bevestigt deze testcase dat de geëxtraheerde metagegevens correct zijn:

@Test openbare leegte whenUsingParser_thenMetadataIsReturned () gooit 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-gebruiker", metadata.get ("Auteur")); stream.close (); }

Ten slotte is hier een andere versie van de extractiemethode met behulp van de Tika gevel klasse:

openbare statische Metadata extractMetadatatUsingFacade (InputStream stream) gooit IOException, TikaException {Tika tika = new Tika (); Metadata metadata = nieuwe Metadata (); tika.parse (stream, metadata); metadata retourneren; }

6. Conclusie

Deze tutorial was gericht op inhoudsanalyse met Apache Tika. De ... gebruiken Parser en Detector API's, we kunnen automatisch het type document detecteren en de inhoud en metadata extraheren.

Voor geavanceerde gebruiksscenario's kunnen we aangepaste Parser en Detector klassen om meer controle te hebben over het ontledingsproces.

De volledige broncode voor deze tutorial is te vinden op GitHub.