Analýza obsahu s Apache Tika

1. Prehľad

Apache Tika je sada nástrojov na extrakciu obsahu a metadát z rôznych typov dokumentov, napríklad Word, Excel a PDF alebo dokonca multimediálne súbory ako JPEG a MP4.

Všetky textové a multimediálne súbory je možné analyzovať pomocou spoločného rozhrania, čo z Tiky robí výkonnú a všestrannú knižnicu pre analýzu obsahu.

V tomto článku uvedieme úvod do Apache Tika vrátane jeho syntaktického rozhrania API a spôsobu, ako automaticky detekuje typ obsahu dokumentu. Ďalej budú poskytnuté pracovné príklady na ilustráciu činnosti tejto knižnice.

2. Začíname

Aby sme mohli analyzovať dokumenty pomocou Apache Tika, potrebujeme iba jednu závislosť Maven:

 org.apache.tika tika-parsery 1.17 

Najnovšiu verziu tohto artefaktu nájdete tu.

3. The Analyzátor API

The Analyzátor API je srdcom Apache Tika a oddeľuje tak zložitosť operácií syntaktickej analýzy. Toto API sa spolieha na jednu metódu:

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

Význam parametrov tejto metódy je:

  • Prúd an InputStream inštancia vytvorená z dokumentu, ktorý sa má analyzovať
  • psovod a ContentHandler objekt prijímajúci sekvenciu udalostí XHTML SAX analyzovaných zo vstupného dokumentu; tento obslužný program potom spracuje udalosti a exportuje výsledok v konkrétnej podobe
  • metadáta a Metadáta objekt prenášajúci vlastnosti metadát do a z analyzátora
  • kontext a ParseContext inštancia nesúca kontextovo špecifické informácie, ktorá sa používa na prispôsobenie procesu syntaktickej analýzy

The analyzovať metóda hodí Výnimka IO ak nedokáže načítať zo vstupného toku, a Výnimka Tika ak dokument prevzatý zo streamu nemožno analyzovať a a Výnimka SAX ak obsluha nie je schopná spracovať udalosť.

Pri analýze dokumentu sa Tika pokúsi čo najviac znovu použiť existujúce knižnice parserov ako Apache POI alebo PDFBox. Výsledkom je, že väčšina z Analyzátor implementačné triedy sú iba adaptéry k takýmto externým knižniciam.

V časti 5 uvidíme, ako psovod a metadáta parametre možno použiť na extrahovanie obsahu a metadát dokumentu.

Pre väčšie pohodlie môžeme použiť triedu fasády Tika pre prístup k funkcii Analyzátor API.

4. Automatická detekcia

Apache Tika dokáže automaticky zistiť typ dokumentu a jeho jazyk na základe samotného dokumentu, a nie na základe ďalších informácií.

4.1. Detekcia typu dokumentu

Zistenie typov dokumentov je možné vykonať pomocou implementačnej triedy protokolu Detektor rozhranie, ktorá má jedinú metódu:

Zistenie MediaType (vstup java.io.InputStream, metadáta metadáta) vyvolá IOException

Táto metóda prevezme dokument a súvisiace metadáta - potom vráti a Typ média objekt popisujúci najlepší odhad, pokiaľ ide o typ dokumentu.

Metadáta nie sú jediným zdrojom informácií, na ktoré sa detektor spolieha. Detektor môže tiež využívať magické bajty, ktoré sú špeciálnym vzorom blízko začiatku súboru, alebo delegovať proces detekcie na vhodnejší detektor.

Algoritmus použitý detektorom je v skutočnosti závislý od implementácie.

Napríklad predvolený detektor pracuje najskôr s magickými bajtmi, potom s vlastnosťami metadát. Ak sa typ obsahu v tomto okamihu nenašiel, použije vyhľadávací modul služby na zistenie všetkých dostupných detektorov a ich následné vyskúšanie.

4.2. Detekcia jazyka

Okrem typu dokumentu dokáže Tika identifikovať aj jeho jazyk, a to aj bez pomoci metaúdajov.

V predchádzajúcich vydaniach Tiky bol jazyk dokumentu detekovaný pomocou a Identifikátor jazyka inštancia.

Avšak Identifikátor jazyka bola ukončená v prospech webových služieb, čo nie je v dokumentoch Začíname objasnené.

Služby detekcie jazykov sú teraz poskytované prostredníctvom podtypov abstraktnej triedy LanguageDetector. Pomocou webových služieb môžete tiež získať prístup k plnohodnotným online prekladateľským službám, ako sú Google Translate alebo Microsoft Translator.

Kvôli stručnosti sa týmito službami nebudeme podrobne zaoberať.

5. Tika v akcii

Táto časť ilustruje funkcie Apache Tika na pracovných príkladoch.

Metódy ilustrácie budú zabalené do triedy:

