本章有两个主要目标:

1.研究DCG表示法提供的两个重要功能:额外的参数和额外的

目标。

2.讨论DCGs的现状和局限性。

1  额外参数

在上一章中,我们介绍了基本的DCG表示法。但是DCG所提供的功能远远超过我们迄今为止所看到的。首先,DCG允许我们指定额外的参数。多余的参数可以用于许多目的。我们将研究三个。

上下文无关文法的特性

作为第一个例子,让我们看看如何使用额外的参数向上下文无关文法添加特性。

这是我们在上一章中使用的DCG:

s --> np,vp.

np --> det,n.

vp --> v,np.

vp --> v.

det --> [the].

det --> [a].

n --> [woman].

n --> [man].

v --> [shoots].

现在,假设我们要处理“她向他开枪”和“他向她开枪”这样的句子。我们应该做什么?好吧,显然,我们应该添加规则,说“he”,“she”,“him”和“her”是代词:

pro --> [he].

pro --> [she].

pro --> [him].

pro --> [her].

此外,我们应该添加一条规则,说名词短语可以是代词:

np --> pro.

在这个新的DCG中有什么好处?好吧,到目前为止,它是可行的。例如:

?- s([she,shoots,him],[]).

true.

但是有一个明显的问题。 DCG还将接受很多明显错误的句子,例如“A woman shoots she”,“Her shoots a man”和“Her shoots she”:

?- s([a,woman,shoots,she],[]).

true.

?- s([her,shoots,a,man],[]).

true.

?- s([her,shoots,she],[]).

true.

就是说,语法不知道“she”和“he”是主语代词,不能用于宾语位置;因此,“A woman shoots she”是不对的,因为它违反了有关英语的这一基本事实。而且,语法不知道“her”和“him”是宾语代词,不能在主语中使用。因此,“Her shoots a man”是不对的,因为它违反了这一限制。至于“Her shoots she”,这要设法使两个问题都立即报出错误。

现在,很明显我们必须做些什么来纠正这个错误:我们需要扩展DCG,使其包含哪些代词可以出现在主语位置,哪些代词可以出现在宾语位置的信息。有趣的问题是:我们到底该怎么做?首先,让我们看看一种简单的纠正方法,即添加新规则:

s --> np_subject,vp.

np_subject --> det,n.

np_object --> det,n.

np_subject --> pro_subject.

np_object --> pro_object.

vp --> v,np_object.

vp --> v.

det --> [the].

det --> [a].

n --> [woman].

n --> [man].

pro_subject --> [he].

pro_subject --> [she].

pro_object --> [him].

pro_object --> [her].

v --> [shoots].

现在,此解决方案“有效”。例如,

?- s([her,shoots,she],[]).

false.

但无论是计算机科学家还是语言学家都不会认为这是一个好的解决方案。麻烦的是,一个小的词汇添加导致了DCG发生了很大的变化。让我们面对现实吧:“she”和“her”(还有“he”和“him”)在很多方面都是一样的。但是,为了处理它们不同的属性(即它们在句子中出现的位置),我们不得不对语法进行重大修改:特别是,我们将名词短语规则的数量增加了一倍。如果我们不得不做进一步的改变(例如,处理复数名词短语),事情会变得更糟。我们真正需要的是一个更微妙的编程机制,它允许我们处理这些事实,而不必一直被迫添加规则。这就是额外的参数起作用的地方。请看下面的语法:

s --> np(subject),vp.

np(_) --> det,n.

np(X) --> pro(X).

vp --> v,np(object).

vp --> v.

det --> [the].

det --> [a].

n --> [woman].

n --> [man].

pro(subject) --> [he].

pro(subject) --> [she].

pro(object) --> [him].

pro(object) --> [her].

v --> [shoots].

