Парсер выполняет базовые задачи для текста на русском (или другом, поддерживаемом словарной базой и моделями) языке:
- Частеречная разметка (part-of-speech tagging)
- Построение синтаксического дерева зависимостей (dependency parsing)
- Разбивка на глагольные/именные составляющие первого уровня (chunking)
- Лемматизация
- Токенизация с учетом неоднозначностей для составных слов
Реализованы следующие варианты парсера:
- основной проект - консольная утилита (проект Parser)
- биндинг для Питона (проект PyParser, использована boost::python)
- HTTP REST сервис (Parser_RestHttpService, использована boost:asio)
Для работы Парсера необходима словарная база и файлы данных моделей, полученных применением алгоритмов машинного обучения для больших размеченных корпусов. Готовые файлы моделей для русского языка можно взять из каталога в репозитории для Windows и Linux. Сборка русской словарной базы из исходников описана на главной странице.
Кроме того, архив с полностью готовыми файлами парсера можно взять на сайте проекта.
В консольном парсере и REST-сервисе путь к файлу конфигурации dictionary.xml словарной базы задается опцией "-d path". По умолчанию файлы языковых моделей лежат в том же каталоге, что и сама словарная база, хотя это можно изменить, задавая относительные пути для элементов под тегом в dictionary.xml.
Под MS Windows для компиляции парсера можно использовать готовое решение для VisualStudio 2015 - файл Parser64.sln в каталоге. В этом решении собраны проекты для сборки консольной версии парсера (Parser) и модуля для Питона (PyParser).
Предварительно надо скачать и собрать библиотеки Boost. На момент написания инструкции текущей версией Boost была 1.66, для нее процесс выглядит примерно так (здесь есть официальная дока).
-
Скачиваем и распаковываем архив с исходниками отсюда http://www.boost.org/users/history/version_1_66_0.html.
-
Открываем консоль.
-
Возможно, потребуется инициализировать переменные среды для VisualStudio, для этого при установленной версии 2015 запускаем
"c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64
- Собираем инструменты для сборки буста, для этого переходим в кореневой каталог, куда был распакован архив буста и выполняем:
bootstrap.bat
- Запускаем сборку Boost:
bjam -j4 --build-type=complete architecture=x86 address-model=64 link=static stage
- Далее можно скопировать собранные файлы библиотек в новый отдельный каталог, либо линковаться с подкаталогом ...\stage\lib. В проекте сборки парсера не забудьте указать путь к этому каталогу в свойствах линкера вместо моего значения e:\boost.1.66\stage\lib.
Предполагается, что установлены внешние зависимости, указанные на странице описания грамматического движка. Также необходимо собрать русскую словарную базу.
Кроме этого, необходимо выполнить следующие действия.
Установить PCRE++:
sudo apt-get install libpcre++-dev
Далее компилируем библиотеку для синтаксического разбора:
cd ~/GrammarEngine/src/demo/ai/solarix/DeSR/libdesr
./build.sh
Теперь можно скомпилировать сам парсер:
cd ~/GrammarEngine/src/demo/ai/solarix/argon/ParseText/Parser
./build.sh
После успешной компиляции можно запустить скрипт parse.sh, чтобы убедится в нормальной работе парсера.
Все pyd и dll файлы, необходимые для работы с парсером в питоне, собраны в подкаталоге pyparser. Для удобства использования в птоновском коде модуль pyparser необходимо установить с помощью pip. Для этого перейдите внутрь каталога src репозитория (там можно увидеть файл setup.py) и выполните
pip install .
Далее можно запустить интерпретатор питона python и выполнить в нем следующий код:
from __future__ import print_function
from pyparser import PyParser
p = PyParser()
p.load(u'e:/mvoice/lem/bin-windows64/dictionary.xml', 0, -1)
tokens = p.tag1(u'кошки спят на веранде', True, False)
for token in tokens:
print(u'{}\t{}\t{}'.format(token[0], token[1], token[2]))
Метод PyParser.load загружает словарную базу по указанному файлу конфигурации, поэтому потребуется скорректировать путь. Метод PyParser.tag1 разбирает одно предложение, переданное как юникодная строка, и возвращает список кортежей. Каждый кортеж имеет 4 элемента: исходное слово, лемма, часть речи и список пар тег+значение для морфологических признаков слова.
Консольный вариант парсера сохраняет результаты разбора в указанном XML файле (если указана опция -o имя_файла) или выводит их прямо в консоль (по умолчанию).
Например, предложение "Совещание происходило на квартире генерала Науменко." в результате работы чанкера (опция -parser 2) даст такой результат:
<chunks>
<token word_index='0' is_chunk_starter='1'/>
<token word_index='1' is_chunk_starter='1'/>
<token word_index='2' is_chunk_starter='1'/>
<token word_index='3' is_chunk_starter='0'/>
<token word_index='4' is_chunk_starter='0'/>
<token word_index='5' is_chunk_starter='0'/>
<token word_index='6' is_chunk_starter='1'/>
</chunks>
Атрибут is_chunk_starter для каждого входного слова определяет, является ли слово первым в отдельной группе, прикрепляемой к корню:
В данном случае видно, как отдельная группа слов для предложного обстоятельства "на квартире генерала Науменко" образует отдельную группу, в которой первое слово, предлог "на", помечен атрибутом is_chunk_starter='1', а остальные помечены атрибутом is_chunk_starter='0'.
Парсер реализован как консольная программа. Режим обработки текста задается аргументами командной строки.
Только частеречная разметка текста (-tagger 0) в файле (-i ...), где каждая строка соответствует одному предложению (опция -eol):
parser -verbose -tagger 0 -eol -d ../ru/dictionary.xml -i input.txt -o output.xml
Частеречная разметка, синтаксический разбор и лемматизация:
parser -verbose -tagger 0 -parser 0 -lemmatizer 0 -eol -d ../ru/dictionary.xml -i input.txt -o output.xml
Разбивка на составляющие для текста, который надо по ходу разбора разбивать на предложения:
parser -verbose -tagger 0 -parser 2 -d ../ru/dictionary.xml -i input.txt -o output.xml
REST сервис реализован как консольное приложение. Пример командной строки для запуска:
Parser_RestHttpService.exe -tagger 0 -parser -1 -lemmatizer 0 -d dictionary.xml -url 127.0.0.1 -port 10973
Прослушиваемый сетевой адрес задается опциями -url и -port. Чтобы веб-сервис парсинга был доступен из внешних сетей, нужно вместо -url 127.0.0.1 указать -url 0.0.0.0 или подставить адрес конкретного сетевого интерфейса.
Назначение остальных параметров можно найти выше в описании консольного парсера.
Пример GET-запроса для выполнения разбора предложения:
http://127.0.0.1:10973/tag1?sent=%D0%BA%D0%BE%D1%88%D0%BA%D0%B8%20%D1%81%D0%BF%D1%8F%D1%82
Метод tag1 выполняет разбор одного предложения, передаваемого как параметр sent. Результат разбора будет возвращен в JSON формате:
{
"tokens":[
{
"word": "Толстые",
"lemma": "толстый",
"part_of_speech": "ПРИЛАГАТЕЛЬНОЕ",
"tags": [ ]
},
{
"word": "кошки",
"lemma": "кошка",
"part_of_speech": "СУЩЕСТВИТЕЛЬНОЕ",
"tags": [ ]
},
{
"word": "ловят",
"lemma": "ловить",
"part_of_speech": "ГЛАГОЛ",
"tags": [ ]
},
{
"word": "серых",
"lemma": "серый",
"part_of_speech": "ПРИЛАГАТЕЛЬНОЕ",
"tags": [ ]
},
{
"word": "мышек",
"lemma": "мышка",
"part_of_speech": "СУЩЕСТВИТЕЛЬНОЕ",
"tags": [ ]
},
{
"word": ".",
"lemma": ".",
"part_of_speech":
"ПУНКТУАТОР", "tags": [ ]
}
]
}
В каталоге HttpRestClient/py лежит простой пример вызова веб-сервиса парсинга из кода на Питоне (библиотека requests).
Парсер использует статистические модели для лемматизации, частеречной разметки и парсинга, обучая их на большом корпусе размеченных в ручную текстов. Исходный текст программ на C#, выполняющих обучение, также доступен в репозитории:
part-of-speech tagger model trainer
chunker model trainer
lemmatizer model trainer
dependency parsing model trainer
Все тренеры используют текстовые корпуса, размеченные вручную, для формирования обучающего датасета. В настоящее время поддерживаются корпуса во внутреннем формте Solarix (см. класс SolarixBinaryCorpusReader), Universal Dependencies (см. класс UniversalDependenciesCorpusReader) и корпус из соревнования Диалог (см. класс DialogMorphEvalCorpus).
Пример запуска обучения модели лемматизации по корпусам Solarix и Universal Dependencies:
set SOLARIX_CORPUS=-corpus E:\Corpus\CompiledCorpus\ru\x64\*.bin
set CONLLU_CORPUS=-ud_corpus "E:\Corpus\UD_Russian-SynTagRus\*.conllu"
LemmatizerDatasetBuilder.exe -dict .\ru\dictionary.xml %CONLLU_CORPUS% %SOLARIX_CORPUS% -params LANGUAGE=ru -tmp e:\tmp
По окончании работы будут созданы файлы lemmatizer.model и lemmatizer.codebook.