verejná trieda TikaAnalysis {// ilustračné metódy}

5.1. Zisťovanie typov dokumentov

Tu je kód, ktorý môžeme použiť na zistenie typu dokumentu načítaného z adresy InputStream:

public static String detectDocTypeUsingDetector (prúd InputStream) vyvolá IOException {detektor detektora = nový DefaultDetector (); Metadata metadata = new Metadata (); MediaType mediaType = detector.detect (stream, metadata); return mediaType.toString (); }

Predpokladajme, že máme pomenovaný súbor PDF tika.txt v triede. Prípona tohto súboru bola zmenená, aby sa pokúsil oklamať náš analytický nástroj. Skutočný typ dokumentu možno stále nájsť a potvrdiť testom:

@Test public void whenUsingDetector_thenDocumentTypeIsReturned () vyvolá IOException {InputStream stream = this.getClass (). GetClassLoader () .getResourceAsStream ("tika.txt"); Reťazec mediaType = TikaAnalysis.detectDocTypeUsingDetector (stream); assertEquals ("application / pdf", mediaType); stream.close (); }

Je zrejmé, že nesprávna prípona súboru nemôže Tike vďaka magickým bajtom zabrániť v nájdení správneho typu média % PDF na začiatku súboru.

Pre väčšie pohodlie môžeme detekčný kód znova zapísať pomocou znaku Tika trieda fasády s rovnakým výsledkom:

public static String detectDocTypeUsingFacade (prúd InputStream) vyvolá IOException {Tika tika = nová Tika (); Reťazec mediaType = tika.detect (stream); návrat mediaType; }

5.2. Extrahovanie obsahu

Poďme teraz extrahovať obsah súboru a vrátiť výsledok ako a String - pomocou Analyzátor API:

public static String extractContentUsingParser (prúd InputStream) vyvolá IOException, TikaException, SAXException {Parser parser = new AutoDetectParser (); Ovládač ContentHandler = nový BodyContentHandler (); Metadata metadata = new Metadata (); ParseContext context = nový ParseContext (); parser.parse (stream, handler, metadata, kontext); return handler.toString (); }

Získaný súbor programu Microsoft Word v triede s týmto obsahom:

Apache Tika - sada nástrojov na analýzu obsahu Sada nástrojov Apache Tika ™ detekuje a extrahuje metadáta a text ...

Obsah je možné extrahovať a overiť:

@Test public void whenUsingParser_thenContentIsReturned () vyvolá IOException, TikaException, SAXException {InputStream stream = this.getClass (). GetClassLoader () .getResourceAsStream ("tika.docx"); Obsah reťazca = TikaAnalysis.extractContentUsingParser (stream); assertThat (content, containsString ("Apache Tika - súprava nástrojov na analýzu obsahu")); assertThat (content, containsString ("zistí a extrahuje metadáta a text")); stream.close (); }

Opäť platí, že Tika triedy je možné použiť na pohodlnejšie písanie kódu:

public static String extractContentUsingFacade (prúd InputStream) vyvolá IOException, TikaException {Tika tika = nová Tika (); Obsah reťazca = tika.parseToString (stream); vrátiť obsah; }

5.3. Extrahovanie metadát

Okrem obsahu dokumentu: Analyzátor API môže tiež extrahovať metadáta:

public static Metadata extractMetadatatUsingParser (prúd StreamStream) hodí IOException, SAXException, TikaException {Parser parser = new AutoDetectParser (); Ovládač ContentHandler = nový BodyContentHandler (); Metadata metadata = new Metadata (); ParseContext context = nový ParseContext (); parser.parse (stream, handler, metadata, kontext); návratové metadáta; }

Ak v triede existuje súbor Microsoft Excel, tento testovací prípad potvrdí správnosť extrahovaných metadát:

@Test public void whenUsingParser_thenMetadataIsReturned () vyvolá 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 („používateľ Microsoft Office“, metadata.get („autor“)); stream.close (); }

Na záver je tu ďalšia verzia metódy extrakcie pomocou Tika trieda fasády:

public static Metadata extractMetadatatUsingFacade (prúd InputStream) hodí IOException, TikaException {Tika tika = nová Tika (); Metadata metadata = new Metadata (); tika.parse (stream, metadata); návratové metadáta; }

6. Záver

Tento výukový program bol zameraný na analýzu obsahu pomocou Apache Tika. Pomocou Analyzátor a Detektor Vďaka rozhraniam API dokážeme automaticky zistiť typ dokumentu, ako aj extrahovať jeho obsah a metadáta.

Pre pokročilé prípady použitia môžeme vytvoriť vlastné Analyzátor a Detektor triedy, aby mali väčšiu kontrolu nad procesom syntaktickej analýzy.

Kompletný zdrojový kód tohto tutoriálu nájdete na GitHub.