Добавление времен к вариантам на 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
Другие вопросы по тегам