Analisis Konten dengan Apache Tika

1. Ikhtisar

Apache Tika adalah toolkit untuk mengekstrak konten dan metadata dari berbagai jenis dokumen , seperti Word, Excel, dan PDF atau bahkan file multimedia seperti JPEG dan MP4.

Semua file berbasis teks dan multimedia dapat diurai menggunakan antarmuka umum, menjadikan Tika pustaka yang kuat dan serbaguna untuk analisis konten.

Di artikel ini, kami akan memberikan pengantar tentang Apache Tika, termasuk API parsingnya dan cara mendeteksi tipe konten dokumen secara otomatis. Contoh kerja juga akan disediakan untuk menggambarkan operasi pustaka ini.

2. Memulai

Untuk mengurai dokumen menggunakan Apache Tika, kita hanya memerlukan satu dependensi Maven:

 org.apache.tika tika-parsers 1.17 

Versi terbaru artefak ini dapat ditemukan di sini.

3. API Parser

The Parser API adalah jantung dari Apache Tika, abstrak pergi kompleksitas operasi parsing . API ini bergantung pada satu metode:

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

Arti dari parameter metode ini adalah:

  • stream - sebuah instance InputStream dibuat dari dokumen yang akan diurai
  • handler - sebuah ContentHandler objek menerima urutan peristiwa XHTML SAX diurai dari dokumen masukan; penangan ini kemudian akan memproses kejadian dan mengekspor hasilnya dalam bentuk tertentu
  • metadata - sebuah Metadata objek menyampaikan sifat metadata dalam dan keluar dari parser
  • konteks - sebuah ParseContext misalnya membawa informasi konteks khusus, digunakan untuk menyesuaikan proses parsing

The mengurai metode melempar IOException jika gagal untuk membaca dari input stream, sebuah TikaException jika dokumen yang diambil dari sungai tidak bisa diurai dan SAXException jika pawang tidak dapat memproses sebuah acara.

Saat mem-parsing dokumen, Tika mencoba menggunakan kembali library parser yang ada seperti Apache POI atau PDFBox sebanyak mungkin. Akibatnya, sebagian besar kelas implementasi Parser hanyalah adaptor untuk pustaka eksternal tersebut.

Di bagian 5, kita akan melihat bagaimana handler dan parameter metadata dapat digunakan untuk mengekstrak konten dan metadata dari sebuah dokumen.

Untuk kenyamanan, kita dapat menggunakan kelas fasad Tika untuk mengakses fungsionalitas API Parser .

4. Deteksi Otomatis

Apache Tika dapat secara otomatis mendeteksi jenis dokumen dan bahasanya berdasarkan dokumen itu sendiri daripada informasi tambahan.

4.1. Deteksi Jenis Dokumen

Pendeteksian jenis dokumen dapat dilakukan dengan menggunakan kelas implementasi antarmuka Detektor , yang memiliki satu metode:

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

Metode ini mengambil dokumen, dan metadata yang terkait - kemudian mengembalikan objek MediaType yang mendeskripsikan tebakan terbaik terkait jenis dokumen tersebut.

Metadata bukan satu-satunya sumber informasi yang diandalkan oleh detektor. Detektor juga dapat menggunakan byte ajaib, yang merupakan pola khusus di dekat permulaan file atau mendelegasikan proses deteksi ke detektor yang lebih sesuai.

Faktanya, algoritma yang digunakan oleh detektor bergantung pada implementasi.

Misalnya, detektor default berfungsi dengan byte ajaib terlebih dahulu, kemudian properti metadata. Jika jenis konten belum ditemukan pada saat ini, ia akan menggunakan service loader untuk menemukan semua detektor yang tersedia dan mencobanya secara bergantian.

4.2. Deteksi Bahasa

Selain jenis dokumen, Tika juga dapat mengidentifikasi bahasanya meski tanpa bantuan informasi metadata.

Dalam rilis Tika sebelumnya, bahasa dokumen dideteksi menggunakan instance LanguageIdentifier .

Namun, LanguageIdentifier sudah tidak digunakan lagi karena mendukung layanan web, yang tidak dijelaskan dalam dokumen Memulai.

Layanan deteksi bahasa sekarang disediakan melalui subtipe dari kelas abstrak LanguageDetector . Dengan menggunakan layanan web, Anda juga dapat mengakses layanan terjemahan online yang lengkap, seperti Google Translate atau Microsoft Translator.

Demi singkatnya, kami tidak akan membahas layanan tersebut secara detail.

5. Tika Beraksi

Bagian ini mengilustrasikan fitur Apache Tika menggunakan contoh yang berfungsi.

Metode ilustrasi akan dibungkus dalam kelas:

public class TikaAnalysis { // illustration methods }

5.1. Mendeteksi Jenis Dokumen

Berikut kode yang dapat kita gunakan untuk mendeteksi 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(); }

Asumsikan kita memiliki file PDF bernama tika.txt di classpath. Ekstensi file ini telah diubah untuk mencoba mengelabui alat analisis kami. Jenis dokumen yang sebenarnya masih dapat ditemukan dan dikonfirmasi dengan tes:

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

Jelas bahwa ekstensi file yang salah tidak dapat menghalangi Tika untuk menemukan jenis media yang benar, berkat magic byte % PDF di awal file.

Untuk kenyamanan, kita bisa menulis ulang kode deteksi 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 Konten

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 berfokus pada analisis konten dengan Apache Tika. Dengan menggunakan Parser and Detector APIs, kita dapat secara otomatis mendeteksi jenis dokumen, serta mengekstrak konten dan metadatanya .

Untuk kasus penggunaan lanjutan, kita dapat membuat kelas Parser dan Detektor khusus agar memiliki kontrol lebih besar atas proses penguraian.

Kode sumber lengkap untuk tutorial ini dapat ditemukan di GitHub.