Apache Tika

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 19:03, 17 января 2019.
Apache Tika
Tika.png
Разработчики: The Apache Software Foundation
Выпущена: 2007; 13 years ago (2007)
Постоянный выпуск: 1.19.1 / 9 October 2018 года; 21 months ago (2018-10-09)
Написана на: Java
Платформа: кроссплатформенное ПО
Тип ПО: фрэймворк для работы с информацией
Веб-сайт tika.apache.org

Apache Tika - это кроссплатформенный набор инструментов, написанный на Java для предварительной обработки и анализа текстовой информации - выделения мета-данных, извлечения текста из разнообразных форматов файлов, автоматического определения языка текста и т.д.

Описание

Apache Tika - библиотека предназначенная для определения, извлечения данных и метаданных из различных типов файлов в простой текстовый формат plan text, для последующего анализа содержимого файла и принятия решения что же с ним(файлом) далее делать. Очень часто tika используется как парсер текста файла, и извлеченные данные передаются для дальнейшего анализа поисковым движкам которые в свою очередь индексируют файл и его содержимое.

Все текстовые и мультимедийные файлы можно анализировать с помощью общего интерфейса, что делает Tika мощной и универсальной библиотекой для анализа контента.[Источник 1]

Parser API

Parser API - это сердце Apache Tika, абстрагирующееся от сложности операций разбора. Этот API опирается на один метод:

1 void parse(
2   InputStream stream, 
3   ContentHandler handler, 
4   Metadata metadata, 
5   ParseContext context) 
6   throws IOException, SAXException, TikaException

Значения параметров этого метода:

  • stream - экземпляр InputStream, созданный из документа для анализа;
  • обработчик - объект ContentHandler, получающий последовательность событий SAX XHTML, проанализированных из входного документа; этот обработчик будет затем обрабатывать события и экспортировать результат в определенной форме;
  • метаданные - объект метаданных, передающий свойства метаданных в синтаксический анализатор и из него;
  • context - экземпляр ParseContext, несущий специфическую для контекста информацию, используемую для настройки процесса анализа.

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

При анализе документа Tika старается максимально использовать существующие библиотеки синтаксического анализатора, такие как Apache POI или PDFBox. В результате большинство классов реализации Parser являются просто адаптерами для таких внешних библиотек.

Авто распознование

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

Определение типа документа

Обнаружение типов документов может быть выполнено с использованием класса реализации интерфейса Detector, который имеет единственный метод:

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

Этот метод принимает документ и связанные с ним метаданные, а затем возвращает объект MediaType, описывающий наилучшее предположение относительно типа документа.

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

Фактически алгоритм, используемый детектором, зависит от реализации.

Например, детектор по умолчанию работает сначала с магическими байтами, а затем со свойствами метаданных. Если на данный момент тип контента не был найден, он использует загрузчик служб, чтобы обнаружить все доступные детекторы и попробовать их по очереди.

Определение языа документа

В дополнение к типу документа, Tika также может идентифицировать свой язык даже без помощи метаданных.

В предыдущих выпусках Tika язык документа определялся с помощью экземпляра LanguageIdentifier.

Однако LanguageIdentifier устарел в пользу веб-сервисов, что не указано в документах «Приступая к работе».

Сервисы обнаружения языков теперь предоставляются через подтипы абстрактного класса LanguageDetector. Используя веб-службы, вы также можете получить доступ к полноценным службам онлайн-перевода, таким как Google Translate или Microsoft Translator.[Источник 2]

Использование класса MapReduce

Классы MapReduce, используемые для анализа небольших файлов

Обычно MapReduce работает с большими файлами, хранящимися в HDFS. При записи в HDFS файлы разбиваются на меньшие по размеру фрагменты (блоки) в соответствии с конфигурацией кластера Hadoop. Блоки размещаются в этой распределенной файловой системе. Но если необходима эффективная обработка значительного количества небольших файлов (в особенности бинарных файлов, таких как PDF или RTF) с использованием Hadoop, то есть несколько вариантов.

Во многих случаях можно объединить небольшие файлы в большой файл путем создания файла последовательности (sequence file), который является собственным форматом хранения в Hadoop. Однако создание файлов последовательности в одном потоке может быть узким местом, и вы рискуете потерять исходные файлы. В этой статье предлагается другой способ для применения нескольких классов Java, используемых в MapReduce. Традиционные классы требуют, чтобы каждому конкретному файлу был назначен отдельный экземпляр Mapper. Но такой процесс неэффективен в случае множества небольших файлов.

