我正在尝试为莫尔斯电码训练器生成随机的英语练习短语。我想弄清楚如何用英语处理性别协议(protocol)。我希望能够生成诸如“他是儿子”、“她是母亲”、“这是一扇门”之类的短语,但要避免诸如“他是母亲”、“她是一扇门”之类的短语, “这是一位父亲”。 “他是一位母亲”混合了性别,而像“她是一扇门”和“它是一位父亲”这样的句子则混合了人类/非人类。看来在rgl中,人类和非人类都有Gender
类型。
有时候这种事情是可以接受的,比如“没有人是一座孤岛”这句话。而且,出于某种原因,性别揭露派对经常使用诸如“这是一个男孩!”之类的短语。但是,我只是想生成训练数据,所以我尝试关注常见用法。
我对语法框架非常陌生,所以我的做法可能完全错误。这是我到目前为止所拥有的,
在Agreement.gf
abstract Agreement = {
flags startcat = Message ;
cat
Message ; Subject ; SubjectComplement ;
fun
Is : Subject -> SubjectComplement -> Message ;
He, She, It : Subject;
Son, Daughter, Father, Mother, Fence, Door : SubjectComplement;
}
在AgreementEng.gf
concrete AgreementEng of Agreement = open DictEng, SyntaxEng, ParadigmsEng, VerbEng, ResEng in {
lincat
Message = Cl ;
Subject = NP;
SubjectComplement = CN;
lin
Is s sc = mkCl s sc;
He = DictEng.he_Pron;
She = DictEng.she_Pron;
It = DictEng.it_Pron;
Son = mkCN son_N;
Daughter = mkCN daughter_N;
Mother = mkCN mother_N;
Father = mkCN father_N;
Fence = mkCN fence_N;
Door = mkCN fence_N;
}
如果我将其加载到 gf
中并运行 generate_random |线性化
,它有效,但忽略了性别和人性。
我发现在 DictEng
中代词有一些性别/非人类标记,
lin she_Pron = mkPron "she" "her" "her" "hers" singular P3 feminine ;
lin he_Pron = mkPron "he" "him" "his" "his" singular P3 masculine ;
lin it_Pron = mkPron "it" "it" "its" "its" singular P3 nonhuman;
虽然不适用于大多数名词,
lin mother_N = mkN "mother" "mothers";
lin daughter_N = mkN "daughter" "daughters";
虽然有些确实有性别标记,
lin actor_N = mkN masculine (mkN "actor" "actors");
lin actress_N = mkN feminine (mkN "actress" "actresses");
你会如何处理这个问题?
我愿意接受有关此代码任何方面的建议——而不仅仅是性别问题。我的总体目标是生成越来越复杂、隐约有意义的英语短语。想想 Duo Lingo——不过是摩尔斯电码。我将有一系列训练级别,这些级别建立在先前级别的基础上,添加新词汇、更长的句子等。
目前,我不关心非英语语言——这对 future 的我来说是一个问题。我也不需要支持 DictEng
中的所有内容。潜在单词和短语的列表将由手工策划。
使用到目前为止显示的内容,我首先对单个单词进行训练,“he”、“she”、“it”、“is”、“son”等。
然后是简单的短语“他是”,“她是”,“它是”。
最后是完整的句子,如“他是一个儿子”。
然后我会添加复数,“我们”,“他们”,"is",“儿子”等。然后我会单独训练新单词。然后是“我们是”、“他们是”等短语。然后是“我们是父亲”句子。然后我会混合使用单数和复数句子。
因此,在语法文件中,我需要一定的粒度来生成每种不同类型的训练短语。
谢谢!
(不确定这很重要,但我有几十年的 Haskell 经验,并且涉足 Idris 之类的东西。所以我认为我对语法框架语言很好——我的麻烦更多地在于理解库(rgl)和大局) .
最佳答案
RGL Gender
参数仅控制诸如“她看到自己/他看到自己/树看到自己”之类的东西,但没有比这更语义的了。因此,如果您想控制您的句子是否有意义,那么您需要添加自定义参数。
这是一个有效的具体语法,它只是不会线性化性别不匹配的组合。
(顺便说一句,我用 S
替换了你的 Cl
,因为 Cl 对时态、极性、情绪等开放,而英语恰好在GF shell,但你不能相信其他语言会发生这种情况。)
concrete AgreementEng of Agreement = open DictEng, SyntaxEng, ParadigmsEng, Prelude in {
lincat
Message = S ;
Subject = {np : NP ; g : HumanGender} ;
SubjectComplement = {cn : CN ; g : HumanGender} ;
param
HumanGender = M | F | Inanimate ;
lin
Is s sc = case <s.g, sc.g> of {
<Inanimate,Inanimate>
|<M,M>
|<F,F> => mkS (mkCl s.np sc.cn) ;
_ => noS
} ;
He = {np = he_NP ; g = M} ;
She = {np = she_NP ; g = F} ;
It = {np = it_NP ; g = Inanimate} ;
Son = mkSubjCompl son_N M ;
Daughter = mkSubjCompl daughter_N F;
Mother = mkSubjCompl mother_N F ;
Father = mkSubjCompl father_N M ;
Fence = mkSubjCompl fence_N Inanimate ;
Door = mkSubjCompl door_N Inanimate ;
oper
mkSubjCompl : N -> HumanGender -> {cn : CN ; g : HumanGender} = \n,g ->
{cn = mkCN n ; g = g} ;
noS : S = mkS (mkCl (mkN nonExist)) ;
}
此操作 noS
是由 nonExist
token 制成的,这只会引发异常并且不打印任何内容。因此,当您生成所有树并对它们进行线性化时,您将得到以下结果:
Agreement> gt | l
he is a father
he is a son
it is a door
it is a fence
she is a daughter
she is a mother
但是如果你这样做gt | l -treebank
,您会看到它生成了更多树,但只是没有对这些树进行线性化,其中 HumanGender
不匹配。
对于更温和的选项,您可以让它输出句子(例如“她是父亲”),但在末尾附加一些内容。这是另一种方法,其中第一个具体输出所有内容,但第二个具体仅用于合理性过滤:https://github.com/michmech/plausibility#readme
最后,阅读 this blog post 可能会很有趣。它与你的问题没有直接关系,但它提供了一些如何在 GF 中思考事物的一般哲学。
关于gf - 英语中的随机短语生成和性别/人类一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66478917/