首页 > 解决方案 > GF 中的关系从句 (which)

问题描述

“玩玩具总动员去年出版”

Sentence = mkUtt( mkImp (mkVP
                (mkV2 "play")
                (mkNP (mkCN 
                    (mkCN (mkN "Toy Story"))
                    (mkS pastTense simultaneousAnt(mkCl (mkVP 
                        (mkV2 "publish")
                        (mkNP (mkCN (mkN "last yser")))
                        )))
                    ))
        ));

在 GF 中创建关系从句句子时,句法 S for sentence 总是会在两个句子之间添加是否有任何方法可以替换为which

标签: gf

解决方案


首先,您制作的结构不是相对子句,而是这种结构:

mkCN : CN -> S -> CN -- rule that she sleeps

相对子句具有RSRGL 中的类型。

如何构建一个实际的 RS

在这里,我逐渐构建了 RS。如果您愿意,请随意将这些步骤放回一个表达式,但我发现这样的事情更清楚。

oper
  last_year_Adv : Adv = ParadigmsEng.mkAdv "last year" ;

  published_last_year_VP : VP = mkVP (passiveVP (mkV2 "publish")) last_year_Adv ;

  which_is_published_last_year_RCl : RCl = mkRCl which_RP published_last_year_VP ;

  which_was_published_last_year_RS : RS = mkRS pastTense which_is_published_last_year_RCl ;

lin
  play_TS = mkUtt (mkImp (mkVP
                            (mkV2 "play")
                            (mkNP
                               (mkNP (mkPN "Toy Story"))
                               which_was_published_last_year_RS)
                         )
                  ) ;

现在,当我们在 GF shell 上测试它时,我们看到尽管有名字,但which_RP实际上是“那个”。

> l play_TS 
play Toy Story , that was published last year

如何将“那个”变成“哪个”

当你想创建一个新的词法项时,首先要检查的是 Paradigms 模块。不幸的是,没有mkRP英语。诸如关系代词之类的东西通常被认为是封闭的类:它们只有一小部分,固定数量。封闭类的其他例子是基本数字(你不能只是在 4 和 5 之间组成一个新的整数!)和限定符。将此与诸如名词、动词和形容词之类的开放课程进行对比,这些课程一直在弹出。对于公开课,Paradigms 模块有很多选择。但不适用于封闭类,如关系代词。

因此,如果 Paradigms 没有帮助,接下来要检查的是特定于语言的Extra模块。

检查特定语言的额外模块

如果您在自己的计算机上拥有 RGL 源代码,则只需转到该目录gf-rgl/src/english并 grep 获取which. 或者您可以使用RGL 浏览器搜索感兴趣的功能。

说明如何使用 RGL 源代码浏览器

而且在ExtraEng中确实有一个关系代词,也叫which_RP. (还有一个叫做who_which_RP.)所以现在你可以在你的语法中做这些修改:

concrete MyGrammarEng of MyGrammar = 
  open SyntaxEng, 
       ParadigmsEng, 
       ExtraEng -- Need to open ExtraEng in the concrete!
    in ** {

-- … as usual, except for

oper
 which_is_published_last_year_RCl : RCl = 
   mkRCl ExtraEng.which_RP -- Use the ExtraEng.which_RP!
         published_last_year_VP ;

其余的代码和以前一样。这会产生您想要的结果。

> l play_TS 
play Toy Story , which was published last year

最后的黑客攻击

因此,您查看了所有可能的模块,但一无所获。考虑将其作为gf-rgl 存储库中的一个问题,如果它是明显错误或缺失的东西。

但无论如何,这里有一个通用的、不安全的技巧来快速构建你想要的东西。

首先,让我们看一下 CatEng 中RPlincat{s : RCase => Str ; a : RAgr}. 然后让我们看看它在RelativeEng中的实现。在那里,您还可以看到为什么总是“that”的解释:与whowhich不同,“that”适用于有生命和无生命的 NP。

所以我会这样做来强制字符串“which”:

oper
  myWhich_RP : RP = which_RP ** {s = table {_ => "which"}} ;

**语法意味着记录扩展。我们使用原始的所有其他字段which_RP,但在s字段中,我们放置了一个表,其所有分支都包含字符串“which”。(您可以在我的博客中阅读有关此技术的更多信息。)

myWhich_RP然后我们在形成关系子句时使用新定义的:

oper
  which_is_published_last_year_RCl : RCl = mkRCl myWhich_RP published_last_year_VP ;

这也有效,但不安全,因为每当 RGL 更改时,任何触及原始实现的代码都可能中断。


推荐阅读