需要注意的是,这个新语法只包含一个新的名词短语规则。事实上,它与我们所写的第一个语法非常相似,只是现在符号np与一个新的参数(主语、宾语或x)相关联。一位语言学家会说,我们添加了一些特征来区分各种名词短语。尤其要注意代词的四个规则。这里我们用额外的参数来说明哪些代词可以出现在主语位置,哪些可以出现在宾语位置。因此,这些规则是最基本的,因为它们为我们提供了如何使用这些代词的基本事实。

那么其他规则怎么办?好吧,直觉上,规则

np(X) --> pro(X).

使用额外的参数(变量X)将这些关于代词的基本事实传递给由它们构成的名词短语:由于变量X用作np和代词的额外参数,Prolog 合一将保证给它们相同的值。特别是,如果我们使用的代词是“she”(在这种情况下X=主语),那么np将(通过它的额外参数X=主语)标记为主语np。另一方面,如果我们使用的代词是“her”(在这种情况下X=宾语),那么np的额外参数也将标记为X=宾语。当然,这正是我们想要的行为。

另一方面,尽管名词短语是使用规则构建的

np(_) --> det, n.

还有一个额外的参数,我们使用了匿名变量作为它的值。本质上,这意味着可以是,这是正确的,因为使用这一规则构建的表达式(如“the man”和“the woman”)可以用于主语和宾语位置。

现在考虑规则

vp --> v, np(object).

这说明要应用这个规则,我们需要使用一个名词短语,它的额外参数与宾语相结合。这可以是由宾语代词构成的名词短语,也可以是由匿名变量作为额外参数值的名词短语,如“the man”和“the woman”。关键的是,标记代词有主语作为附加参数的值,不能用在这里:原子、宾语和主语不合一。注意规则

s --> np(subject),vp.

以类似的方式防止由宾语代词构成的名词短语以主语的形式结束。

这可行。您可以通过构成查询来检查它:

?- s(X,[]).

当您逐步完成回答时,您将看到只生成可接受的英语。

不过,虽然刚才给出的直观解释是正确的,但到底发生了什么?要记住的关键是DCG规则只是一个方便的缩写。例如,规则

s --> np, vp.

是真正的语法糖

s(A,B):-

np(A,C),

vp(C,B).

也就是说,正如我们在上一章中所了解到的,DCG符号是一种隐藏负责差分表表示的两个参数的方法,这样我们就不必考虑它们了。我们使用友好的用户表示法,Prolog将其转换为刚刚给出的子句。

好吧,那么我们显然需要问

s --> np(subject),vp.

翻译成。答案如下:

s(A,B):-

np(subject,A,C),

vp(C,B).

现在应该清楚了,“额外参数”这个名称是一个很好的名称:正如这个翻译所表明的,主题符号实际上只是普通prolog规则中的一个额外参数。类似地,我们的名词短语dcg rules转换为

np(A,B,C) :-

det(B,D),

n(D,C).

np(A,B,C) :-

pro(A,B,C).

注意,这两个规则都有三个参数。第一个A是额外参数,最后两个是普通的隐藏DCG参数(这两个隐藏参数始终是最后两个参数)。

顺便问一下,你认为我们如何用语法来列出语法名词短语?好吧,如果我们使用的是DCG规则np—>det,n(即,一个没有额外参数的规则),我们就可以进行查询

?-np(NP,[]).

因此,鉴于我们刚刚了解到的额外参数,我们需要提出查询并不奇怪

?- np(X,NP,[]).

与我们的新DCG一起使用时。响应如下:

X = _2625

NP = [the, woman] ;

X = _2625

NP = [the, man] ;

X = _2625

NP = [a, woman] ;

X = _2625

NP = [a, man] ;

X = subject

NP = [he] ;

X = subject

NP = [she] ;

X = object

NP = [him] ;

X = object

NP = [her] ;

false

最后一句话:不要被我们示例语法的这种简单性所误导。额外的参数可以用来处理一些复杂的语法问题。DCG不再是过去最先进的语法开发工具,但它们也不是玩具。一旦知道如何使用额外的参数编写DCG,就可以编写一些相当复杂的语法。

