Для одного из моих проектов потребовалась интересная особенность — перефразирование текста, позволяющее, например, фразу «корова паслась на лугу» преобразовать в «пятнистая корова жевала сочную траву на зеленом лугу».
Конечно, такого рода трансформация требует очень большой базы связей между словами и выражениями, отсутствие которой свело на нет всю работу.
Но это уже другая история.
Теперь я расскажу о том, как я решил вопрос синтаксического анализа предложений, которые потом нужно было преобразовать во что-то новое, но столь же человекочитаемое.
Википедия определяет синтаксический анализ следующим образом: « синтаксический анализ (синтаксический анализ) — это процесс сравнения линейной последовательности лексем (слов, лексем) языка с его формальной грамматикой.
Результатом обычно является дерево разбора (синтаксическое дерево).
Обычно используется в сочетании с лексическим анализом.
Синтаксический анализатор (парсер) — это программа или часть программы, выполняющая синтаксический анализ.
” Чтобы успешно преобразовать текст, необходимо разбить его на абзацы, а те, в свою очередь, на строки.
Это было сделано внутри компании с использованием морфологического движка Solarix, который я купил для синонимайзера еще в 2008 году.
На выходе разделителя был массив абзацев, каждый из которых содержал массив строк.
На всякий случай хочу отметить: в этой статье я сознательно не указываю язык программирования, так как, во-первых, хочу избежать холивара на тему языка, а, во-вторых, речь пойдет о методе парсинга.
строка, а не о конкретном методе реализации этого анализа.
Кроме того, я по каким-то причинам не смог воспользоваться встроенным в Solarix парсером, из-за чего пришлось городить собственный огород. Программа-процессор представляет собой многопроходный парсер, способный обрабатывать не только отдельные слова, но и целые предложения, используя контекст предложений и абзацев, а также применяя его при возникновении трудностей с омонимией или в случае неполных или неясных предложений.
Разбиение на абзацы позволяет выделить основную мысль данного абзаца (если она, конечно, есть), тем самым создавая контекст. Формально контекстом абзаца можно считать все пары подлежащих и предикатов, которые встречаются во всех предложениях данного абзаца.
В случае односоставных предложений используется только одна часть предложения.
Если, конечно, вы сможете его найти.
Вся основная работа выполняется на уровне предложений.
Алгоритм анализа предложения достаточно прост и может быть описан в виде состояний конечного автомата.
К сожалению, несмотря на то, что у меня есть знания по созданию конечных автоматов, у меня нет опыта в создании таких машин.
Поэтому было решено сделать все по старинке, используя процедурный подход. Тем более, что у меня сильно чесались руки и я уже примерно знал, что и как буду делать.
Теперь я знаю, что это было неправильно, потому что уже через несколько часов я застрял в дебрях русской грамматики и потратил на ее изучение довольно много времени.
Хотя не факт, что потратив еще неделю на создание конечного автомата, я бы добился лучшего результата.
Итак, я изучал грамматику русского языка, параллельно строя свой анализатор.
Анализатор основывался на нескольких аксиомах, основанных на основных принципах построения фраз в русском языке: - предложение может иметь ноль или более подлежащих; - несколько предметов, идущих подряд и стоящих в одном падеже, образуют сложное подлежащее; - простое подлежащее связано со сказуемым в единственном числе, а сложное подлежащее – со сказуемым во множественном числе; - сказуемое может быть как простым, так и сложным; - сложное предикат состоит из двух и более предикатов, имеющих одинаковое число и время; — второстепенные члены предложения (наречия, определения, дополнения и приложения) определяются исходя из их местоположения относительно главных членов предложения, а также соответствующих им морфологических признаков, таких как род, число и время.
Сначала обрабатывались самые простые предложения: « Мама мыла раму ”, “ кот и собака сидят на полу ”, “ кот пил молоко "Эти предложения не представляют никакой сложности, так как содержат довольно много сочетаний морфологических признаков.
Например, " Мама мыла раму понять можно очень легко: подлежащим в этом случае может быть только существительное в именительном падеже ( Мать ).
Сказуемым является глагол « мыло », связанный с предметом по роду и числу.
Третье слово является дополнением, так как отвечает на вопрос о косвенном падеже ( Что? ).
Внимательный читатель может спросить: а как насчет третьего предложения о коте, пьющем молоко, в котором в именительном падеже стоят два существительных, одно из которых могло бы быть глаголом? В данном случае мы имеем дело с омонимией, и решается она достаточно просто: для слова, имеющего характеристики и существительного, и глагола, необходимо найти существительное, связанное с глаголом по роду и числу или только по числу в случай сложного подлежащего или простого подлежащего во множественном числе.
Кроме того, в случае уточнения, выраженного косвенным или вопросительным местоимением (какой?, какой?), омонимия снимается еще проще – такие слова-омонимы автоматически считаются подлежащими придаточного предложения: «кот, который пил молоко, хотел to Sleep» => «кот (захотел (спать), выпил (какое) молоко)».
Таким образом, мы получаем два набора «субъект-предикат»: « кот выпил " И " кот хотел », а само предложение считается сложным.
Дальнейшая доработка анализатора не представляет особой сложности: мы ищем все второстепенные члены предложения, исходя из их положения и соотношения морфологических признаков относительно уже найденных членов предложения.
Кстати, чтобы облегчить разбор предложения, перед самим разбором нужно упростить предложения, присоединив наречия ( хорошо, быстро, легко ) к глаголам, герундиям или прилагательным, рядом с которыми они стоят, при необходимости связывая эти наречия в цепочки при их соединении запятыми или союзами ( и, или, но не ).
Если анализ конкретного предложения затруднен, оно помечается как проблемное и его анализ переносится на второй проход анализатора, когда контекст абзаца уже более или менее определен.
В то же время, используя этот контекст, можно с достаточно высокой степенью уверенности выявить проблемные части речи в проблемном предложении и добавить ее контекст в контекст абзаца.
К сожалению, парсер не был доработан, хотя мне удалось разобрать довольно экзотические предложения, как простые, так и сложные.
Также я не создавал базу данных связей между словами и фразами.
Это произошло как из-за потери интереса к проекту (который, надеюсь, однажды возобновится), так и из-за нехватки времени, связанной с параллельной работой над несколькими коммерческими проектами, что отнимало свободное время, которое я мог бы потратить на хобби.
, его практически не осталось.
Теги: #алгоритм #синтаксический анализ #грамматика #Алгоритмы
-
Золотой Стандарт
19 Oct, 24 -
Почему Я Боюсь Стать «Накачанным Человеком»
19 Oct, 24 -
Продажа Твитов Без Nft И Sms
19 Oct, 24