В качестве альтернативы традиционным классам возможна обработка небольших файлов в Hadoop путем создания набора специальных классов для уведомления задачи о том, что файлы достаточно небольшие, чтобы обращаться с ними не в рамках традиционного подхода.

На этапе распределения определяются логические контейнеры, называемые сплитами (split), и над каждым сплитом выполняется задача обработки map. Используйте специальные классы для определения сплита фиксированного размера, который заполняется таким количеством небольших файлов, сколько способен вместить. Когда сплит заполнен, задание создает новый сплит и заполняет его. Затем каждый сплит назначается одному экземпляру Mapper.

Классы MapReduce для чтения файлов

Для определения сплитов и чтения данных в ходе выполнении задания MapReduce используются три основных Java-класса MapReduce — InputSplit, InputFormat и RecordReader.

При передаче файла из локальной файловой системы в HDFS он преобразуется в блоки размером 128 МБ. (Это значение по умолчанию можно изменить в InfoSphere BigInsights.) Рассмотрим файл, являющийся достаточно большим, чтобы использовать 10 блоков. Когда этот файл считывается из HDFS как входные данные для задания MapReduce, эти блоки обычно распределяются, один за другим, в сплиты. В этом случае файл делится на 10 сплитов (для которых требуется 10 задач map) для дальнейшей обработки. По умолчанию размер блока и размер сплита равны, но эти размеры зависят от конфигурационных настроек для класса InputSplit.

С точки зрения Java-программирования класс, который несет ответственность за такое преобразование, называется InputFormat и является главной точкой входа для чтения данных из HDFS. Из блоков файлов он создает список объектов InputSplits. Для каждого сплита создается один экземпляр Mapper. Затем каждый объект InputSplit разделяется на записи с использованием класса RecordReader. Каждая запись представляет собой пару ключ-значение.

Классы MapReduce, используемые для записи файлов

Текстовое содержимое документов необходимо сохранить в файлы, которые могут быть легко обработаны в Hadoop. Можно использовать файлы последовательности, но в данном примере мы создадим текстовые файлы с разделителями, в которых содержимое каждого файла хранится в виде записи. Такой метод обеспечивает простое считывание содержимого и его простое использование в заданиях MapReduce далее в потоке. Для записи файлов MapReduce используются Java-классы OutputFormat и RecordWriter. Эти классы подобны классам InputFormat и RecordReader, но используются для вывода. Класс FileOutputFormat реализует OutputFormat. Он содержит путь для выходных файлов, а также инструкции по выполнению задания записи.

RecordWriter, который создается в классе OutputFormat, определяет метод, в соответствии с которым каждая запись, передаваемая от экземпляров Mapper, будет записываться по выходному пути.

Реализация специальных классов MapReduce

При использовании традиционных методик MapReduce выполнение некоторых заданий займет относительно много времени, просто потому, что необходимо ввести множество небольших файлов. Кроме того, MapReduce не поддерживает чтение формата PDF. Помимо этих ограничений, для сохранения множества небольших файлов в распределенной файловой системе Hadoop могут потребоваться значительные объемы памяти на узле NameNode. Для каждого миллиона файлов или блоков необходимо около 1 ГБ памяти. Поэтому файлы, размер которых меньше размера блока, неэффективно обрабатываются с использованием традиционных методик MapReduce. Более эффективной является разработка программы, которая:

  • оптимизирована для работы со значительным количеством небольших файлов
  • позволяет читать бинарные файлы
  • генерирует меньшее количество файлов большего размера.

Более эффективным подходом является использование Apache Tika для чтения текста в любом поддерживаемом формате документов путем создания класса TikaInputFormat для чтения и обработки небольших файлов при выполнении задачи MapReduce, и затем использование класса TikaOutputFormat для вывода результатов. Используйте классы InputFormat, RecordReader и RecordWriter для создания такого решения. Целью является чтение множества небольших файлов в формате PDF и генерирование выходных данных в формате с разделителями.[Источник 3]

Источники

  1. Автоматический определь языка в Apache Tika Proiot. Дата обновления: 21.12.2018. URL: http://proiot.ru/blog/posts/2013/01/21/avtomaticheskii-opredel-iazyka-v-apache-tika/ (дата обращения: 28.12.2018)
  2. Content Analysis with Apache Tika Baeldung. Дата обновления: 12.08.2018. URL: https://www.baeldung.com/apache-tika (дата обращения: 28.12.2018)
  3. Обработка и анализ содержимого документов разных типов с использованием MapReduce IBM. Дата обновления: 27.05.2018. URL: https://www.ibm.com/developerworks/ru/library/ba-mapreduce-biginsights-analysis/ (дата обращения: 28.12.2018)