建立解析树

到目前为止,我们所讨论的程序已经能够识别语法结构(即,当被问及输入是句子、名词短语等时,它们可以正确回答是或否),并生成语法输出。这是令人愉快的,但我们也希望能够解析。也就是说,我们希望我们的程序不仅能告诉我们哪些句子是语法上的,而且能给我们分析它们的结构。特别是,我们想看看语法赋予句子的树。

好吧,仅仅使用标准的prolog工具,我们实际上不能画出漂亮的树的图片,但是我们可以构建清晰描述树的数据结构。例如,对应于树

我们可以使用以下项:

s(np(det(a),n(woman)),vp(v(shoots))).

当然:看起来不太好,但所有的信息都在图上。而且,在一个像样的图形包的帮助下,很容易把这个项变成图。

但我们如何让DCGs建立这样的项呢?实际上,这很简单。毕竟,事实上,DCG在识别句子时必须找出树的结构。所以我们只需要找到一种方法来跟踪DCG发现的结构。我们通过添加额外的参数来实现这一点。以下是方法:

s(s(NP,VP)) —> np(NP),vp(VP).

np(np(DET,N)) --> det(DET),n(N).

vp(vp(V,NP)) --> v(V),np(NP).

vp(vp(V)) --> v(V).

det(det(the)) --> [the].

det(det(a)) --> [a].

n(n(woman)) --> [woman].

n(n(man)) --> [man].

v(v(shoots)) --> [shoots].

这里发生了什么?本质上,我们正在为规则左侧的语法类别构建解析树,而不是为规则右侧的语法类别构建解析树。考虑规则vp(vp(V,NP))-->v(V),np(NP)。当我们使用这个DCG进行查询时,V in v(V)和NP in np(NP)将被实例化为表示解析树的项。例如,也许V将被实例化为

v(shoots).

NP将被实例化为

np(det(a), n(wpman)).

由这两种结构组成的vp对应的项是什么?显然应该是这样的:

vp(v(shoots),np(det(a),n(woman))).

这正是规则vp(vp(V,NP))-> v(V),np(NP)中给出的额外参数vp(V,NP)返回给我们的:一个函子为vp的项,并且其第一个和第二个自变量分别是V和NP的值。非正式地讲:将V和NP项插入vp函子下。

为了解析句子“A woman shoots”,我们提出以下查询:

?- s(T,[a,woman,shoots],[]).

也就是说,我们要求将额外的参数T实例化为该句子的解析树。我们得到:

T = s(np(det(a),n(woman)),vp(v(shoots)))

true

此外,我们可以通过执行以下查询来生成所有解析树:

?- s(T,S,[]).

前三个响应是:

T = s(np(det(the),n(woman)),

vp(v(shoots),np(det(the),n(woman))))

S = [the,woman,shoots,the,woman] ;

T = s(np(det(the),n(woman)),

vp(v(shoots),np(det(the),n(man))))

S = [the,woman,shoots,the,man] ;

T = s(np(det(the),n(woman)),

vp(v(shoots),np(det(a),n(woman))))

S = [the,woman,shoots,a,woman]

简而言之,我们刚刚看到了一个优雅的(有用的)示例,说明如何使用合一来构建结构。

额外的参数也可以用来构建语义表示。现在,我们没有谈论任何DCG中的单词的含义。事实上,现在人们对自然语言的语义已经有了很多的了解,而且建立语义表示法是非常容易的,它可以部分地捕捉句子甚至整个语篇的语义。这种表示通常是某种形式语言(例如一阶逻辑、语篇表示结构或数据库查询语言)的表达式,它们通常是组合构建的。也就是说,每个单词的意义都是用形式语言表达的;这个意义是作为单个单词的DCG条目中的额外参数给出的。然后,对于语法中的每个规则,一个额外的参数显示如何组合两个子组件的含义。例如,对于规则s —> np,vp,我们将添加一个额外的参数,说明如何将np含义和vp含义组合起来形成s含义。尽管语义构建过程有些复杂,但它与我们从句子子部分的解析树构建句子的解析树的方式非常相似。

