Унифицированный доступ к библиотечным средствам для обработки текстов на естественном языке
Полушин В.В., МГУ имени Ломоносова, ВМК vovapolu@gmail.com
Аннотация
Для разработки приложений по автоматической обработке текстов (АОТ) часто требуется применять несколько инструментальных средств, что может вызвать сложности у исследователей-разработчиков в этой области. Данная работа дает обзор инструментальных средств для разработки систем АОТ и описывает систему Esenin для унифицированного доступа к библиотечным средствам при создании приложения АОТ. Система нацелена на облегчение установки, настройки и использования нескольких различных библиотек для решения стандартных задач обработки текстов (токенизация, морфологический анализ, определение синтаксических связей слов, выделение латентных тем или именованных сущностей в тексте и др.).
1 Введение
Автоматическая обработка текстов (АОТ) [Большакова и др., 2017] на естественном языке становится все более востребованной. Для задач автоматической обработки текстов создано множество инструментальных средств, каждое их которых имеет свои особенности.
Инструментальные средства для АОТ можно поделить на три группы: библиотеки, фреймворки и инструментальные системы. Библиотеки решают несколько близких задач АОТ, оптимизированы под них и относительно часто обновляются. Фреймворки решают разнородные задачи АОТ, но более монолитны и обновляются реже. Инструментальные системы предоставляют пользователю-разработчику приложения АОТ множество дополнительных средств, но в то же время сложны для изучения и интеграции с другими программными инструментами. Инструментальные средства написаны на разных языках программирования и для разных платформ,
1 Docker - Build, Ship, and Run Any App, Anywhere https://www.docker.com/
также используются разные прикладные программные интерфейсы для одних и тех же задач АОТ.
Прикладные интерфейсы инструментальных средств АОТ можно разделить на три вида:
• Подключение модулей, написанных на некотором языке программирования и реализующих функции АОТ;
• Интерфейс командной строки, который принимает на вход данные (из стандартного потока ввода) в некотором формате и выдает (в стандартный поток вывода или в файл) результат обработки в том же формате;
• Запросы к серверу - для этого запускается процесс-сервер, который принимает стандартизированные запросы на обработку текста по определенному протоколу и отвечает по этому же протоколу. К серверу могут подключаться несколько пользователей, работающих на разных языках программирования и платформах.
Для создания приложений АОТ обычно требуется решать несколько стандартных задач АОТ, в том числе: токенизация, морфологический анализ, приведение слов к стандартной форме, определение синтаксических связей слов в предложении, выделение латентных тем или именованных сущностей в тексте, определение тональности текста. Часто приходится брать несколько инструментальных средств и комбинировать их. Но большое разнообразие инструментальных средств с разными прикладными интерфейсами и под разные языки программирования вызывает сложности с их интеграцией и установкой. Установка и настройка нужных инструментальных средств отнимает время у исследователей и программистов в области АОТ.
В данной работе представлена система Esenin для унификации и упрощения доступа к библиотечным средствам АОТ. Каждая библиотека помещается в отдельный Docker1 контейнер, легковесную виртуальную машину, которая может принимать стандартизированные запросы на обработку текста и выдавать
результаты обработки. Все контейнеры обслуживаются централизованной системой - сервером, к которому подключаются пользователи с разных компьютеров и на разных языках программирования. Контейнеры в рассматриваемой системе можно конфигурировать под нужды пользователя. Установка каждого контейнера происходит автоматически и требует от пользователя только указать нужные компоненты в конфигурации.
Система Esenin облегчает использование существующих библиотечных средств, их установку и начальную настройку: ее пользователи могут выбрать самые эффективные компоненты АОТ для требуемых функций АОТ и сконфигурировать Esenin для их использования.
2 Инструментальные средства для построения систем АОТ
2.1 Библиотеки
Приведем несколько примеров известных библиотек.
SyntaxNet1 - библиотека для синтаксического анализа текстов, позволяющая находить синтаксические связи слов и размечать части речи слов. В основе библиотеки лежит нейросетевая архитектура [Andor et а1., 2016], что позволяет поддерживать несколько языков, в том числе русский. Установка и настройка библиотеки требует много времени, так как необходимо собирать исходный код вручную. Для использования библиотеки нужно обращаться к фреймворку для нейронных сетей Tensorflow [Abadi et а1., 2015], что вносит дополнительные сложности.
BigArtm2 - это библиотека тематического моделирования, применяющая ARTM подход [УогоП^оу, Potapenko, 2014]. Установка ее возможна только из исходного кода, ядро библиотеки написано на языке С++ и имеет РуШоп-обертку, для установки которой требуется настраивать переменные окружения. Укажем особенности библиотек:
• Библиотеки написаны преимущественно на одном языке программирования.
• Библиотеки оптимизированы под конкретную задачу или несколько близких задач.
1 https://github.com/tensorflow/models/tree/master/re-search/syntaxnet
2 https://github.com/bigartm/bigartm
3 https://opennlp.apache.org/
• Из-за небольшого объема библиотеки могут часто обновляться.
• При использовании сразу нескольких библиотек могут возникнуть сложности с их интеграцией.
• Библиотеки предоставляют программный интерфейс в виде подключения их модулей.
• Установка и настройка некоторых библиотек отнимает много времени и требует специальных навыков.
2.2 Фреймворки
В отличие от библиотек, фреймворки решают несколько задач АОТ. Как и библиотеки они позволяют подключать модули в приложения АОТ, а некоторые фреймворки дополнительно предоставляют интерфейс командной строки или сервер, к которому можно посылать запросы на обработку текста.
Например, Apache OpenNLP3 позволяет выполнять токенизацию, разбиение текста на предложения, определение частей речи у слов, выделение именованных сущностей, определение кореферентности. Фреймворк написан на Java и позволяет подключать Java-модули в исходный код. Также есть интерфейс командной строки.
NLTK4 - обширный фреймворк на языке Python для задач обработки текста, предоставляющий доступ к более чем 50 лингвистическим ресурсам (например, к WordNet). Также фреймворк позволяет проводить классификацию текстов, токенизацию, стемминг, разметку и семантический анализ текстов. NLTK предоставляет обертки для других популярных библиотек или фреймворков обработки текстов.
Stanford CoreNLP5 также выполняет то-кенизацию, лемматизацию, выделение частей речи и связей слов в предложениях, распознавание именованных сущностей и отношений (в том числе и для текстов в открытых предметных областях), определение тональности текста и т.д. Фреймворк предоставляет подключение модулей на языке Java, интерфейс командной строки и сервер для удаленного использования.
spaCy6 является фреймворком для решения определенного набора задач обработки
4 Natural Language Toolkit https://www.nltk.org/
5 https://stanfordnlp.github.io/CoreNLP/
6 https://spacy.io/
текста на языке Python (токенизация, выделение частей речи и связей слов в предложении, выделение именованных сущностей, сравнение сходства слов на основе векторов слов). Также он позволяет создавать конвейеры обработки текста из компонентов из этого набора.
Укажем особенности фреймворков:
• Как и в библиотеках, компоненты фрейм-ворков написаны на одном языке программирования.
• Фреймворки позволяют решить ряд задач обработки текста.
• Фреймворки обновляются реже, чем библиотеки, они более монолитны.
• По сравнению с библиотеками фреймворки имеют дополнительные возможности: конвейеры обработки текста, интерфейс командной строки, сервер для запросов на обработку текста.
2.3 Инструментальные системы
Как и фреймворки, инструментальные системы решают несколько разных стандартных задач АОТ, но также предоставляют дополнительные средства, в том числе графический интерфейс для взаимодействия с компонентами системы.
Рассмотрим несколько систем. Apache UIMA1 - система для обработки неструктурированной информации, она включает:
• Компоненты обработки информации (Annotates), корпусы и другие данные о тексте, а также формат данных для описания результатов обработки;
• Инфраструктура для доступа к компонентам, включающая в себя программные интерфейсы, интерфейс командной строки, сервер для удаленной работы с компонентами;
• Инструменты для создания новых компонентов системы на различных языках программирования (С++, Java, Python, Perl, TCL);
• Протокол UIMA [Ferrucci et al., 2006], через который происходит взаимодействие между частями системы.
GATE2 - инструментальная система для построения приложений АОТ, использующая компоненты на языке Java. Система применя-
ется для извлечения информации, ручной и автоматической семантической аннотации, работы с внешними текстовыми ресурсами. В GATE реализованы методы для токенизации текста, выделения предложений, тегирования, извлечения именованных сущностей, машинного обучения.
Компоненты АОТ включают: лингвистические данные (Language Resources), программы для обработки документов (Processing Resources), графические интерфейсы для двух предыдущих групп (Visual Resources). Система GATE также включает:
• Интегрированная среда разработки GATE Developer;
• Веб-приложение GATE Teamware для кол-лаборативной работы;
• Фреймворк GATE Embedded для доступа к сервисам GATE Developer;
• Архитектура взаимодействия приложений АОТ.
Система DKPro [Eckart de Castilho, Gurevych, 2014] предоставляет большое количество готовых компонентов для обработки текстов, каждый из них является оберткой над некоторым существующим инструментальным средством (например, модулем из Apache OpenNLP). Стоит отметить, что все эти средства берутся из инфраструктуры Java, переиспользовать средства под другие языки программирования сложно. Также каждый компонент имеет уникальную версию, что позволяет публиковать исследования по обработке текстов без опасения, что какая-либо часть проекта изменится с течением времени или перестанет работать как ожидалось. Все компоненты (и необходимые данные для них) находятся в открытом репозитории Maven3, так что программа, которая использует систему DKPro, может скачать все нужные части автоматически. Компоненты DKPro основаны на инфраструктуре UIMA, что позволяет интегрировать их в большую базу готовых проектов.
К особенностям инструментальных систем можно отнести:
• К компонентам инструментальных систем можно обращаться из различных языков про-
1 https://uima.apache.org/ 3 https://maven.apache.org/
2 General Architecture for Text Engineering https://gate.ac.uk/
граммирования, а сами инструментальные системы могут вызывать средства, реализованные на разных языках.
• В инструментальных системах редко происходит обновление основных компонентов.
• В сравнении с фреймворками инструментальные системы имеют множество дополнительных инструментов.
• Однако, в них много новых концептов, требующих изучения и знания для применения системы.
• Возникают сложности с интеграцией других инструментальных средств.
3 Унифицированный доступ к библиотекам
3.1 Предлагаемая архитектура
Предполагается, что пользователю-разработчику приложения по АОТ требуется решить несколько из стандартных задач АОТ: токенизация, морфологический анализ, приведение слов к стандартной форме, определение синтаксических связей слов в предложении, выделение латентных тем или именованных сущностей в тексте, определение тональности текста и др. Для решения каждой стандартной задачи он может использовать библиотеки, либо модули фреймворков. Однако их интеграция может вызвать у него трудности. Для облегчения интеграции предлагается использовать унифицированный интерфейс для каждой стандартной задачи, при этом различные интерфейсы выбранных библиотек или модулей фреймворков будут сокрыты для пользователя.
Далее под библиотечными средствами будем понимать как библиотеки, так и отдельные модули фреймворков, так как по функциональности они схожи. Предлагаемые ниже решения реализованы в системе Esenin.
Так как библиотечные средства АОТ требуют настройки окружения и установку зависимостей, то предлагается организовать работу каждого средства в отдельной виртуальной машине. При первом запуске системы, она скачивает готовый образ виртуальной машины с настроенными зависимостями выбранного библиотечного средства и компонентами обработки текста, необходимыми для корректной работы средства. Каждая виртуальная машина будет принимать текст для обработки,
передавать его в библиотечное средство и возвращать результат.
В качестве виртуальных машин предлагается использовать Docker'-контейнеры. Они легковесные и просты в конфигурировании. Заметим, что для большинства библиотечных средств уже существуют готовые конфигурации, которые позволяют установить библиотеку в контейнер.
Для доступа к каждому библиотечному средству предлагается запускать в каждом контейнере HTTP-сервер. Он будет принимать запросы на обработку текста и возвращать результаты обработки. Средства могут быть запущены на удаленной машине и могут использоваться сразу несколькими людьми, см. Рис. 1.
Для координации всех контейнеров с библиотечными средствами будет использоваться прокси-контейнер, к которому и будет посылать запросы пользователь. Прокси-контейнер анализирует запросы пользователя и направляет их в контейнер с нужным средством.
Таким образом, предложенная архитектура включает части, которые мы будем называть соответственно мастер-сервер и клиент. Под мастер-сервером понимается процесс, который устанавливает и запускает нужные Docker-контейнеры, перезапускает их в случае сбоя.
В пользовательской программе-клиенте происходит обращение к прокси-контейнеру посредством HTTP-запросов. Вручную формировать такие запросы сложно, поэтому для облегчения формирования используется вспомогательная библиотека на выбранном языке программирования (на Рис. 1 представлен пример, где каждый компьютер содержит один или несколько клиентов с вспомогательными библиотеками на разных языках программирования). Вспомогательная библиотека преобразует структуры языка программирования в нужный формат для сервера, отправляет HTTP-запросы, получает результат обработки и преобразует его обратно во внутреннее представление выбранного языка программирования.
3.2 Мастер-сервер
Мастер-сервер запускается в виде отдельного процесса. Он взаимодействует с системой управления контейнерами Docker: создает контейнеры, запускает их, посылает запросы
1 https://www.docker.com/
на прокси-контейнер. С помощью конфигурирования мастер-сервера пользователь системы может настроить нужные контейнеры, библиотечные средства и функции обработки текстов, которые затем будут ему доступны.
Рассмотрим пример конфигурации. В ней name обозначает имя контейнера, по этому имени можно обращаться к нему напрямую; source - источник конфигурации для контейнера, в данном случае конфигурация берется из DockerHub1, открытого репозитория конфигураций Docker-контейнеров;
nlp func обозначает функцию обработки текстов, которую поддерживает контейнер.
modules = [ {
name = "syntaxnet" source = "dockerhub:esenin/syntaxnet "
nlp func = "pos"
} {
name = "bigartm" source = "dockerhub:esenin/bigartm" nlp func = "tm"
} {
name = "sentimental" source = "dockerhub:esenin/sentimental "
nlp func = "sent"
}
]
По данной конфигурации будет создано три Docker-контейнера:
• syntaxnet с библиотекой SyntaxNet, который обеспечивает разметку частей речи (pos);
• bigartm с библиотекой BigArtm для тематического моделирования (tm);
• sentimental с библиотекой Sentimental для определения тональности текста (sent).
3.3 Вспомогательная библиотека
Чтобы скрыть детали формирования запроса и соединения с мастер-сервером используется вспомогательная библиотека для нужного языка программирования. Она позволяет создать запрос на обработку данного текста, преобразовать его в формат мастер-сервера, отослать его по нужному адресу и получить результат, преобразовав его в нужные структуры данных языка программирования.
Рассмотрим для примера использование библиотеки на языке Python. Библиотека содержит описание класса esenin.Client, в котором содержатся функции для общения с мастер-сервером.
import esenin
client = esenin.Client()
print(client.get pos(
"Хочешь проиграть процесс?" )) # 1
id = client.fit topics( [["Хочешь", "проиграть", "процесс", "?"], ["Тебя", "вычеркнут", "из", "жизни", "."]],
10 ) # 2
print(client.get topics(
id["id"], "процесс" )) # 3
В рассмотренном примере в фрагменте #1 происходит запрос частей речи слов в заданном предложении, в фрагменте #2 - настройка тематического моделирования на 10 тем, а в фрагменте #3 вычисляется вероятностное распределение 10 тем для данного слова.
Каждый вызов метода класса esenin.Client (в нашем примере мы использовали get pos, get tm) формирует HTTP-запрос к мастер-серверу, который запускает нужную библиотеку. Мастер-сервер возвращает результат в заданном формате, и клиент преобразует полученный формат во внутреннее представление языка программирования, в данном случае, в списки, кортежи и словари языка Python.
1 https://hub.docker.com/
3.4 Сравнение с существующими решениями
Расширение функциональных возможностей в инструментальных системах, описанных в разделе 2.3, ограничено их инфраструктурой (языком программирования, программными интерфейсами, с которыми они работают). Система Esenin использует контейнеры, которые легко добавлять, удалять, заменять или изменять; они используют унифицированный программный интерфейс для взаимодействия с системой. Контейнеры в Esenin более гибки, от них требуется только передача HTTP-сообщений, они могут устанавливать и использовать любые инструменты внутри себя, не влияя на окружение пользователя.
Как в инструментальной системе DKPro система Esenin также скачивает и устанавливает контейнеры автоматически. Но менеджер компонентов в DKPro ограничен репозиторием Maven и общей инфраструктурой Java. Esenin не имеет таких ограничений, пользователь может использовать контейнер с практически любыми зависимостями и инструментами.
В то же время, набор возможных средств для АОТ в проекте Esenin ограничен стандартными задачами АОТ: Esenin не старается заменить все возможные инструменты, но помогает облегчить разработку типичных задач обработки текстов. Именно это ограничение поз-
воляет реализовать унифицированный программный интерфейс для доступа к различным библиотечным средствам АОТ. Похожий подход используется в фреймворке spaCy, но в отличие от него в проекте Esenin возможно заменять реализации для решения выбранной стандартной задачи АОТ.
Отметим также, что проект Esenin направлен в первую очередь на небольшие приложения и исследования, где важна простота интеграции нескольких средств АОТ.
4 Заключение
Данная работа описывает систему Esenin для унификации доступа к некоторому набору средств АОТ с целью их интеграции. Проект отличается от существующих решений механизмом создания компонент системы, более гибкой системой автоматической загрузки и установки этих компонент и унифицированным интерфейсом ко всем ним.
На текущий момент реализован мастер-сервер, прокси-контейнер, вспомогательные библиотеки для языка Python и С++, конфигурации для Syntaxnet и BigArtm.
Все исходные коды для мастер-сервера, прокси-контейнера, вспомогательных библиотек и конфигураций для средств обработки текстов открыты и расположены в группе esenin-org1.
1 https://github.com/esenin-org
Репозиторий esenin-server1 содержит код мастер-сервера и прокси-контейнера. Репозиторий esenin-python2 - код вспомогательной библиотеки на языке Python. Репозиторий esenin-syntaxnet3 - конфигурацию библиотеки Syntaxnet для системы Esenin. Репозиторий esenin-bigartm4 - конфигурацию библиотеки BigArtm.
Список литературы
Большакова Е. И., Воронцов К. В., Ефремова Н. Э., Клышинский Э. С., Лукашевич Н. В., Сапин А. С. 2017. Автоматическая обработка текстов на естественном языке и анализ данных: учеб. пособие. М. : НИУ ВШЭ
Daniel Andor, Chris Alberti, David Weiss, Aliaksei Severyn, Alessandro Presta, Kuzman Ganchev, Slav Petrov, Michael Collins. 2016. Globally Normalized Transition-Based Neural Networks. eprint arXiv:1603.06042
Martin Abadi et al. 2015 TensorFlow: Large-scale machine learning on heterogeneous systems.
David Ferrucci, Adam Lally, Daniel Gruhl, Edward Epstein, Marshall Schor,
J. William Murdock, Andy Frenkiel, Eric W. Brown, Thomas Hampp, Yurdaer Doganata, Christopher Welty, Lisa Amini, Galina Kofman, Lev Kozakov. 2006. Yosi Mass Towards an Interoperability Standard for Text and Multi-Modal Analytic. IBM Research Report
Eckart de Castilho, R. and Gurevych, I. 2014. A broad-coverage collection ofportable NLP components for building shareable analysis pipelines. In Proceedings of the Workshop on Open Infrastructures and Analysis Frameworks for HLT (OIAF4HLT) at COLING, p 1-11, Dublin, Ireland
1 https://github.com/esenin-org/esenin-server
2 https://github.com/esenin-org/esenin-python
3 https://github.com/esenin-org/esenin-syntaxnet
4 https://github.com/esenin-org/esenin-bigartm