Indholdsanalyse med Apache Tika

1. Oversigt

Apache Tika er et værktøjssæt til udpakning af indhold og metadata fra forskellige typer dokumenter, såsom Word, Excel og PDF eller endda multimediefiler som JPEG og MP4.

Alle tekstbaserede filer og multimediefiler kan parses ved hjælp af en fælles grænseflade, hvilket gør Tika til et kraftfuldt og alsidigt bibliotek til indholdsanalyse.

I denne artikel giver vi en introduktion til Apache Tika, herunder dets parsing-API, og hvordan den automatisk registrerer indholdstypen i et dokument. Arbejdseksempler vil også blive givet for at illustrere operationer i dette bibliotek.

2. Kom godt i gang

For at parse dokumenter ved hjælp af Apache Tika har vi kun brug for en Maven-afhængighed:

 org.apache.tika tika-parsers 1.17 

Den seneste version af denne artefakt kan findes her.

3. Den Parser API

Det Parser API er hjertet i Apache Tika og fjerner kompleksiteten af ​​parseringsoperationerne. Denne API er afhængig af en enkelt metode:

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

Betydningen af ​​denne metodes parametre er:

  • strøm en InputStream forekomst oprettet fra det dokument, der skal parses
  • handler -en ContentHandler objekt, der modtager en sekvens af XHTML SAX-hændelser, der er analyseret fra inputdokumentet; denne behandler behandler derefter begivenheder og eksporterer resultatet i en bestemt form
  • metadata -en Metadata objekt, der formidler metadataegenskaber ind og ud af parseren
  • sammenhæng -en ParseContext forekomst med kontekstspecifik information, der bruges til at tilpasse parsingsprocessen

Det parse metode kaster en IOUndtagelse hvis den ikke læser fra inputstrømmen, a TikaUndtagelse hvis dokumentet taget fra strømmen ikke kan parses, og a SAXUndtagelse hvis handleren ikke er i stand til at behandle en begivenhed.

Når man analyserer et dokument, forsøger Tika at genbruge eksisterende parserbiblioteker såsom Apache POI eller PDFBox så meget som muligt. Som et resultat, de fleste af Parser implementeringsklasser er bare adaptere til sådanne eksterne biblioteker.

I afsnit 5 ser vi, hvordan handler og metadata parametre kan bruges til at udtrække indhold og metadata i et dokument.

For nemheds skyld kan vi bruge facadeklassen Tika for at få adgang til funktionaliteten af Parser API.

4. Automatisk detektion

Apache Tika kan automatisk registrere typen af ​​et dokument og dets sprog baseret på selve dokumentet snarere end på yderligere information.

4.1. Dokumenttypepåvisning

Påvisning af dokumenttyper kan udføres ved hjælp af en implementeringsklasse for Detektor interface, som har en enkelt metode:

MediaType-detektion (java.io.InputStream-input, metadata-metadata) kaster IOException

Denne metode tager et dokument og dets tilknyttede metadata - returnerer derefter en Medietype objekt, der beskriver det bedste gæt med hensyn til dokumenttypen.

Metadata er ikke den eneste kilde til information, som en detektor bygger på. Detektoren kan også bruge magiske bytes, som er et specielt mønster nær begyndelsen af ​​en fil eller delegere detekteringsprocessen til en mere passende detektor.

Faktisk afhænger algoritmen af ​​detektoren af ​​implementeringen.

For eksempel fungerer standarddetektoren først med magiske bytes og derefter metadataegenskaber. Hvis indholdstypen ikke er fundet på dette tidspunkt, bruger den servicelæsseren til at finde alle tilgængelige detektorer og prøve dem igen.

4.2. Sprogdetektion

Ud over typen af ​​dokument kan Tika også identificere sit sprog selv uden hjælp fra metadataoplysninger.

I tidligere udgivelser af Tika detekteres dokumentets sprog ved hjælp af a LanguageIdentifier eksempel.

Imidlertid, LanguageIdentifier er udfaset til fordel for webtjenester, hvilket ikke er klart i Kom godt i gang-dokumenterne.

Sprogdetekteringstjenester leveres nu via undertyper af den abstrakte klasse LanguageDetector. Ved hjælp af webtjenester kan du også få adgang til fuldt udbyggede online oversættelsestjenester, såsom Google Translate eller Microsoft Translator.

Af kortheds skyld vil vi ikke gennemgå disse tjenester i detaljer.

5. Tika i aktion

Dette afsnit illustrerer Apache Tika-funktioner ved hjælp af arbejdseksempler.

