Как проверить предложение означает полный или не использовать LEX & YACC - PullRequest
1 голос
/ 03 апреля 2012

Я разрабатываю инструмент (в LEX & YACC), чтобы проверить, правильно ли введенное предложение пользователем грамматически или нет.Как проверить предложение, имеет ли оно полное значение или нет.Мой инструмент распознает образец предложения.Например: для шаблона s + v + o «я читаю книгу» это правильное предложение!Но «Я пью книгу» соответствует шаблону, который не означает полный!Как дать правила семантической проверки предложения в YACC?

Ответы [ 3 ]

4 голосов
/ 03 апреля 2012

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

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

После того, как вы пройдете сырой синтаксический анализ, вам потребуется огромная база знаний о мире, вещах, свойствах вещей икак вещи взаимодействуют.Отсюда вытекает, что «книги не пригодны для питья» и используется для фильтрации ваших разборов.Конечно, вы можете добавить немного этих знаний в свою грамматику YACC, и тогда она будет обрабатывать ваш пример, но вам нужно тонну, чтобы справиться с тем, что люди действительно говорят, или по разумным причинам нельзя сказать.

«Бесцветные зеленые идеи спали яростно»."У Мэри было немного ягненка, немного сыра и немного выпили".

1 голос
/ 03 апреля 2012

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

Просто создайте базу данных о глаголах, которая указывает, какие «аргументы» они принимают, например, функции в языке программирования: база данных указывает, какие субъекты выполняют этот глагол, с какими объектами, с использованием каких возможных инструментов, в какой ситуации и т. д.

например. «Собака написала стул с листиком». Мы ищем «запись» в нашей маленькой игрушечной базе данных и видим, что «собака» не входит в список возможных предметов, что (хотя глагол является переходным) «стул» не является возможным прямым объектом, и этот «лист» не возможный инструмент.

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

Это мало чем отличается от отклонения, скажем, A + B, когда A является целым числом, а B является строкой или func(A, B, C), когда func имеет только два аргумента.

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

Лекс и Якк на самом деле не придают такого значения такой задаче. По крайней мере, не обычные lex и Yacc, которые производят и взаимодействуют с кодом C.

0 голосов
/ 10 апреля 2012

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

Не могли бы вы объяснить, как знания могут быть добавлены в грамматику YACC, приведя пример

...