超越上下文无关的语言

在上一章中,我们介绍了DCG作为一种有用的Prolog工具,用于表示和使用上下文无关的语法。现在,这当然是思考DCG的一种好方法,但这还不是全部。事实是:DCG可以处理的不仅仅是上下文无关的语言。我们一直在讨论的额外论点(实际上,我们不久将介绍的额外目标)为我们提供了应对任何可计算语言的工具。我们将通过为形式语言anbncn \ {ǫ}提供一个简单的DCG来说明这一点。

形式语言anbncn \ {ǫ}由as,bs和cs组成的所有非空字符串组成,其中包括a的连续块,bs的连续块和cs的连续块,所有具有相同长度的三个块。例如,abc,aabbcc和aaabbbccc都属于anbncn \ {ǫ}。

有趣的是,这种语言不是上下文无关的,你想怎么写就怎么写,你就不能成功地写出上下文无关的语法来精确地生成这些字符串。证明这一点会让我们走得太远,但证明并不特别困难,你可以在许多关于形式语言理论的书籍中找到它。

另一方面,正如我们现在所看到的,编写生成这种语言的DCG非常容易。就像上一章一样,我们将字符串表示为表。例如,字符串abc将使用表[a,b,c]表示。根据这个约定,这是我们需要的DCG:

s(Count) --> ablock(Count),bblock(Count),cblock(Count).

ablock(0) --> [].

ablock(succ(Count)) --> [a],ablock(Count).

bblock(0) --> [].

bblock(succ(Count)) --> [b],bblock(Count).

cblock(0) --> [].

cblock(succ(Count)) --> [c],cblock(Count).

DCG的基础思想很简单:我们使用一个额外的参数来跟踪块的长度。 s规则只是说我们要一个as块,一个bs块,再一个cs块,并且三个块的长度都相同,即Count。

Count的值应该是什么?显而易见的答案是:1、2、3、4,依此类推。但是,到目前为止,我们还不知道如何将DCG和算术混合使用,因此这不是很有帮助。幸运的是,如本DCG所示,这是一种更简单(更优雅)的方式。就像我们用0表示数字0一样,用succ(0)表示数字1,用succ(succ(0))表示数字2,用succ(succ(succ(0)))表示数字3,依此类推,就像我们在第3章中做了(就像我们在第3章中所说的,您可以将succ理解为“的继承人”)。这种符号选择使我们能够使用统一计数。

这正是我们新的DCG所做的。例如,假设我们提出以下查询:

?- s(Count,L,[]).

它要求Prolog生成属于该语言的符号表L,并给出生成每个项目所需的Count值。然后前四个响应是:

Count = 0

L = [] ;

Count = succ(0)

L = [a, b, c] ;

Count = succ(succ(0))

L = [a, a, b, b, c, c] ;

Count = succ(succ(succ(0)))

L = [a, a, a, b, b, b, c, c, c]

Count的值显然对应于块的长度。

因此:DCG不仅是用于处理上下文无关文法的工具,它们的功能还远远不止这些,而且(如我们所见),部分额外的功能来自使用额外的参数。

2   额外目标

对于常规的Prolog规则,任何DCG规则实际上都是语法糖。因此,允许我们使用其他参数并不奇怪。同样,我们可以从DCG规则的右侧调用任何Prolog谓词也就不足为奇了。

例如,通过调用Prolog的内置算术功能,可以将上一部分的DCG调整为使用Prolog编号(而不是数字的后继表示形式)。我们只计算生成了as,bs和cs的数量。这是代码:

s --> ablock(Count),bblock(Count),cblock(Count).

