Analisis Kandungan dengan Apache Tika

1. Gambaran keseluruhan

Apache Tika adalah alat untuk mengekstrak kandungan dan metadata dari pelbagai jenis dokumen , seperti Word, Excel, dan PDF atau bahkan fail multimedia seperti JPEG dan MP4.

Semua fail berasaskan teks dan multimedia dapat diurai menggunakan antara muka yang sama, menjadikan Tika sebagai perpustakaan yang kuat dan serba boleh untuk analisis kandungan.

Dalam artikel ini, kami akan memberikan pengenalan kepada Apache Tika, termasuk API penghuraiannya dan bagaimana ia secara automatik mengesan jenis kandungan dokumen. Contoh kerja juga akan diberikan untuk menggambarkan operasi perpustakaan ini.

2. Bermula

Untuk menguraikan dokumen menggunakan Apache Tika, kami hanya memerlukan satu ketergantungan Maven:

 org.apache.tika tika-parsers 1.17 

Versi terbaru artifak ini boleh didapati di sini.

3. API Parser

The Parser API adalah hati Apache Tika, pengabstrakan lagi kerumitan operasi parsing . API ini bergantung pada satu kaedah:

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

Maksud parameter kaedah ini adalah:

  • aliran - yang InputStream contoh dicipta daripada dokumen yang hendak dihuraikan
  • pengendali - yang ContentHandler objek menerima urutan peristiwa-peristiwa XHTML SAX dihuraikan daripada dokumen input; pengendali ini kemudian akan memproses acara dan mengeksport hasilnya dalam bentuk tertentu
  • metadata - yang Metadata objek menyampaikan sifat metadata dalam dan di luar penghurai
  • konteks - yang ParseContext contoh membawa maklumat konteks tertentu, digunakan untuk menyesuaikan proses penghuraian yang

Yang menghuraikan kaedah melemparkan yang IOException jika ia gagal untuk membaca dari aliran input, yang TikaException jika dokumen yang diambil dari sungai itu tidak dapat dihuraikan dan SAXException jika pengendali tidak dapat memproses peristiwa.

Semasa menguraikan dokumen, Tika cuba menggunakan semula parser parser yang ada seperti Apache POI atau PDFBox sebanyak mungkin. Hasilnya, kebanyakan kelas pelaksanaan Parser hanyalah penyesuai perpustakaan luaran seperti itu.

Di bahagian 5, kita akan melihat bagaimana parameter pengendali dan metadata dapat digunakan untuk mengekstrak kandungan dan metadata dokumen.

Untuk kemudahan, kita boleh menggunakan kelas fasad Tika untuk mengakses fungsi API Parser .

4. Pengesanan Auto

Apache Tika secara automatik dapat mengesan jenis dokumen dan bahasanya berdasarkan dokumen itu sendiri dan bukannya berdasarkan maklumat tambahan.

4.1. Pengesanan Jenis Dokumen

Pengesanan jenis dokumen dapat dilakukan dengan menggunakan kelas pelaksanaan antara muka Detektor , yang mempunyai satu metode:

MediaType detect(java.io.InputStream input, Metadata metadata) throws IOException

Kaedah ini mengambil dokumen, dan metadata yang berkaitan - kemudian mengembalikan objek Jenis Media yang menerangkan tekaan terbaik mengenai jenis dokumen.

Metadata bukan satu-satunya sumber maklumat yang bergantung kepada pengesan. Pengesan juga dapat menggunakan byte sihir, yang merupakan corak khas pada awal fail atau mewakilkan proses pengesanan kepada pengesan yang lebih sesuai.

Sebenarnya, algoritma yang digunakan oleh pengesan bergantung kepada pelaksanaan.

Contohnya, pengesan lalai berfungsi dengan byte sihir terlebih dahulu, kemudian sifat metadata. Sekiranya jenis kandungan belum dijumpai pada ketika ini, ia akan menggunakan pemuat perkhidmatan untuk menemui semua pengesan yang ada dan mencuba secara bergilir.

4.2. Pengesanan Bahasa

Selain jenis dokumen, Tika juga dapat mengenal pasti bahasanya walaupun tanpa bantuan maklumat metadata.

Dalam siaran Tika sebelumnya, bahasa dokumen dikesan menggunakan contoh LanguageIdentifier .

Walau bagaimanapun, LanguageIdentifier tidak lagi digunakan untuk perkhidmatan web, yang tidak dijelaskan dalam dokumen Bermula.

Perkhidmatan pengesanan bahasa kini disediakan melalui subtipe LanguageDetector kelas abstrak . Dengan menggunakan perkhidmatan web, anda juga dapat mengakses perkhidmatan terjemahan dalam talian yang lengkap, seperti Google Translate atau Microsoft Translator.

Demi singkatnya, kami tidak akan membahas perkhidmatan tersebut secara terperinci.

5. Tika Beraksi

Bahagian ini menggambarkan ciri Apache Tika menggunakan contoh kerja.

Kaedah ilustrasi akan dibungkus dalam kelas:

public class TikaAnalysis { // illustration methods }

5.1. Mengesan Jenis Dokumen

Inilah kod yang dapat kita gunakan untuk mengesan jenis dokumen yang dibaca dari InputStream :

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

Andaikan kita mempunyai fail PDF bernama tika.txt di classpath. Sambungan fail ini telah diubah untuk mencuba alat analisis kami. Jenis dokumen yang sebenar masih boleh dijumpai dan disahkan dengan ujian:

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

Sudah jelas bahawa sambungan fail yang salah tidak dapat menahan Tika daripada mencari jenis media yang betul, berkat % PDF byte ajaib pada awal fail.

Untuk kemudahan, kami dapat menulis semula kod pengesanan menggunakan kelas fasad Tika dengan hasil yang sama:

public static String detectDocTypeUsingFacade(InputStream stream) throws IOException { Tika tika = new Tika(); String mediaType = tika.detect(stream); return mediaType; }

5.2. Mengekstrak Kandungan

Let's now extract the content of a file and return the result as a String – using the Parser API:

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

Given a Microsoft Word file in the classpath with this content:

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

The content can be extracted and verified:

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

Again, the Tika class can be used to write the code more conveniently:

public static String extractContentUsingFacade(InputStream stream) throws IOException, TikaException { Tika tika = new Tika(); String content = tika.parseToString(stream); return content; }

5.3. Extracting Metadata

In addition to the content of a document, the Parser API can also extract metadata:

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

When a Microsoft Excel file exists in the classpath, this test case confirms that the extracted metadata is correct:

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

Finally, here's another version of the extraction method using the Tika facade class:

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

Tutorial ini memfokuskan pada analisis kandungan dengan Apache Tika. Dengan menggunakan API Parser dan Detector , kita dapat mengesan jenis dokumen secara automatik, serta mengekstrak kandungan dan metadata .

Untuk kes penggunaan lanjutan, kita dapat membuat kelas Parser dan Detector tersuai untuk mempunyai lebih banyak kawalan terhadap proses penghuraian.

Kod sumber lengkap untuk tutorial ini boleh didapati di GitHub.