Analiza sadržaja s Apache Tika

1. Pregled

Apache Tika je set alata za izdvajanje sadržaja i metapodataka iz različitih vrsta dokumenata, kao što su Word, Excel i PDF ili čak multimedijske datoteke poput JPEG i MP4.

Sve tekstualne i multimedijske datoteke mogu se raščlaniti pomoću zajedničkog sučelja, što Tiku čini moćnom i svestranom knjižnicom za analizu sadržaja.

U ovom ćemo članku dati uvod u Apache Tika, uključujući njegov API za raščlanjivanje i kako automatski otkriva vrstu sadržaja dokumenta. Također će se pružiti radni primjeri koji ilustriraju rad ove knjižnice.

2. Početak rada

Da bismo raščlanili dokumente pomoću Apache Tika, potrebna nam je samo jedna ovisnost o Mavenu:

 org.apache.tika tika-parseri 1.17 

Najnoviju verziju ovog artefakta možete pronaći ovdje.

3. The Raščlanjivač API

The Raščlanjivač API je srce Apache Tike, apstrahirajući složenost operacija raščlanjivanja. Ovaj se API oslanja na jednu metodu:

void parse (InputStream stream, Handler ContentHandler, metapodaci metapodataka, kontekst ParseContext) baca IOException, SAXException, TikaException

Značenja parametara ove metode su:

  • potok an InputStream instanca stvorena iz dokumenta za raščlanjivanje
  • rukovatelj a ContentHandler objekt koji prima sekvencu XHTML SAX događaja raščlanjenih iz ulaznog dokumenta; ovaj će rukovatelj zatim obraditi događaje i izvesti rezultat u određenom obliku
  • metapodaci a Metapodaci objekt koji prenosi svojstva metapodataka u i izvan parsera
  • kontekst a ParseContext instanca koja sadrži informacije specifične za kontekst, a koristi se za prilagodbu postupka raščlanjivanja

The raščlaniti metoda baca an IOException ako ne uspije čitati iz ulaznog toka, a TikaException ako se dokument preuzet iz streama ne može raščlaniti i a SAXException ako voditelj nije u mogućnosti obraditi događaj.

Prilikom raščlanjivanja dokumenta, Tika pokušava što je više moguće upotrijebiti postojeće knjižnice raščlanjivača, poput Apache POI ili PDFBox. Kao rezultat toga, većina Raščlanjivač klase implementacije samo su adapteri za takve vanjske knjižnice.

U odjeljku 5 vidjet ćemo kako rukovatelj i metapodaci parametri se mogu koristiti za izdvajanje sadržaja i metapodataka dokumenta.

Radi praktičnosti možemo koristiti klasu fasade Tika za pristup funkcionalnosti Raščlanjivač API.

4. Automatsko otkrivanje

Apache Tika može automatski otkriti vrstu dokumenta i njegov jezik na temelju samog dokumenta, a ne na dodatnim informacijama.

4.1. Otkrivanje vrste dokumenta

Otkrivanje vrsta dokumenata može se izvršiti pomoću izvedbene klase Detektor sučelje, koji ima jednu metodu:

Otkrivanje MediaType-a (java.io.InputStream input, metapodaci metapodataka) baca IOException

Ova metoda uzima dokument i povezane metapodatke - a zatim vraća a Vrsta medija objekt koji opisuje najbolju pretpostavku u pogledu vrste dokumenta.

Metapodaci nisu jedini izvor informacija na koje se detektor oslanja. Detektor također može koristiti magične bajtove, koji su poseban uzorak na početku datoteke, ili prenijeti postupak otkrivanja na prikladniji detektor.

Zapravo, algoritam koji koristi detektor ovisi o implementaciji.

Na primjer, zadani detektor prvo radi s magičnim bajtovima, a zatim svojstvima metapodataka. Ako vrsta sadržaja u ovom trenutku nije pronađena, upotrijebit će uslužni učitavač kako bi otkrio sve dostupne detektore i isprobao ih zauzvrat.

4.2. Otkrivanje jezika

Pored vrste dokumenta, Tika također može identificirati svoj jezik čak i bez pomoći podataka o metapodacima.

U prethodnim izdanjima Tike jezik dokumenta otkriva se pomoću a Identifikator jezika primjer.

Međutim, Identifikator jezika je zastario u korist web usluga, što nije jasno navedeno u dokumentima Prvi koraci.

Usluge otkrivanja jezika sada se pružaju podtipovima apstraktne klase LanguageDetector. Korištenjem web usluga možete pristupiti i punopravnim mrežnim uslugama prevođenja, kao što su Google Translate ili Microsoft Translator.

Radi kratkoće, nećemo detaljno pregledavati te usluge.

5. Tika u akciji

Ovaj odjeljak ilustrira značajke Apache Tika koristeći radne primjere.

Metode ilustracije bit će umotane u razred:

javni razred TikaAnalysis {// metode ilustracije}

5.1. Otkrivanje vrsta dokumenata

Evo koda koji možemo koristiti za otkrivanje vrste dokumenta koji se čita iz InputStream:

javni statički niz detectDocTypeUsingDetector (InputStream stream) baca IOException {Detector detector = new DefaultDetector (); Metapodaci metapodaci = novi metapodaci (); MediaType mediaType = detector.detect (tok, metapodaci); vratiti mediaType.toString (); }

Pretpostavimo da imamo PDF datoteku s imenom tika.txt u razrednoj stazi. Proširenje ove datoteke promijenjeno je kako bi se pokušalo zavarati naš alat za analizu. Stvarnu vrstu dokumenta još uvijek možemo pronaći i potvrditi testom:

@Test public void whenUsingDetector_thenDocumentTypeIsReturned () baca IOException {InputStream stream = this.getClass (). GetClassLoader () .getResourceAsStream ("tika.txt"); String mediaType = TikaAnalysis.detectDocTypeUsingDetector (tok); assertEquals ("aplikacija / pdf", vrsta medija); stream.close (); }

Jasno je da pogrešan nastavak datoteke ne može spriječiti Tiku da pronađe ispravnu vrstu medija zahvaljujući čarobnim bajtovima % PDF na početku datoteke.

Radi praktičnosti možemo ponovno napisati kod za otkrivanje pomoću Tika klasa fasade s istim rezultatom:

javni statički niz detectDocTypeUsingFacade (InputStream stream) baca IOException {Tika tika = new Tika (); Niz medijaType = tika.detect (stream); return mediaType; }

5.2. Izdvajanje sadržaja

Izdvojimo sad sadržaj datoteke i vratimo rezultat kao Niz - koristiti Raščlanjivač API:

javni statički niz extractContentUsingParser (InputStream stream) baca IOException, TikaException, SAXException {Parser parser = new AutoDetectParser (); Obrađivač ContentHandler = novi BodyContentHandler (); Metapodaci metapodaci = novi metapodaci (); Kontekst ParseContext = novi ParseContext (); parser.parse (tok, rukovatelj, metapodaci, kontekst); return handler.toString (); }

S obzirom na datoteku Microsoft Word u stazi s ovim sadržajem:

Apache Tika - alat za analizu sadržaja Apache Tika ™ alat otkriva i izdvaja metapodatke i tekst ...

Sadržaj se može izdvojiti i provjeriti:

@Test public void whenUsingParser_thenContentIsReturned () baca IOException, TikaException, SAXException {InputStream stream = this.getClass (). GetClassLoader () .getResourceAsStream ("tika.docx"); Sadržaj niza = TikaAnalysis.extractContentUsingParser (stream); assertThat (content, containsString ("Apache Tika - alat za analizu sadržaja")); assertThat (content, containsString ("otkriva i izdvaja metapodatke i tekst")); stream.close (); }

Opet, Tika klasa se može koristiti za jednostavnije pisanje koda:

public static String extractContentUsingFacade (InputStream stream) baca IOException, TikaException {Tika tika = new Tika (); Sadržaj niza = tika.parseToString (stream); vratiti sadržaj; }

5.3. Izdvajanje metapodataka

Uz sadržaj dokumenta, Raščlanjivač API također može izdvojiti metapodatke:

javni statični metapodaci extractMetadatatUsingParser (InputStream stream) baca IOException, SAXException, TikaException {Parser parser = new AutoDetectParser (); Obrađivač ContentHandler = novi BodyContentHandler (); Metapodaci metapodaci = novi metapodaci (); Kontekst ParseContext = novi ParseContext (); parser.parse (tok, rukovatelj, metapodaci, kontekst); povratni metapodaci; }

Kada datoteka Microsoft Excel postoji u putu predavanja, ovaj testni slučaj potvrđuje da su izvađeni metapodaci točni:

@Test public void whenUsingParser_thenMetadataIsReturned () baca IOException, TikaException, SAXException {InputStream stream = this.getClass (). GetClassLoader () .getResourceAsStream ("tika.xlsx";; Metapodaci metapodaci = TikaAnalysis.extractMetadatatUsingParser (stream); assertEquals ("org.apache.tika.parser.DefaultParser", metadata.get ("X-Parsed-By")); assertEquals ("Korisnik Microsoft Officea", metadata.get ("Autor")); stream.close (); }

Na kraju, evo još jedne verzije metode ekstrakcije pomoću Tika klasa fasade:

javni static static Metadata extractMetadatatUsingFacade (InputStream stream) baca IOException, TikaException {Tika tika = new Tika (); Metapodaci metapodaci = novi metapodaci (); tika.parse (tok, metapodaci); povratni metapodaci; }

6. Zaključak

Ovaj se vodič usredotočio na analizu sadržaja s Apacheom Tika. Koristiti Raščlanjivač i Detektor API-ji možemo automatski otkriti vrstu dokumenta, kao i izdvojiti njegov sadržaj i metapodatke.

Za slučajeve napredne upotrebe možemo stvoriti prilagođene Raščlanjivač i Detektor klase kako bi imali veću kontrolu nad postupkom raščlanjivanja.

Kompletni izvorni kôd za ovu lekciju možete pronaći na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found