ablock(0) --> [].

ablock(NewCount) --> [a],ablock(Count),

{NewCount is Count + 1}.

bblock(0) --> [].

bblock(NewCount) --> [b],bblock(Count),

{NewCount is Count + 1}.

cblock(0) --> [].

cblock(NewCount) --> [c],cblock(Count),

{NewCount is Count + 1}.

如本例所示,可以在DCG规则的右侧(任何地方)编写额外的目标,但必须将其放置在大括号之间。当Prolog在将DCG转换为其内部表示形式时遇到此类大括号时,它只将花括号之间指定的额外目标进行转换。因此,上述非终端ablock的第二条规则将转换为:

ablock(NewCount,A,B):-

’C’(A, a, C),

ablock(Count, C, B),

NewCount is Count + 1.

顺便说一下,如果您使用此DCG,您会发现它实际上存在一些问题。与上一节中看到的相反,此新版本仅在识别模式下使用时才能正确运行。如果尝试使用它生成,它将在某个时候进入无限循环。我们不会在这里解决此问题(除了其他方面,我们发现较早的基于succ的方法更为优雅)。

在DCG规则的右侧添加任意Prolog目标的可能性使DCG非常强大(这意味着我们可以做普通Prolog中可以做的任何事情)。但是,一般而言,此功能使用不多,这往往表明基本的DCG标记设计得很好。但是,在计算语言学中有一个经典的应用程序可以实现额外的目标:借助额外的目标,我们可以将语法规则和词汇信息整齐地分开。让我们看看如何。

分隔规则和词典

我们将规则和词典分开。也就是说,我们将消除DCG中所有提及单个词的内容,而是将所有有关单个词的信息分别记录在词典中。要了解其含义,请返回基本语法:

np --> det,n.

vp --> v,np.

vp --> v.

det --> [the].

det --> [a].

n --> [woman].

n --> [man].

v --> [shoots].

现在,我们要编写一种DCG,该DCG生成完全相同的语言,但是没有规则提及任何单个单词。有关单个单词的所有信息将单独记录。

这是一个(非常简单的)词典的示例。词汇条目是使用谓词lex / 2进行编码的,谓词lex / 2的第一个参数是单词,第二个参数是句法类别。

lex(the,det).

lex(a,det).

lex(woman,n).

lex(man,n).

lex(shoots,v).

这是此词典可以使用的简单语法。从本质上讲,它与上一个相同。实际上,唯一改变的规则是那些提到特定单词的规则,即det,n和v规则。

np --> det,n.

vp --> v,np.

vp --> v.

det --> [Word],{lex(Word,det)}.

n --> [Word],{lex(Word,n)}.

v --> [Word],{lex(Word,v)}.

考虑新的det规则。该规则部分说“ det可以包含一个包含单个元素Word的表”(请注意Word是一个变量)。然后,额外的目标添加了至关重要的规定:“只要Word与词典中列出的确定词合一即可”。对于我们目前的词典,这意味着Word必须与单词“ a”或“ the”匹配。因此,这条规则取代了先前的两个DCG规则det。

这解释了将规则与词典分离的“how”,但没有解释“why”。真的那么重要吗?这种写DCG的新方法真的好吗?

答案是肯定的!它要好得多,至少有两个原因。

第一个原因是理论上的。可以说,规则不应提及特定的词汇项目。规则的目的是列出一般的语法事实,例如句子可以由名词短语和动词短语组成的事实。 s,np和vp的规则描述了这样的一般语法事实,但是det,n和v的旧规则却没有。取而代之的是,旧规则只是列出了特定的事实:“ a”是确定因素,“ the”是确定因素,依此类推。从理论的角度来看,只有一条规则说“任何事物都是决定因素(或名词,动词或任何事物, 其他语法类别)(如果在词典中这样列出)。当然,这正是我们新的DCG规则所说的。

第二个原因是更实际的。计算语言学家在过去二十年左右的时间里学到的关键课程之一是,词典是迄今为止最有趣,最重要(且最昂贵!)的语言知识库。坦率地说,如果您想从计算的角度掌握自然语言,则需要了解很多单词,并且需要了解很多有关单词的知识。

现在,我们的小词典及其简单的两位词典条目成为了一个玩具。但是,真正的词典不是(最强调!)。真实的词典可能很大(可能包含成千上万个单词),而且与每个单词相关的信息可能非常丰富。我们的词法条目仅给出每个单词的句法类别,但是真正的词库将给出更多信息,例如有关其语音,形态,语义和语用属性的信息。

因为真实的词典既大又复杂,所以从软件工程的角度来看,最好编写具有简单,定义明确的方法的简单语法,以从大量词典中提取所需的信息。也就是说,应将语法视为可以访问词典中包含的信息的单独实体。然后,我们可以使用专门的机制来有效地存储词典并从中检索数据。

我们的新DCG规则虽然简单,但却说明了基本思想。新规则确实只列出了一般的语法事实,而额外的目标充当了我们词典的接口,从而使规则可以准确地找到所需的信息。此外,我们现在利用Prolog的第一个参数索引功能,可以使在词典中查找单词的效率更高。第一个参数索引是一种使Prolog知识库访问更加有效的技术。如果在查询中实例化了第一个参数,则它允许Prolog忽略第一个参数的函子和参数数量不同的所有子句。例如,这意味着我们可以立即获得所有可能的人类别甚至不必查看词典中可能存在的所有其他成百上千个单词的词典条目。

3   结束语

现在,我们对DCG是什么以及它们可以为我们做什么有相当有用的了解。总而言之,让我们从更高的层次,从形式和语言的角度来考虑它们。

首先是正式讲话。在大多数情况下,我们已将DCG展示为一种简单的工具,用于对上下文无关的语法(或富含主语和宾语等特征的上下文无关的语法)进行编码。但是DCG不仅于此。我们看到有可能编写DCG来生成不是上下文无关的语言。实际上,任何程序都可以用DCG表示法编写。也就是说,DCG本身就是一种成熟的编程语言(使用适当的术语,它们是图灵完备的)。尽管DCG通常与语言应用程序相关联,但它们可用于其他目的。

从语言角度看,DCG有多好?好吧,好坏参半。在一个阶段(1980年代初),它们几乎是最先进的。他们使以清晰的方式编写复杂的语法成为可能,并探索了句法和语义观念的相互作用。当然,任何计算语言学的解析历史都会给DCG带来荣誉。

但是,DCG具有缺点。首先,当目标排序错误时(他们在上一章中看到了为联结添加左递归规则的示例),他们倾向于循环的趋势令人讨厌。我们在编写严肃的语法时不想考虑这些问题。此外,虽然添加额外参数的功能很有用,但如果我们需要使用大量参数(对于大语法,我们会使用),则它是一种相当笨拙的机制。

但是,请务必注意,由于Prolog解释DCG规则的方式而出现了这些问题。它们不是DCG表示法固有的。那些研究过解析算法的人可能都知道所有自顶向下的解析器都在左递归语法上循环,因此Prolog以自顶向下的方式解释DCG的过程在左递归语法规则上循环也就不足为奇了。 s—> s conj s。如果我们使用不同的策略来解释DCG,例如自底向上的策略,我们将不会遇到相同的问题。同样,如果我们不使用Prolog对DCG的内置解释,则可以使用额外的参数来更复杂地指定功能,例如 这将有助于使用大型特征结构。