Illustrationsmetoderne pakkes ind i en klasse:

offentlig klasse TikaAnalysis {// illustration metoder}

5.1. Registrering af dokumenttyper

Her er den kode, vi kan bruge til at opdage typen af ​​et dokument, der læses fra en InputStream:

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

Antag, at vi har en PDF-fil med navnet tika.txt i klassestien. Udvidelsen af ​​denne fil er blevet ændret for at prøve at narre vores analyseværktøj. Den virkelige type dokument kan stadig findes og bekræftes ved en test:

@Test offentligt ugyldigt nårUsingDetector_thenDocumentTypeIsReturned () kaster IOException {InputStream stream = this.getClass (). GetClassLoader () .getResourceAsStream ("tika.txt"); String mediaType = TikaAnalysis.detectDocTypeUsingDetector (stream); assertEquals ("applikation / pdf", mediaType); stream.close (); }

Det er klart, at en forkert filtypenavn ikke kan forhindre Tika i at finde den korrekte medietype takket være de magiske bytes % PDF i starten af ​​filen.

For nemheds skyld kan vi omskrive detektionskoden ved hjælp af Tika facadeklasse med samme resultat:

offentlig statisk streng detectDocTypeUsingFacade (InputStream stream) kaster IOException {Tika tika = ny Tika (); String mediaType = tika.detect (stream); returner mediaType; }

5.2. Uddrag af indhold

Lad os nu udtrække indholdet af en fil og returnere resultatet som en Snor - bruger Parser API:

offentlig statisk strengekstraktContentUsingParser (InputStream stream) kaster IOException, TikaException, SAXException {Parser parser = ny AutoDetectParser (); ContentHandler-handler = ny BodyContentHandler (); Metadata metadata = nye metadata (); ParseContext context = ny ParseContext (); parser.parse (stream, handler, metadata, kontekst); return handler.toString (); }

Givet en Microsoft Word-fil i klassestien med dette indhold:

Apache Tika - et værktøjssæt til analyse af indhold Apache Tika ™ værktøjssæt registrerer og udtrækker metadata og tekst ...

Indholdet kan ekstraheres og verificeres:

@Test offentlig ugyldig nårUsingParser_thenContentIsReturned () kaster IOException, TikaException, SAXException {InputStream stream = this.getClass (). GetClassLoader () .getResourceAsStream ("tika.docx"); Strengindhold = TikaAnalysis.extractContentUsingParser (stream); assertThat (indhold, containString ("Apache Tika - et værktøj til indholdsanalyse")); assertThat (indhold, containString ("registrerer og udtrækker metadata og tekst")); stream.close (); }

Igen, den Tika klasse kan bruges til at skrive koden mere bekvemt:

offentlig statisk strengekstraktContentUsingFacade (InputStream stream) kaster IOException, TikaException {Tika tika = ny Tika (); Strengindhold = tika.parseToString (stream); returnere indhold }

5.3. Uddrag af metadata

Ud over indholdet af et dokument er Parser API kan også udtrække metadata:

offentlig statisk metadataekstraktMetadatatUsingParser (InputStream stream) kaster IOException, SAXException, TikaException {Parser parser = ny AutoDetectParser (); ContentHandler-handler = ny BodyContentHandler (); Metadata metadata = nye metadata (); ParseContext context = ny ParseContext (); parser.parse (stream, handler, metadata, kontekst); returnere metadata }

Når der findes en Microsoft Excel-fil på klassestien, bekræfter denne testtilfælde, at de udpakkede metadata er korrekte:

@Test offentligt ugyldigt nårUsingParser_thenMetadataIsReturned () kaster 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-bruger", metadata.get ("Forfatter")); stream.close (); }

Endelig er her en anden version af ekstraktionsmetoden ved hjælp af Tika facadeklasse:

offentlig statisk metadataekstraktMetadatatUsingFacade (InputStream stream) kaster IOException, TikaException {Tika tika = ny Tika (); Metadata metadata = nye metadata (); tika.parse (stream, metadata); returner metadata }

6. Konklusion

Denne tutorial fokuserede på indholdsanalyse med Apache Tika. Bruger Parser og Detektor API'er kan vi automatisk registrere typen af ​​et dokument samt udtrække dets indhold og metadata.

I tilfælde af avanceret brug kan vi oprette brugerdefinerede Parser og Detektor klasser for at få mere kontrol over parsingsprocessen.

Den komplette kildekode til denne vejledning kan findes på GitHub.