Как Я Создавал Парсер

Для одного из моих проектов потребовалась интересная особенность — перефразирование текста, позволяющее, например, фразу «корова паслась на лугу» преобразовать в «пятнистая корова жевала сочную траву на зеленом лугу».

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

Но это уже другая история.

Теперь я расскажу о том, как я решил вопрос синтаксического анализа предложений, которые потом нужно было преобразовать во что-то новое, но столь же человекочитаемое.

Википедия определяет синтаксический анализ следующим образом: « синтаксический анализ (синтаксический анализ) — это процесс сравнения линейной последовательности лексем (слов, лексем) языка с его формальной грамматикой.

Результатом обычно является дерево разбора (синтаксическое дерево).

Обычно используется в сочетании с лексическим анализом.

Синтаксический анализатор (парсер) — это программа или часть программы, выполняющая синтаксический анализ.

” Чтобы успешно преобразовать текст, необходимо разбить его на абзацы, а те, в свою очередь, на строки.

Это было сделано внутри компании с использованием морфологического движка Solarix, который я купил для синонимайзера еще в 2008 году.

На выходе разделителя был массив абзацев, каждый из которых содержал массив строк.

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

строка, а не о конкретном методе реализации этого анализа.

Кроме того, я по каким-то причинам не смог воспользоваться встроенным в Solarix парсером, из-за чего пришлось городить собственный огород. Программа-процессор представляет собой многопроходный парсер, способный обрабатывать не только отдельные слова, но и целые предложения, используя контекст предложений и абзацев, а также применяя его при возникновении трудностей с омонимией или в случае неполных или неясных предложений.

Разбиение на абзацы позволяет выделить основную мысль данного абзаца (если она, конечно, есть), тем самым создавая контекст. Формально контекстом абзаца можно считать все пары подлежащих и предикатов, которые встречаются во всех предложениях данного абзаца.

В случае односоставных предложений используется только одна часть предложения.

Если, конечно, вы сможете его найти.

Вся основная работа выполняется на уровне предложений.

Алгоритм анализа предложения достаточно прост и может быть описан в виде состояний конечного автомата.

К сожалению, несмотря на то, что у меня есть знания по созданию конечных автоматов, у меня нет опыта в создании таких машин.

Поэтому было решено сделать все по старинке, используя процедурный подход. Тем более, что у меня сильно чесались руки и я уже примерно знал, что и как буду делать.

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

Хотя не факт, что потратив еще неделю на создание конечного автомата, я бы добился лучшего результата.

Итак, я изучал грамматику русского языка, параллельно строя свой анализатор.

Анализатор основывался на нескольких аксиомах, основанных на основных принципах построения фраз в русском языке: - предложение может иметь ноль или более подлежащих; - несколько предметов, идущих подряд и стоящих в одном падеже, образуют сложное подлежащее; - простое подлежащее связано со сказуемым в единственном числе, а сложное подлежащее – со сказуемым во множественном числе; - сказуемое может быть как простым, так и сложным; - сложное предикат состоит из двух и более предикатов, имеющих одинаковое число и время; — второстепенные члены предложения (наречия, определения, дополнения и приложения) определяются исходя из их местоположения относительно главных членов предложения, а также соответствующих им морфологических признаков, таких как род, число и время.

Сначала обрабатывались самые простые предложения: « Мама мыла раму ”, “ кот и собака сидят на полу ”, “ кот пил молоко "Эти предложения не представляют никакой сложности, так как содержат довольно много сочетаний морфологических признаков.

Например, " Мама мыла раму понять можно очень легко: подлежащим в этом случае может быть только существительное в именительном падеже ( Мать ).

Сказуемым является глагол « мыло », связанный с предметом по роду и числу.

Третье слово является дополнением, так как отвечает на вопрос о косвенном падеже ( Что? ).

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

Кроме того, в случае уточнения, выраженного косвенным или вопросительным местоимением (какой?, какой?), омонимия снимается еще проще – такие слова-омонимы автоматически считаются подлежащими придаточного предложения: «кот, который пил молоко, хотел to Sleep» => «кот (захотел (спать), выпил (какое) молоко)».

Таким образом, мы получаем два набора «субъект-предикат»: « кот выпил " И " кот хотел », а само предложение считается сложным.

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

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

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

В то же время, используя этот контекст, можно с достаточно высокой степенью уверенности выявить проблемные части речи в проблемном предложении и добавить ее контекст в контекст абзаца.

К сожалению, парсер не был доработан, хотя мне удалось разобрать довольно экзотические предложения, как простые, так и сложные.

Также я не создавал базу данных связей между словами и фразами.

Это произошло как из-за потери интереса к проекту (который, надеюсь, однажды возобновится), так и из-за нехватки времени, связанной с параллельной работой над несколькими коммерческими проектами, что отнимало свободное время, которое я мог бы потратить на хобби.

, его практически не осталось.

Теги: #алгоритм #синтаксический анализ #грамматика #Алгоритмы

Вместе с данным постом часто просматривают: