Анализ на съдържанието с Apache Tika

1. Общ преглед

Apache Tika е набор от инструменти за извличане на съдържание и метаданни от различни видове документи , като Word, Excel и PDF или дори мултимедийни файлове като JPEG и MP4.

Всички текстови и мултимедийни файлове могат да бъдат анализирани с помощта на общ интерфейс, което прави Tika мощна и гъвкава библиотека за анализ на съдържанието.

В тази статия ще дадем въведение в Apache Tika, включително неговия API за разбор и как той автоматично открива типа съдържание на документ. Ще бъдат предоставени и работни примери, които илюстрират работата на тази библиотека.

2. Първи стъпки

За да анализираме документи с помощта на Apache Tika, ни е необходима само една зависимост на Maven:

 org.apache.tika tika-parsers 1.17 

Най-новата версия на този артефакт може да бъде намерена тук.

3. API на Parser

Най- синтактичен анализ API е сърцето на Apache Тика, абстрахиране далеч от сложността на операциите по разбор . Този API разчита на един метод:

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

Значенията на параметрите на този метод са:

  • поток - една InputStream модел, създаден от документа за разпознаване
  • манипулатор - на ContentHandler обект получаване на последователност от XHTML SAX събития анализирани от документа за въвеждане; след това този манипулатор ще обработи събития и ще експортира резултата в определена форма
  • метаданни - с метаданни обект предаване на метаданни имоти в и извън анализатор
  • context - екземпляр на ParseContext, съдържащ специфична за контекста информация, използвана за персонализиране на процеса на синтактичен анализ

Методът за разбор хвърля IOException, ако не успее да прочете от входния поток, TikaException, ако документът, взет от потока, не може да бъде анализиран и SAXException, ако манипулаторът не може да обработи събитие.

Когато анализира документ, Tika се опитва да използва повторно съществуващите библиотеки на парсер като Apache POI или PDFBox колкото е възможно повече. В резултат на това повечето от класовете за изпълнение на Parser са само адаптери към такива външни библиотеки.

В раздел 5 ще видим как параметрите на манипулатора и метаданните могат да се използват за извличане на съдържание и метаданни на документ.

За удобство можем да използваме фасаден клас Tika за достъп до функционалността на API на Parser .

4. Автоматично откриване

Apache Tika може автоматично да открива вида на документа и неговия език въз основа на самия документ, а не на допълнителна информация.

4.1. Откриване на тип документ

Откриването на типове документи може да се извърши с помощта на клас на изпълнение на интерфейса на детектора , който има един метод:

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

Този метод взема документ и свързаните с него метаданни - след това връща обект MediaType, описващ най-доброто предположение относно типа на документа.

Метаданните не са единственият източник на информация, на който разчита детектор. Детекторът може също да използва магически байтове, които са специален модел в началото на файла или да делегират процеса на откриване на по-подходящ детектор.

Всъщност алгоритъмът, използван от детектора, зависи от изпълнението.

Например, детекторът по подразбиране работи първо с магически байтове, след това свойства на метаданни. Ако към този момент типът съдържание не е намерен, той ще използва инструмента за зареждане на услуги, за да открие всички налични детектори и да ги опита на свой ред.

4.2. Откриване на език

В допълнение към вида на документа, Tika може да идентифицира и неговия език дори без помощ от информация за метаданни.

В предишните версии на Tika езикът на документа се открива с помощта на екземпляр на LanguageIdentifier .

Въпреки това, LanguageIdentifier вече не се използва в полза на уеб услуги, които не е ясно в началното Документи.

Услугите за откриване на език вече се предоставят чрез подтипове на абстрактния клас LanguageDetector . Използвайки уеб услуги, можете също да получите достъп до пълноценни онлайн услуги за превод, като Google Translate или Microsoft Translator.

За краткост няма да разглеждаме подробно тези услуги.

5. Тика в действие

Този раздел илюстрира функциите на Apache Tika, като използва работни примери.

Методите за илюстрация ще бъдат опаковани в клас:

public class TikaAnalysis { // illustration methods }

5.1. Откриване на типове документи

Ето кода, който можем да използваме за откриване на типа документ, прочетен от 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(); }

Да приемем, че имаме PDF файл с име tika.txt в пътя на класа. Разширението на този файл е променено, за да се опита да подведе нашия инструмент за анализ. Реалният тип на документа все още може да бъде намерен и потвърден чрез тест:

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

Ясно е, че грешното разширение на файла не може да попречи на Tika да намери правилния тип носител, благодарение на магическите байтове % PDF в началото на файла.

За удобство можем да пренапишем кода за откриване, като използваме фасаден клас Tika със същия резултат:

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

5.2. Извличане на съдържание

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

Този урок се фокусира върху анализ на съдържанието с Apache Tika. Използвайки приложните програмни интерфейси (API) за парсер и детектор , ние можем автоматично да откриваме вида на документа, както и да извличаме съдържанието и метаданните му .

За случаи на напреднала употреба можем да създадем персонализирани класове за анализатор и детектор , за да имаме по-голям контрол върху процеса на анализиране.

Пълният изходен код за този урок може да бъде намерен в GitHub.