综上所述,如今DCG可能最好被视为定义带有某些功能增强的上下文无关文法的好记法,一种表示(忽略左递归)兼用作解析器/识别器的记法,也就是说,最好将它们视为方便的工具。用于测试新的语法思想,或用于为特定应用程序实施合理的复杂语法。 DCG不再是最新技术,但它们很有用。即使您以前从未编程过,也只需使用到目前为止所学的知识,就可以开始尝试进行相当复杂的语法编写。使用传统的编程语言(例如C ++或Java),根本不可能 这么快到达这个阶段。使用功能性语言(例如Lisp,Caml或Haskell)会更容易,但是即使如此,对于初学者是否能这么早地完成如此之举还是值得怀疑的。

练习

练习8.1  这是我们的基本DCG:

s --> np,vp.

np --> det,n.

vp --> v,np.

vp --> v.

det --> [the].

det --> [a].

n --> [woman].

n --> [man].

n --> [apple].

n --> [pear].

v --> [eats].

假设我们添加名词“ men”(复数)和动词“ know”。然后,我们需要一个DCG,说“The men eat”可以,“The man eats”可以,“The men eats”不能,而“The man eat”不能。更改DCG,使其正确处理这些句子。使用额外的参数来应对单数/复数区别。

练习8.2   在本文中,我们仅给出了带有一个额外参数的DCG规则示例,但实际上您可以根据需要添加任意数量的额外参数。这是DCG规则,其中包含三个额外的参数:

kanga(V,R,Q) --> roo(V,R),jumps(Q,Q),{marsupial(V,R,Q)}.

将其转换为Prolog使用的形式。

5   实践环节

练习8的目的是帮助您熟悉使用附加参数和目标的DCGs。

首先是一些键盘练习:

1.使用DCG跟踪一些示例,该DCG使用额外的参数来处理主题之间的区别,DCG生成解析,而DCG使用额外的目标来分隔词典和规则。确保您完全了解所有三个DCG的工作方式。

