Pull to refresh

Comments 16

Как раз сейчас работаю с solarxом. Хочется все-таки спросить, почему не было возможности пользоваться его синтаксическим анализатором?
Под невозможностью использования я имел в виду не физическую невозможность, а нежелание использовать эти результаты. Я пытался использовать этот анализатор, и достаточно часто результаты его работы казались мне странными. Кроме того, этот анализатор не дает некоторой важной информации, например, данных о членах предложения, и их все равно приходится извлекать вручную.
Понятно. Ну сейчас там этих проблем уже нет. Разве что работает не так быстро, как хотелось бы )
Не удержался от совета. Сам писал анализаторы в университете не раз, тоже делал сначала «в лоб». Но изучив предмет «Теория языков программирования и Методы трансляции» понял, что все это сложно и ненадежно. Достаточно просто грамотно нарисовать (на бумаге) граф конечного автомата и построить таблицу переходов по нему. А сама программа, реализующая переходы по таблице невероятно проста. Поэтому если все же соберетесь серьезно вернутся к вопросу, стоит поковырять методы трансляции: Конечные автоматы и регулярные выражения, и если совсем заморочиться — грамматики.
Да, вы правы: формальные правила пишутся куда быстрее и отлаживаются намного проще, чем функциональные методы. И когда у меня образуется достаточно времени, то я займусь этим вопросом — все равно будет полезно даже для общего развития.
До семантики дело не дошло? Или это изначально не планировалось?
Нет, этим я даже не планировал заниматься — очень уж обширная тема, в виде хобби просто не потяну.
Так о чем статья? Как вы попытались написать синтаксический анализатор и у вас не получилось?
Чото мало конкретики и хардкора.
Да, статья больше посвящена попытке написания такого анализатора, чем алгоритмам, использованным в ней. К сожалению, описание алгоритма с примерами кода займет намного больше места, чем краткая история плюс небольшое описание метода. Впрочем, если у народа будет интерес к этой теме, я могу написать серию статей, посвященных разным аспектам работы с синтаксисом русского языка и содержащим примеры исходных кодов. Возможно, это подтолкнет меня к продолжению работы над ним.
Тема очень интересная, очень любопытно посмотреть на детали Вашей реализации.
Есть ли у Вас какая-нибудь демка? Какой язык программирования использовали?
Нет, демки нет, просто не было такой цели — показывать результат до завершения работы.
Писал на C#. Детали реализации секретом не являются, и я покажу их в будущих статьях.
Простите, а как ваш парсер разберет предложение «еду на стол»? Как «едУ на стол» или как «Еду на стол»?

Это я к тому, что «алгоритм анализа предложения достаточно прост и может быть описан в виде состояний конечного автомата». Если подразумевается, что достаточно LR-разбора, то это не так.

Как минимум нужен GLR-парсер для того, чтобы парсер мог обрабатывать ветвления, а потом еще и лучшие варианты нужно вписывать в контекст (чему вообще только один абзац посвящен).
К сожалению работа над анализатором еще не закончена, и варианты односоставных предложений (в том числе включающих омонимию) в нем еще не рассматривались. Но, скорее всего, в этом предложении омонимия распознана не будет, и оно будет разобрано как односоставное предложение только с составом сказуемого. То есть контекст будет содержать информацию о ком-то, кто едет. Хотя, скорее всего, варианты с омонимией в односоставных предложениях будут рассматриваться отдельно и, хочется верить, анализатор будет парсить такие фразы без проблем.
Вот неплохая статья по поводу синтаксического разбора: www.cs.cmu.edu/~alavie/papers/thesis.pdf. В частности, рассматриваются проблемы неоднозначности и прочее.
Конечно, они там решают более сложную проблему — распознавание смысла предложений, полученных после распознавания речи, но, думаю, будет познавательно.
А как ваш парсер(который в голове) разберет такое предложение?
Если нету контекста — то (в терминах C++) получаем неопределенное поведение. Ну а при наличии контекста — с учетом его.
К этому я и писал — на следующий этап контекстного анализа стоит забрасывать все (ну или хотя бы лучшие) варианты разбора, а потом уже разрешать неоднозначности.
Sign up to leave a comment.

Articles