Синтаксический парсер
Для отдельного предложения текста парсер позволяет построить синтаксическое дерево и сконструировать семантическое представление – смысл текста.
Парсер запускается файлом ParsersDemo.exe. После запуска откроется два окна: собственно парсер (окно ParsersDemo) и интерфейс работы со сценариями (окно Database Development Support). В этой статье будет описана работа в основном окне – окне парсера.
Параметры передаются программе ParsersDemo.exe через командную строку, поэтому запускать программу удобно через командный файл, например:
@ParsersDemo.exe ^
--rules-file="C:\parser\rules.xml" ^
--mssqlrep-connectionstring="Data Source=SYNTAX.RRCKI.RU;Initial Catalog=Scenarios;User Id=sa;Password=REPLACE_PASSWORD" ^
--morphmatchregex_pattern="C:\parser\patterns.xml" ^
--grammemes="0, p, ag, pat, cont, instr, src, targ, caus, eff, coord, loc, obs, pos, ca, tr, mod, foc, t, refg, sa, it, ben, rag, voc, -, head, NOUN, ADJF, ADJS, COMP, VERB, INFN, PRTF, PRTS, GRND, NUMR, ADVB, NPRO, PRED, PREP, CONJ, PRCL, INTJ ^
--guesserweb-host="http://syntax.rrcki.ru:5000"
- где:
- --rules-file – путь до файла синтаксических правил
- --mssqlrep-connectionstring – строка подключения к словарю – базе данных MSSQL
- --morphmatchregex_pattern – путь до файла с лексемами-исключениями
- --grammemes – граммемы, которые будут показаны в синтаксических деревьях при нажатии флажка Short trees, другие граммемы будут скрыты
- --guesserweb-host – адрес сервиса «гессер», предсказывающего начальную форму и морфологические характеристики несловарных слов
Парсер предназначен для анализа предложений. Предложение нужно ввести в сроку ввода и нажать кнопку Start. Результатом анализа является синтаксическое дерево (отмечено синим) и семантическое представление (отмечено зелёным). Парсер обрабатывает омонимичные разборы, поэтому он может построить сразу множество синтаксических деревьев и семантических представлений: одно семантическое представление для каждого синтаксического дерева. Эти варианты можно проматывать с помощью горизонтальной прокрутки.
При этом синтаксические деревья упорядочиваются парсером по снижению синтаксического веса (он указан в заголовке синтаксического дерева - отмечен жёлтым).
В строку ввода можно поместить сразу несколько предложений, разделённых .
, ?
или !
. В этом случае порядок разборов будет соответствовать порядку предложений. Но для каждого предложения разборы будут отсортированы по снижению синтаксического веса.
В окне парсера используются параметры:
- 1 root – Показывать только деревья с одной вершиной. Снятие флажка 1 root показывает все варианты разбора, даже те синтаксические разборы, которые не объединились в одно синтаксическое дерево. Это полезно для поиска ошибок, когда не построено ни одного дерева.
- Short trees – Скрывать лишние синтаксические признаки, не указанные в ключе
grammemes
. Снятие флажка 1 root покажет полные синтаксическе деревья. Если ключgrammemes
не использован при запуске приложения, то всегда будут показываться полные синтаксические деревья.
В заголовке синтаксического дерева (отмечен жёлтым) указаны:
- Вес синтаксического дерева – деревья сортируются по снижению этого веса.
- LOG – лог разбора, список использованных синтаксических правил (двойное нажатие откроет лог в виде файла, а нажатие LOG на двух разных деревьях покажет различия).
- JSON – дерево в формате JSON (двойное нажатие откроет дерево в виде файла, а нажатие JSON на двух разных деревьях покажет различия).
- Стрелка сохранения дерева в базу Postgres.
Лог разбора
Для получения лога нужно навести мышку на надпись LOG в шапке дерева. Двойное нажатие откроет этот список в виде файла. Нажатие LOG на двух разных деревьях покажет разницу между логами разбора этих деревьев.
Пример файла лога:
Sentence 31964: 'мать любит дочь и сына'
============== History ==============
Push 'мать'
Depth 1: Bind (+0,05 -> 0,05 + 0,00) 'NOUN::'
Push 'любит'
Depth 2: Bind (+0,00 -> 0,05 + 0,00) 'VFIN::'
Depth 1: Bind (+0,70 -> 0,75 + 0,00) 'S-ag/VFIN'
Push 'дочь'
Depth 2: Bind (+0,00 -> 0,75 + 0,00) 'NOUN::'
Depth 2: Potential Up-left Link 0,69 'VP\Sacc-cont'
Push 'и'
Push 'сына'
Depth 4: Bind (+0,00 -> 0,75 + 0,69) 'NOUN::'
Depth 2: Bind+fork (+1,40 -> 2,15 + 0,00) 'VIRT:S-(и)-S'
Depth 1: Bind+fork (+0,70 -> 2,85 + 0,00) 'VP\Sacc-cont'
Ключевое слово push сигнализирует о том, что к разбору добавился новый сегмент предложения - слово. Ключевое слово bind означает, что на этом этапе сработало некоторое правило – его название написано в одинарных кавычках в конце строки. Например, после того, как парсер передал на обработку слово мать из предложения мать любит дочь и сына, сработало правило ‘NOUN::’. Алгоритм парсера работает слева направо, постепенно добавляя к анализу новые слова из предложения. В рассматриваемом примере в момент, когда на анализ уже поступило слово дочь, но еще не поступили слова и сына, алгоритм предполагает, что дочь – прямое дополнение глагола любит, в действительности же прямым дополнением является вся сочиненная группа дочь и сына. И правило ‘VP\Sacc-cont’, присоединяющее прямое дополнение к глаголу, должно сработать только после того, как вся сочинённая группа поступит на анализ. Такие несработавшие гипотезы в логе отмечены ключевыми словами potential link.
Накопление веса на каждом шаге в логе описывается строкой: (+X -> Y + Z). Где +X – вес, который алгоритм прибавляет на данном шаге к общему весу дерева. Y – накопленный к данному шагу вес. Z – суммарный вес потенциальных связей, в итоговый вес дерева не входит.
Сравнение логов двух разборов
Два синтаксических дерева для одного предложения можно сравнить по их логам. Это позволит увидеть разницу в последовательности применяемых правил у внешне похожих разборов. Для сравнения нужно последовательно нажать на надпись LOG сначала в заголовке одного дерева, а потом – второго. После этого в установленной на компьютере программе сравнения файлов (см, например, winmerge) откроются логи обоих разборов с подсвеченными различиями.
Синтаксическое дерево в формате JSON
Для компьютерной обработки синтаксических деревьев их можно представить в формате JSON. Для просмотра дерева в формате JSON нужно навести мышку на надпись JSON в заголовке синтаксического дерева. Двойное нажатие откроет дерево в виде файла.
Сравнение структур двух разборов
Два синтаксических дерева можно сравнить по структуре. Обычно сделать это довольно сложно, поскольку синтаксические деревья – это разветвленные структуры с множеством граммем в каждом из узлов. В парсере можно сравнить деревья в виде JSON. Для этого нужно последовательно нажать на надпись JSON сначала в заголовке одного дерева, а потом – второго. После этого в установленной на компьютере программе сравнения файлов (см, например, winmerge) откроются структуры обоих разборов в JSON-формате с подсвеченными различиями.