2.在DCG上对文本中给出的anbncn进行跟踪(给Count变量赋值为0,succ(0),succ(succ(0)等)。尝试使用as,bs和cs这三个块的长度确实相同的情况,以及不存在这种情况的查询。

现在进行一些编程。我们建议以下微型项目,它借鉴了您到目前为止所学的所有知识。顺便说一句,在第12章末尾的实践环节上,我们将要求进一步扩展这项工作,因此请认真对待该项目。

1.首先,将我们学到的所有关于DCG的英语知识汇总到一个DCG中。特别是,在本文中,我们看到了如何使用额外的参数来处理主语/宾语的区别,在练习中,您被要求使用额外的参数来处理单数/复数的区别。编写处理这两个问题的DCG。此外,以这样一种方式编写DCG:它将生成解析树,并使用单独的词典。

2.完成此操作后,请扩展DCG,以便可以用形容词和简单的介词短语来修饰名词短语(也就是说,它应该能够处理名词短语,例如“the small frightened woman on the table”或“the big fat cow under the shower”)。然后,进一步扩展它,以便正确处理第一,第二和第三人称代词之间的区别(以主语和宾语形式)。

根据文法画出语法树_更多确定子句语法相关推荐

  1. 根据文法画出语法树_几种常用的英语教学法误导了语法教学

    多年来,我国的英语教学一直采用语法翻译法,教法比较单一.上世纪八十年代初,随着国际交流的日益加强和教学改革的进一步深入,各种英语教学法,尤其是从国外推介的教学法都相继进入英语教学领域.尽管有一些教学法 ...

  2. 根据文法画出语法树_编译工程5:语法分析(3)

    接下来我们讨论自顶向下文法分析方法中的非递归的预测分析. 自顶向下文法分析可以看做是为1. 输入串构造语法分析树的问题,它从语法分析树的根开始,深度优先地按照先根顺序创建语法分析树的各个节点.2.也可 ...

  3. 根据文法画出语法树_输入语法推断的强化学习

    引用:Wu Z, Johnson E, Yang W, et al. REINAM: reinforcement learning for input-grammar inference[C]. fo ...

  4. 编译原理学习笔记(二十九)~习题:分析句子 id--id*id的 最右推导过程,画出分析树,找出和分析过程中每一步的对应关系。

    题目 分析句子 id–id*id的 最右推导过程,画出分析树,找出和分析过程中每一步的对应关系. 语法如下: E → E - T (1) E → T (2) T → T * F (3) T → F(4 ...

  5. 【LaTex树状图】LaTex画树状图_编译原理语法树_直角分叉_Forking links

    语法树 过程 使用Overleaf在线编辑LaTex,由于使用汉字ctex包,需在overleaf中将编译器换成XeLaTex(界面左上角Menu→Compiler→XeLaTex). 详细语法参考V ...

  6. antlr4 代码 语法树_使用ANTLR4,用于代码镜像和基于Web的DSL的Primefaces扩展

    antlr4 代码 语法树 DSL是很酷的东西,但我不清楚它们有什么用. 然后我意识到它们对以下方面有好处: 摆脱复杂的UI 意思是 更快的做事方式 而已. 当我阅读此博客时,我得出了这个结论. 如果 ...

  7. 【编译原理】-- 第二章(二)(短语、简单短语、句柄、文法二义性、语法树、例题)

    目录 一.句型的分析 1.规范推导和规范归约 2.短语.简单短语和句柄 3.语法树 4.通过树来寻找短语.简单短语.句柄 二.文法的二义性 1.文法二义性的定义 2.文法二义性的消除 (1)定义规定或 ...

  8. ast抽象语法树_新抽象语法树(AST)给 PHP7 带来的变化

    本文大部分内容参照 AST 的 RFC 文档而成:https://wiki.php.net/rfc/abstract_syntax_tree,为了易于理解从源文档中节选部分进行介绍. 我的官方群点击此 ...

  9. python根据频率画出词云_利用pandas+python制作100G亚马逊用户评论数据词云

    原标题:利用pandas+python制作100G亚马逊用户评论数据词云 数据挖掘入门与实战 公众号: datadw 我们手里面有一个差不多100G的亚马逊用户在购买商品后留下的评论数据(数据格式为j ...

最新文章

  1. 人脸识别:insightface自定义数据集制作 | 附练手数据集
  2. CVPR 2021 顶会冠军图像分割算法全解密
  3. Python从菜鸟到高手(2):清空Python控制台
  4. I/O:OutputStream
  5. tomcat8+在maven中热部署
  6. 【点击模型学习笔记】Predicting Clicks_Estimating the Click-Through Rate for New Ads_MS_www2007...
  7. 全面解析 Netflix 的微服务架构设计
  8. linux 下 eclipse 开发环境的搭建
  9. Go的数组切片 Python的列表
  10. 环形数组求最大子数组之和
  11. RHEL7.0手动安装
  12. python打印tensor_如何在TensorFlow中打印SparseTensor内容?
  13. Oracle工作中常用函数的总结
  14. 谷歌浏览器安装去除网页广告插件
  15. cJSON字符串解析
  16. Linux文本处理三剑客之grep
  17. vue侧边栏菜单一二级模板
  18. 温度传感器采集温度数据通过网关上传至ThingsBoard平台
  19. 怎么查看CAD图纸并更改图纸背景颜色?
  20. spring boot 项目 事务 不能回滚 代理(not eligible for auto-proxying)

热门文章

  1. Synchronize对象锁
  2. ifix从sqlserver里读数据_ifix连接SQL和读写EXCEL的方法
  3. 33岁逃离北京,看到的是希望还是悲剧呢?
  4. 看看人家那后端API接口写得,那叫一个巴适~,再看看我的,像坨屎!
  5. MySQL大数据量分页查询方法及其优化
  6. shiro教程:记住我功能
  7. 电脑分辨率设置工具_干货分享:PPT 导出高清分辨率图片的四种方法
  8. 排序算法系列:快速排序算法
  9. UML图系列——UML概要
  10. 为 springboot 添加 debug功能