Добавление времен к вариантам на GF
В учебнике GF по конструкции вариантов говорится, что для выражения вариации GF следует использовать один из следующих методов.
lin Delicious = {s = "delicious" | "exquisit" | "tasty"} ;
lin Delicious = {s = variants {"delicious" ; "exquisit" ; "tasty"}} ;
Некоторое время я использовал первый метод, но GF иногда сообщал о некоторых странных сообщениях об ошибках. В настоящее время я все время использую второй метод. У меня вопрос, есть ли способ создать такие варианты для глагола с такими временами, как
lin Action = {s = variants {"write", "wrote" ; "buy", "bought" ; "read", "read}} ;
И если да, то как им пользоваться!
Продолжайте в том же духе ~.~
1 ответ
Чего вы хотите добиться, используя разные времена как варианты? Используя времена как варианты, я думаю о ситуации, когда время не имеет значения в грамматике вашего приложения, и вы хотите разбирать предложения вроде "Я покупаю еду" и "Я купил еду" в одном дереве.
Я собираюсь показать, как это сделать, но сначала исправим синтаксическую ошибку.
Исправление синтаксической ошибки
Я не понимаю, какова твоя цель
variants {"write", "wrote" ; "buy", "bought" ; "read", "read}
. Прежде всего, это синтаксическая ошибка в GF: термины между
;
или же
|
должны быть допустимыми выражениями GF, но
"write", "wrote"
представляет собой две строки, разделенные запятой, что не является допустимым выражением GF.
Если вы действительно создаете вариант, включающий любой глагол в любом времени, замените запятые точкой с запятой. Как это:
all_verbs : Str = variants { "write" ; "wrote" ; "buy" ; "bought" ; "read"} ;
Тестирование в оболочке GF:
> cc -all all_verbs
write / wrote / buy / bought / read
Если вам нужны только времена, вы можете написать это:
write : Str = variants {"write" ; "wrote"} ;
buy : Str = variants {"buy" ; "bought"} ;
В оболочке GF выглядит так:
> cc -all write
write / wrote
Времена как варианты в грамматике приложения
Я написал небольшую грамматику приложения, в которой демонстрирую лучший способ сделать это с помощью RGL. Ссылка здесь: https://gist.github.com/inariksit/b444a01b0a23468b7a558e39c6ce06fd Важно, как вы видите в коде, что глаголы полностью нормальные, и мы добавляем варианты только на уровне предложения. Это намного безопаснее, чем пытаться вводить варианты в таблицах склонений глаголов.
Эта грамматика ведет себя следующим образом:
1.
linearize
выводит только первый вариант.
TenseVariants> l Pred Cat Sleep
the cat sleeps
2.
parse
принимает оба.
TenseVariants> p "the cat sleeps"
Pred Cat Sleep
TenseVariants> p "the cat slept"
Pred Cat Sleep
Если вы хотите контролировать, когда выводить "засыпает", а когда "засыпает", то вы не можете сделать это с вариантами: вам действительно нужно иметь два разных абстрактных синтаксических дерева, которые соответствуют двум выводам.
Однако, если вам нужно вывести только одну из форм, но вы хотите проанализировать обе, то варианты - правильный выбор.
Недетерминизм в GF
Мне любопытно, по какой причине вы хотели поместить все глаголы в один и тот же вариант? Уже можно сгенерировать все комбинации с помощью GF, используя
gt
("сгенерировать деревья") команда:
TenseVariants> gt Pred Cat ? | l
the cat reads
the cat sleeps
the cat writes
Знак вопроса стоит на месте глагола, а что
gt
заключается в том, что он заменяет вопросительный знак на все подходящие выражения в грамматике.[1]
Совместите это с флагом
-all
для линеаризации, и вы получите следующее:
TenseVariants> gt Pred Cat ? | l -all
the cat reads
the cat read
the cat sleeps
the cat slept
the cat writes
the cat wrote
Если я неправильно понял вашу цель с вариантами, или что-то еще непонятно, дайте мне знать, и я буду рад уточнить!
[1] Попробуйте выполнить эту команду в грамматике ресурсов и посмотрите, что произойдет!
$ gf alltenses/LangEng.gfo
Lang> gt PredVP (UsePron ?) (UseComp (CompAP (PositA ?)))
Вы получите длинный список вещей. Если вы хотите сгенерировать только один, используйте команду
gr
("генерировать случайный").
Lang> gr PredVP (UsePron ?) (UseComp (CompAP (PositA ?))) | l -treebank
Lang: PredVP (UsePron i_Pron) (UseComp (CompAP (PositA bad_A)))
LangEng: I am bad