РАЗРАБОТКА DSL ДЛЯ БЫСТРОГО ПРОТОТИПИРОВАНИЯ ПРИЛОЖЕНИЙ АНАЛИЗА ТЕКСТОВ НА ПЛАТФОРМЕ APACHE UIMA
|
ВВЕДЕНИЕ 3
Актуальность проблемы 4
1. Постановка задачи 7
1.1. Обзор существующих решений 7
1.1.1. GATE 7
1.1.2. NLTK 8
1.1.3. DKPro Core 9
1.1.4. Bluima 12
1.2. Коротко о UIMA 14
1.3. Структура CAS 16
2. Разработка 19
2.1. Используемые технологии 19
2.1.1. Язык программирования Scala 19
2.1.2. Библиотека Scalaz-stream 20
2.1.3. Плагин Scalamacros-paradise 21
2.2. Архитектура 22
2.2.1. Генерация XML-дескриптора системы типов 22
2.2.2. Представление конвейера 25
2.2.3. Программная реализация 27
3. Оценка эффективности 29
ЗАКЛЮЧЕНИЕ 31
Рекомендации к дальнейшему улучшению приложения 31
Рекомендации ко внедрению 32
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
Актуальность проблемы 4
1. Постановка задачи 7
1.1. Обзор существующих решений 7
1.1.1. GATE 7
1.1.2. NLTK 8
1.1.3. DKPro Core 9
1.1.4. Bluima 12
1.2. Коротко о UIMA 14
1.3. Структура CAS 16
2. Разработка 19
2.1. Используемые технологии 19
2.1.1. Язык программирования Scala 19
2.1.2. Библиотека Scalaz-stream 20
2.1.3. Плагин Scalamacros-paradise 21
2.2. Архитектура 22
2.2.1. Генерация XML-дескриптора системы типов 22
2.2.2. Представление конвейера 25
2.2.3. Программная реализация 27
3. Оценка эффективности 29
ЗАКЛЮЧЕНИЕ 31
Рекомендации к дальнейшему улучшению приложения 31
Рекомендации ко внедрению 32
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
В настоящее время существует огромное количество программных библиотек для автоматической обработки текстовых данных - распространяемых как по коммерческой лицензии, так и находящихся в свободном доступе. Эти программные средства охватывают широкий круг задач: машинный перевод, автоматическое реферирование, создание баз знаний, разметка корпусов текстов, поиск информации и др. Их эффективность для некоторых задач впечатляет, особенно если каким-либо образом задействовано мнение пользователей (например, на определенных поисковых сайтах).
Важное место занимают расширяемые системы, предназначенные для обработки произвольных видов данных, которые могут гибко настраиваться пользователем. Наиболее популярные из них - это GATE, NLTK и Apache UIMA.
UIMA - одна из наиболее зрелых программных платформ для реализации индустриальных решений в области текстовой аналитики, разработанная IBM и ASF. Аббревиатура UIMA - это сокращение от Unstructured Information Management Architecture (архитектура управления неструктурированной информацией). Данная библиотека является программной реализацией фреймворка для анализа неструктурированного контента, такого как текст, видео- и аудио- данные. Неструктурированная информация на данный момент является самым крупным, наиболее актуальным и быстрорастущим источником информации, который доступен для предприятий и правительства.
Мотивация к созданию такой системы заключалась в создании общей платформы для неструктурированных данных, чтобы способствовать повторному использованию компонентов анализа и уменьшения дублирования в разработке анализаторов. Подключаемая архитектура UIMA позволяет легко подключить собственные компоненты анализа и объединить их вместе с другими. Задача полного анализа (с использованием неструктурированных данных), как например, задача поиска, является не монолитной задачей, а многоступенчатым процессом, в котором различные модули должны опираться друг на друга, чтобы получить мощную цепочку анализа. В некоторых случаях аннотаторы от разных разработчиков должны работать вместе, чтобы произвести необходимые результаты. С применением UIMA нет необходимости знать детали того, как разные аннотаторы работают в сборе. Библиотека UIMA берет на себя заботу за интеграцию и взаимодействие нескольких аннотаторов между собой.
Таким образом, основная цель UIMA заключается в преобразовании неструктурированной информации в структурированный вид, путем организации механизмов анализа, для выявления сущностей или отношений, и тем самым позволяя построить мост между неструктурированным и структурированным мирами.
Актуальность проблемы
Библиотека Apache UIMA предоставляет огромные возможности для организации эффективной обработки больших объемов неструктурированных данных. Однако создание и развертывание такой высокопроизводительной системы, а также последующая поддержка и конфигурирование для удовлетворения различных функциональных и нефункциональных требований к такому программному продукту требует глубокого понимания процессов, происходящих внутри фреймворка Apache UIMA. Более того, даже при разработке сравнительно небольшого приложения для обработки текстов на естественном языке с помощью этой библиотеки, разработчик сталкивается с проблемой поддержки множества ХМЬ-файлов[2]. Для иллюстрации этой проблемы, рассмотрим примитивное приложение, предназначенное для разбиения текста на предложения. Ниже приведен список действий, который должен выполнить разработчик для реализации данной задачи, следуя традиционному подходу:
1. Написать XML-дескриптор, описывающий систему типов для конкретной задачи (в данном случае - класс Sentence).
2. Запустить утилиту JCasGen (входит в состав UIMA) для генерации Java-классов из дескриптора системы типов.
3. Реализовать анализатор для выделения предложений в тексте.
4. Написать XML-дескриптор, описывающий созданный анализатор.
5. Реализовать CAS Consumer для обеспечения требуемого вывода полученных результатов.
6. Написать еще один XML-дескриптор, который описывает этот CAS Consumer.
7. Написать XML-дескриптор для компоненты, которая бы считывала входные данные (Collection Reader).
8. Написать XML-дескриптор, описывающий конвейер (pipeline), состоящий из предыдущих модулей.
9. И, наконец, вызвать Collection Processing Manager, передав в него дескриптор файл конвейера.
Отчетливо видно, что почти для каждого Java класса в приложении должен быть создан дублирующий файл xml с описанием. При каждом изменении кода, xml файл также должен быть редактирован. Это создает неудобства как во время разработки системы, так и во время последующей поддержки.
Эту проблему в некоторой степени решают существующие библиотеки, построенные на платформе Apache UIMA, в первую очередь это UIMAFit, разрабатываемый тем же Apache Foundation. UIMAFit позволяет избежать ненужное дублирование логики приложения и сводит использование xml файлов к минимуму. Несмотря на то, что эта библиотека кардинально изменяет взаимодействие с фреймворком UIMA, упрощая разработку и добиваясь минимального количества кода, UIMAFit лишь является оберткой над стандартной библиотекой Apache UIMA. Однако использование UIMAFit не решает проблему с написанием xml-дескрипторов для системы типов, лишь автоматизируя сам процесс запуска утилиты JCasGen.
Важное место занимают расширяемые системы, предназначенные для обработки произвольных видов данных, которые могут гибко настраиваться пользователем. Наиболее популярные из них - это GATE, NLTK и Apache UIMA.
UIMA - одна из наиболее зрелых программных платформ для реализации индустриальных решений в области текстовой аналитики, разработанная IBM и ASF. Аббревиатура UIMA - это сокращение от Unstructured Information Management Architecture (архитектура управления неструктурированной информацией). Данная библиотека является программной реализацией фреймворка для анализа неструктурированного контента, такого как текст, видео- и аудио- данные. Неструктурированная информация на данный момент является самым крупным, наиболее актуальным и быстрорастущим источником информации, который доступен для предприятий и правительства.
Мотивация к созданию такой системы заключалась в создании общей платформы для неструктурированных данных, чтобы способствовать повторному использованию компонентов анализа и уменьшения дублирования в разработке анализаторов. Подключаемая архитектура UIMA позволяет легко подключить собственные компоненты анализа и объединить их вместе с другими. Задача полного анализа (с использованием неструктурированных данных), как например, задача поиска, является не монолитной задачей, а многоступенчатым процессом, в котором различные модули должны опираться друг на друга, чтобы получить мощную цепочку анализа. В некоторых случаях аннотаторы от разных разработчиков должны работать вместе, чтобы произвести необходимые результаты. С применением UIMA нет необходимости знать детали того, как разные аннотаторы работают в сборе. Библиотека UIMA берет на себя заботу за интеграцию и взаимодействие нескольких аннотаторов между собой.
Таким образом, основная цель UIMA заключается в преобразовании неструктурированной информации в структурированный вид, путем организации механизмов анализа, для выявления сущностей или отношений, и тем самым позволяя построить мост между неструктурированным и структурированным мирами.
Актуальность проблемы
Библиотека Apache UIMA предоставляет огромные возможности для организации эффективной обработки больших объемов неструктурированных данных. Однако создание и развертывание такой высокопроизводительной системы, а также последующая поддержка и конфигурирование для удовлетворения различных функциональных и нефункциональных требований к такому программному продукту требует глубокого понимания процессов, происходящих внутри фреймворка Apache UIMA. Более того, даже при разработке сравнительно небольшого приложения для обработки текстов на естественном языке с помощью этой библиотеки, разработчик сталкивается с проблемой поддержки множества ХМЬ-файлов[2]. Для иллюстрации этой проблемы, рассмотрим примитивное приложение, предназначенное для разбиения текста на предложения. Ниже приведен список действий, который должен выполнить разработчик для реализации данной задачи, следуя традиционному подходу:
1. Написать XML-дескриптор, описывающий систему типов для конкретной задачи (в данном случае - класс Sentence).
2. Запустить утилиту JCasGen (входит в состав UIMA) для генерации Java-классов из дескриптора системы типов.
3. Реализовать анализатор для выделения предложений в тексте.
4. Написать XML-дескриптор, описывающий созданный анализатор.
5. Реализовать CAS Consumer для обеспечения требуемого вывода полученных результатов.
6. Написать еще один XML-дескриптор, который описывает этот CAS Consumer.
7. Написать XML-дескриптор для компоненты, которая бы считывала входные данные (Collection Reader).
8. Написать XML-дескриптор, описывающий конвейер (pipeline), состоящий из предыдущих модулей.
9. И, наконец, вызвать Collection Processing Manager, передав в него дескриптор файл конвейера.
Отчетливо видно, что почти для каждого Java класса в приложении должен быть создан дублирующий файл xml с описанием. При каждом изменении кода, xml файл также должен быть редактирован. Это создает неудобства как во время разработки системы, так и во время последующей поддержки.
Эту проблему в некоторой степени решают существующие библиотеки, построенные на платформе Apache UIMA, в первую очередь это UIMAFit, разрабатываемый тем же Apache Foundation. UIMAFit позволяет избежать ненужное дублирование логики приложения и сводит использование xml файлов к минимуму. Несмотря на то, что эта библиотека кардинально изменяет взаимодействие с фреймворком UIMA, упрощая разработку и добиваясь минимального количества кода, UIMAFit лишь является оберткой над стандартной библиотекой Apache UIMA. Однако использование UIMAFit не решает проблему с написанием xml-дескрипторов для системы типов, лишь автоматизируя сам процесс запуска утилиты JCasGen.
В рамках данной дипломной работы автором были решены следующие задачи:
• Проведен анализ и сравнение существующих на момент публикации инструментов для анализа текстовых данных на платформе Apache UIMA.
• Разработан предметно-ориентированный язык, позволяющий минимальным количеством кода разработать NLP-приложение с сохранением возможности гибкой настройки каждой из компонент приложения.
• Разработан механизм автоматической генерации XML- дескрипторов системы типов и соответствующих Java-классов, что значительно ускоряет время разработки приложения.
• Проведен анализ и сравнение существующих на момент публикации инструментов для анализа текстовых данных на платформе Apache UIMA.
• Разработан предметно-ориентированный язык, позволяющий минимальным количеством кода разработать NLP-приложение с сохранением возможности гибкой настройки каждой из компонент приложения.
• Разработан механизм автоматической генерации XML- дескрипторов системы типов и соответствующих Java-классов, что значительно ускоряет время разработки приложения.



