提交 4ca79894 编写于 作者: W wizardforcel

2020-12-29 17:11:16

上级 3e6455ef
......@@ -1391,7 +1391,7 @@ Python 网站提供大量文档。理解内置的函数和标准类型是很重
5. ☼ 通过输入`help(cmp)`阅读关于内置的比较函数`cmp`的内容。它与比较运算符在行为上有何不同?
6. ☼ 创建一个 n-grams 的滑动窗口的方法在下面两种极端情况下是否正确:`n = 1``n = len(sent)`
6. ☼ 创建一个 N 元组的滑动窗口的方法在下面两种极端情况下是否正确:`n = 1``n = len(sent)`
7. ☼ 我们指出当空字符串和空链表出现在`if`从句的条件部分时,它们的判断结果是`False`。在这种情况下,它们被说成出现在一个布尔上下文中。实验各种不同的布尔上下文中的非布尔表达式,看它们是否被判断为`True``False`
......
# 8\. 分析句子结构
前面的章节重点关注词:如何识别它们,分析它们的结构,分配给他们词汇类别,以及获得它们的含义。我们还看到了如何识别词序列或 n-grams 中的模式。然而,这些方法只触碰到支配句子的复杂约束的表面。我们需要一种方法处理自然语言中显著的歧义。我们还需要能够应对这样一个事实,句子有无限的可能,而我们只能写有限的程序来分析其结构和发现它们的含义。
前面的章节重点关注词:如何识别它们,分析它们的结构,分配给他们词汇类别,以及获得它们的含义。我们还看到了如何识别词序列或 N 元组中的模式。然而,这些方法只触碰到支配句子的复杂约束的表面。我们需要一种方法处理自然语言中显著的歧义。我们还需要能够应对这样一个事实,句子有无限的可能,而我们只能写有限的程序来分析其结构和发现它们的含义。
本章的目的是要回答下列问题:
......@@ -14,7 +14,7 @@
## 1.1 语言数据和无限可能性
前面的章节中已经为你讲述了如何处理和分析的文本语料库,我们一直强调处理大量的每天都在增加的电子语言数据是 NLP 的挑战。让我们更加细致的思考这些数据,做一个思想上的实验,我们有一个巨大的语料库,包括在过去 50 年中英文表达或写成的一切。我们称这个语料库为“现代英语”合理吗?有许多为什么我们的回答可能是否定的的原因。回想一下,在 3 中,我们让你搜索网络查找 the of 模式的实例。虽然很容易在网上找到包含这个词序列的例子,例如 New man at the of IMG (见`http://www.telegraph.co.uk/sport/2387900/New-man-at-the-of-IMG.html`),说英语的人会说大多数这样的例子是错误的,因此它们根本不是英语。
前面的章节中已经为你讲述了如何处理和分析的文本语料库,我们一直强调处理大量的每天都在增加的电子语言数据是 NLP 的挑战。让我们更加细致的思考这些数据,做一个思想上的实验,我们有一个巨大的语料库,包括在过去 50 年中英文表达或写成的一切。我们称这个语料库为“现代英语”合理吗?有许多为什么我们的回答可能是否定的的原因。回想一下,在 3 中,我们让你搜索网络查找`the of`模式的实例。虽然很容易在网上找到包含这个词序列的例子,例如`New man at the of IMG`(见`http://www.telegraph.co.uk/sport/2387900/New-man-at-the-of-IMG.html`),说英语的人会说大多数这样的例子是错误的,因此它们根本不是英语。
因此,我们可以说,“现代英语”并不等同于我们想象中的语料库中的非常大的词序列的集合。说英语的人可以判断这些序列,并将拒绝其中一些不合语法的。
......@@ -33,7 +33,7 @@
... """)
```
这个文法允许以两种方式分析句子,取决于介词短语 in my pajamas 是描述大象还是枪击事件。
这个文法允许以两种方式分析句子,取决于介词短语`in my pajamas`是描述大象还是枪击事件。
```py
>>> sent = ['I', 'shot', 'an', 'elephant', 'in', 'my', 'pajamas']
......@@ -128,7 +128,7 @@ grammar2 = nltk.CFG.fromstring("""
一种简单的自下而上分析器是移进-归约分析器。与所有自下而上的分析器一样,移进-归约分析器尝试找到对应文法生产式*右侧*的词和短语的序列,用左侧的替换它们,直到整个句子归约为一个`S`
移位-规约分析器反复将下一个输入词推到堆栈(4.1);这是移位操作。如果堆栈上的前 *n* 项,匹配一些产生式的右侧的 *n* 个项目,那么就把它们弹出栈,并把产生式左边的项目压入栈。这种替换前 *n* 项为一项的操作就是规约操作。此操作只适用于堆栈的顶部;规约栈中的项目必须在后面的项目被压入栈之前做。当所有的输入都使用过,堆栈中只剩余一个项目,也就是一颗分析树作为它的根的`S`节点时,分析器完成。移位-规约分析器通过上述过程建立一颗分析树。每次弹出堆栈 *n* 个项目,它就将它们组合成部分的分析树,然后将这压回推栈。我们可以使用图形化示范`nltk.app.srparser()`看到移位-规约分析算法步骤。执行此分析器的六个阶段,如 4.2 所示。
移位-规约分析器反复将下一个输入词推到堆栈(4.1);这是移位操作。如果堆栈上的前 *n* 项,匹配一些产生式的右侧的`n`个项目,那么就把它们弹出栈,并把产生式左边的项目压入栈。这种替换前`n`项为一项的操作就是规约操作。此操作只适用于堆栈的顶部;规约栈中的项目必须在后面的项目被压入栈之前做。当所有的输入都使用过,堆栈中只剩余一个项目,也就是一颗分析树作为它的根的`S`节点时,分析器完成。移位-规约分析器通过上述过程建立一颗分析树。每次弹出堆栈`n`个项目,它就将它们组合成部分的分析树,然后将这压回推栈。我们可以使用图形化示范`nltk.app.srparser()`看到移位-规约分析算法步骤。执行此分析器的六个阶段,如 4.2 所示。
![Images/srparser1-6.png](Images/56cee123595482cf3edaef089cb9a6a7.jpg)
......@@ -158,7 +158,7 @@ NLTK 中提供`ShiftReduceParser()`,移进-归约分析器的一个简单的
递归下降分析器的问题之一是当它遇到一个左递归产生式时,会进入无限循环。这是因为它盲目应用文法产生式而不考虑实际输入的句子。左角落分析器是我们已经看到的自下而上与自上而下方法的混合体。
语法`grammar1`允许我们对 John saw Mary 生成下面的分析:
语法`grammar1`允许我们对`John saw Mary`生成下面的分析:
```py
>>> text = ['I', 'shot', 'an', 'elephant', 'in', 'my', 'pajamas']
......@@ -166,7 +166,7 @@ NLTK 中提供`ShiftReduceParser()`,移进-归约分析器的一个简单的
[V -> 'shot']
```
对于我们的 WFST,我们用 Python 中的列表的咧表创建一个(n-1) × (n-1)的矩阵,在 4.4 中的函数`init_wfst()`中用每个标识符的词汇类型初始化它。我们还定义一个实用的函数`display()`来为我们精美的输出 WFST。正如预期的那样,`V`在(1, 2)单元中。
对于我们的 WFST,我们用 Python 中的列表的咧表创建一个`(n-1) × (n-1)`的矩阵,在 4.4 中的函数`init_wfst()`中用每个标识符的词汇类型初始化它。我们还定义一个实用的函数`display()`来为我们精美的输出 WFST。正如预期的那样,`V``(1, 2)`单元中。
```py
def init_wfst(tokens, grammar):
......@@ -222,9 +222,9 @@ WFST 1 2 3 4 5 6 7
6 . . . . . . N
```
回到我们的表格表示,假设对于词 an 我们有`Det`在(2, 3)单元,对以词 elephant 有`N`在(3, 4)单元,对于 an elephant 我们应该在(2, 4)放入什么?我们需要找到一个形如 *A*`Det N`的产生式。查询了文法,我们知道我们可以输入(0, 2)单元的`NP`
回到我们的表格表示,假设对于词`an`我们有`Det`在(2, 3)单元,对以词`elephant``N``(3, 4)`单元,对于`an elephant`我们应该在`(2, 4)`放入什么?我们需要找到一个形如`A -> Det N`的产生式。查询了文法,我们知道我们可以输入`(0, 2)`单元的`NP`
更一般的,我们可以在(i, j)输入 *A*,如果有一个产生式 *A**B* *C*,并且我们在(i, k)中找到非终结符 *B*,在(k, j)中找到非终结符 *C*。4.4 中的程序使用此规则完成 WFST。通过调用函数`complete_wfst()`时设置`trace``True`,我们看到了显示 WFST 正在被创建的跟踪输出:
更一般的,我们可以在`(i, j)`输入`A`,如果有一个产生式`A -> B C`,并且我们在`(i, k)`中找到非终结符`B`,在`(k, j)`中找到非终结符`C`。4.4 中的程序使用此规则完成 WFST。通过调用函数`complete_wfst()`时设置`trace``True`,我们看到了显示 WFST 正在被创建的跟踪输出:
```py
>>> wfst1 = complete_wfst(wfst0, tokens, groucho_grammar, trace=True)
......@@ -247,13 +247,13 @@ WFST 1 2 3 4 5 6 7
图 4.5:图数据结构:图中额外的边表示非终结符。
我们得出结论,只要我们已经在(0, 7)单元构建了一个`S`节点,表明我们已经找到了一个涵盖了整个输入的句子,我们就为整个输入字符串找到了一个解析。最后的 WFST 状态如 4.5 所示。
我们得出结论,只要我们已经在`(0, 7)`单元构建了一个`S`节点,表明我们已经找到了一个涵盖了整个输入的句子,我们就为整个输入字符串找到了一个解析。最后的 WFST 状态如 4.5 所示。
请注意,在这里我们没有使用任何内置的分析函数。我们已经从零开始实现了一个完整的初级图表分析器!
WFST 有几个缺点。首先,正如你可以看到的,WFST 本身不是一个分析树,所以该技术严格地说是认识到一个句子被一个语法承认,而不是分析它。其次,它要求每个非词汇语法生产式是二元的。虽然可以将任意的 CFG 转换为这种形式,我们宁愿使用这种方法时没有这样的规定。第三,作为一个自下而上的语法,它潜在的存在浪费,它会在不符合文法的地方提出成分。
最后,WFST 并不能表示句子中的结构歧义(如两个动词短语的读取)。(1, 7)单元中的`VP`实际上被输入了两次,一次是读取`V NP`,一次是读取`VP PP` 。这是不同的假设,第二个会覆盖第一个(虽然如此,这并不重要,因为左侧是相同的。)图表分析器使用稍微更丰富的数据结构和一些有趣的算法来解决这些问题(详细情况参见本章末尾的进一步阅读一节)。
最后,WFST 并不能表示句子中的结构歧义(如两个动词短语的读取)。`(1, 7)`单元中的`VP`实际上被输入了两次,一次是读取`V NP`,一次是读取`VP PP` 。这是不同的假设,第二个会覆盖第一个(虽然如此,这并不重要,因为左侧是相同的。)图表分析器使用稍微更丰富的数据结构和一些有趣的算法来解决这些问题(详细情况参见本章末尾的进一步阅读一节)。
注意
......@@ -269,7 +269,7 @@ WFST 有几个缺点。首先,正如你可以看到的,WFST 本身不是一
图 5.1:依存结构:箭头从中心词指向它们的依赖;标签表示依赖的语法功能如:主语、宾语或修饰语。
5.1 中的弧加了依赖与它的中心词之间的语法功能标签。例如,I 是 shot(这是整个句子的中心词)的`SBJ`(主语),in 是一个`NMOD`(elephant 的名词修饰语)。与短语结构语法相比,依存语法可以作为一种依存关系直接用来表示语法功能。
5.1 中的弧加了依赖与它的中心词之间的语法功能标签。例如,`I``shot`(这是整个句子的中心词)的`SBJ`(主语),`in`是一个`NMOD``elephant`的名词修饰语)。与短语结构语法相比,依存语法可以作为一种依存关系直接用来表示语法功能。
下面是 NLTK 为依存语法编码的一种方式——注意它只能捕捉依存关系信息,不能指定依存关系类型:
......@@ -315,7 +315,7 @@ TV -> 'chased' | 'saw'
到目前为止,我们只考虑了“玩具语法”,演示分析的关键环节的少量的语法。但有一个明显的问题就是这种做法是否可以扩大到覆盖自然语言的大型语料库。手工构建这样的一套产生式有多么困难?一般情况下,答案是:*非常困难*。即使我们允许自己使用各种形式化的工具,它们可以提供语法产生式更简洁的表示,保持对覆盖一种语言的主要成分所需要的众多产生式之间的复杂的相互作用的控制,仍然是极其困难的。换句话说,很难将语法模块化,每部分语法可以独立开发。反过来这意味着,在一个语言学家团队中分配编写语法的任务是很困难的。另一个困难是当语法扩展到包括更加广泛的成分时,适用于任何一个句子的分析的数量也相应增加。换句话说,歧义随着覆盖而增加。
尽管存在这些问题,一些大的合作项目在为几种语言开发基于规则的语法上已取得了积极的和令人印象深刻的结果。例如,词汇功能语法(LFG)Pargram 项目、中心词驱动短语结构文法(HPSG)LinGO 矩阵框架和词汇化树邻接语法 XTAG 项目。
尽管存在这些问题,一些大的合作项目在为几种语言开发基于规则的语法上已取得了积极的和令人印象深刻的结果。例如,词汇功能语法(LFG)项目、中心词驱动短语结构文法(HPSG)LinGO 矩阵框架和词汇化树邻接语法 XTAG 项目。
## 6 语法开发
......@@ -371,7 +371,7 @@ PP 附着语料库`nltk.corpus.ppattach`是另一个有关特别动词配价的
... print(key, 'N:', sorted(table[key]['N']), 'V:', sorted(table[key]['V']))
```
这个程序的输出行中我们发现`offer-from-group N: ['rejected'] V: ['received']`,这表示 received 期望一个单独的`PP`附着到`VP`而 rejected 不是的。和以前一样,我们可以使用此信息来帮助构建语法。
这个程序的输出行中我们发现`offer-from-group N: ['rejected'] V: ['received']`,这表示`received`期望一个单独的`PP`附着到`VP``rejected`不是的。和以前一样,我们可以使用此信息来帮助构建语法。
NLTK 语料库收集了来自 PE08 跨框架跨领域分析器评估共享任务的数据。一个更大的文法集合已准备好用于比较不同的分析器,它可以通过下载`large_grammars`包获得(如`python -m nltk.downloader large_grammars`)。
......@@ -387,7 +387,7 @@ NLTK 语料库也收集了*中央研究院树库语料*,包括 10,000 句已
不幸的是,随着文法覆盖范围的增加和输入句子长度的增长,分析树的数量也迅速增长。事实上,它以天文数字的速度增长。
让我们在一个简单的例子帮助下来探讨这个问题。词 fish 既是名词又是动词。我们可以造这样的句子 fish fish fish,意思是 *fish like to fish for other fish*。(用 police 尝试一下,如果你喜欢更有意思的东西。)下面是“fish”句子的玩具文法。
让我们在一个简单的例子帮助下来探讨这个问题。词`fish`既是名词又是动词。我们可以造这样的句子`fish fish fish`,意思是`fish like to fish for other fish`。(用`police`尝试一下,如果你喜欢更有意思的东西。)下面是`fish`句子的玩具文法。
```py
>>> grammar = nltk.CFG.fromstring("""
......@@ -399,7 +399,7 @@ NLTK 语料库也收集了*中央研究院树库语料*,包括 10,000 句已
... """)
```
现在,我们可以尝试分析一个较长的句子,fish fish fish fish fish,其中一个意思是:“fish that other fish fish are in the habit of fishing fish themselves”。我们使用 NLTK 的图表分析器,它在本章前面介绍过。这句话有两种读法。
现在,我们可以尝试分析一个较长的句子,`fish fish fish fish fish`,其中一个意思是:`fish that other fish fish are in the habit of fishing fish themselves`。我们使用 NLTK 的图表分析器,它在本章前面介绍过。这句话有两种读法。
```py
>>> tokens = ["fish"] * 5
......@@ -410,7 +410,7 @@ NLTK 语料库也收集了*中央研究院树库语料*,包括 10,000 句已
(S (NP (NP fish) (Sbar (NP fish) (V fish))) (V fish) (NP fish))
```
随着句子长度增加到(3,5,7,...),我们得到的分析树的数量是:1; 2; 5; 14; 42; 132; 429; 1,430; 4,862; 16,796; 58,786; 208,012; ….(这是卡塔兰数,我们在 4 的练习中见过)。最后一个是句子长度为 23 的分析树的数目,这是宾州树库 WSJ 部分的句子的平均长度。对于一个长度为 50 的句子有超过 10<sup>12</sup>的解析,这只是 Piglet 句子长度的一半`(1)`,这些句子小孩可以毫不费力的处理。没有实际的自然语言处理系统可以为一个句子构建数以百万计的树,并根据上下文选择一个合适的。很显然,人也不会这样做!
随着句子长度增加到`(3, 5, 7, ...)`,我们得到的分析树的数量是:`1; 2; 5; 14; 42; 132; 429; 1,430; 4,862; 16,796; 58,786; 208,012; …`(这是卡塔兰数,我们在 4 的练习中见过)。最后一个是句子长度为 23 的分析树的数目,这是宾州树库 WSJ 部分的句子的平均长度。对于一个长度为 50 的句子有超过`10^12`的解析,这只是 Piglet 句子长度的一半`(1)`,这些句子小孩可以毫不费力的处理。没有实际的自然语言处理系统可以为一个句子构建数以百万计的树,并根据上下文选择一个合适的。很显然,人也不会这样做!
请注意,这个问题不是只在我们选择的例子中存在。[(Church & Patil, 1982)](./bibliography.html#church1982csa)指出`PP`附着句法歧义在像`(18)`这样的句子中也是按卡塔兰数的比例增长。
......@@ -449,7 +449,7 @@ grammar = nltk.PCFG.fromstring("""
""")
```
有时可以很方便的将多个产生式组合成一行,如`VP -> TV NP [0.4] | IV [0.3] | DatV NP NP [0.3]`。为了确保由文法生成的树能形成概率分布,PCFG 语法强加了约束,产生式所有给定的左侧的概率之和必须为 1。6.4 中的语法符合这个约束:对`S`只有一个产生式,它的概率是 1.0;对于`VP`0.4+0.3+0.3=1.0;对于`NP`,0.8+0.2=1.0`parse()`返回的分析树包含概率:
有时可以很方便的将多个产生式组合成一行,如`VP -> TV NP [0.4] | IV [0.3] | DatV NP NP [0.3]`。为了确保由文法生成的树能形成概率分布,PCFG 语法强加了约束,产生式所有给定的左侧的概率之和必须为 1。6.4 中的语法符合这个约束:对`S`只有一个产生式,它的概率是 1.0;对于`VP``0.4+0.3+0.3=1.0`;对于`NP``0.8+0.2=1.0``parse()`返回的分析树包含概率:
```py
>>> viterbi_parser = nltk.ViterbiParser(grammar)
......@@ -476,7 +476,7 @@ grammar = nltk.PCFG.fromstring("""
本章的附加材料发布在`http://nltk.org/`,包括网络上免费提供的资源的链接。关于使用 NLTK 分析的更多的例子,请看在`http://nltk.org/howto`上的分析 HOWTO。
有许多关于句法的入门书籍。[(O'Grady et al, 2004)](./bibliography.html#ogrady2004)是一个语言学概论,而[(Radford, 1988)](./bibliography.html#radford1988tg)以容易接受的方式介绍转换语法,推荐其中的无限制依赖结构的转换文法。在形式语言学中最广泛使用的术语是生成语法,虽然它与生成并没有关系[(Chomsky, 1965)](./bibliography.html#chomsky1965)。X-bar 句法来自于[(Jacobs & Rosenbaum, 1970)](./bibliography.html#chomsky1970rn),并在[(Jackendoff, 1977)](./bibliography.html#jackendoff1977xs)得到更深的拓展(The primes we use replace Chomsky's typographically more demanding horizontal bars)。
有许多关于句法的入门书籍。[(O'Grady et al, 2004)](./bibliography.html#ogrady2004)是一个语言学概论,而[(Radford, 1988)](./bibliography.html#radford1988tg)以容易接受的方式介绍转换语法,推荐其中的无限制依赖结构的转换文法。在形式语言学中最广泛使用的术语是生成语法,虽然它与生成并没有关系[(Chomsky, 1965)](./bibliography.html#chomsky1965)。X-bar 句法来自于[(Jacobs & Rosenbaum, 1970)](./bibliography.html#chomsky1970rn),并在[(Jackendoff, 1977)](./bibliography.html#jackendoff1977xs)得到更深的拓展(我们使用素数替代了 Chomsky 印刷上要求更高的单杠)。
[(Burton-Roberts, 1997)](./bibliography.html#burtonroberts1997as)是一本面向实践的关于如何分析英语成分的教科书,包含广泛的例子和练习。[(Huddleston & Pullum, 2002)](./bibliography.html#huddleston2002cge)提供了一份最新的英语句法现象的综合分析。
......@@ -488,20 +488,20 @@ grammar = nltk.PCFG.fromstring("""
1. ☼ 你能想出符合语法的却可能之前从来没有被说出的句子吗?(与伙伴轮流进行。)这告诉你关于人类语言的什么?
2. ☼ 回想一下 Strunk 和 White 的禁止在句子开头使用 however 表示“although”的意思。在网上搜索句子开头使用的 however。这个成分使用的有多广泛?
2. ☼ 回想一下 Strunk 和 White 的禁止在句子开头使用`however`表示`although`的意思。在网上搜索句子开头使用的`however`。这个成分使用的有多广泛?
3. ☼ 思考句子`Kim arrived or Dana left and everyone cheered`。用括号的形式表示 and 和 or 的相对范围。产生这两种解释对应的树结构。
3. ☼ 思考句子`Kim arrived or Dana left and everyone cheered`。用括号的形式表示`and``or`的相对范围。产生这两种解释对应的树结构。
4.`Tree`类实现了各种其他有用的方法。请看`Tree`帮助文档查阅更多细节(如导入 Tree 类,然后输入`help(Tree)`)。
4.`Tree`类实现了各种其他有用的方法。请看`Tree`帮助文档查阅更多细节(如导入`Tree`类,然后输入`help(Tree)`)。
5. ☼ 在本练习中,你将手动构造一些分析树。
1. 编写代码产生两棵树,对应短语 old men and women 的不同读法
1. 编写代码产生两棵树,对应短语`old men and women`的不同读法
2. 将本章中表示的任一一颗树编码为加标签的括号括起的形式,使用`nltk.Tree()`检查它是否符合语法。使用`draw()`显示树。
3. 如(a) 中那样,为 The woman saw a man last Thursday 画一棵树。
3. 如`(a)`中那样,为`The woman saw a man last Thursday`画一棵树。
6. ☼ 写一个递归函数,遍历一颗树,返回树的深度,一颗只有一个节点的树的深度应为 0。(提示:子树的深度是其子女的最大深度加 1。)
7. ☼ 分析 A.A. Milne 关于 Piglet 的句子,为它包含的所有句子画下划线,然后用`S`替换这些(如第一句话变为`S` `when`:lx` `S`)。为这种“压缩”的句子画一个树形结构。用于建立这样一个长句的主要的句法结构是什么?
7. ☼ 分析 A.A. Milne 关于 Piglet 的句子,为它包含的所有句子画下划线,然后用`S`替换这些(如第一句话变为`S when:lx S`)。为这种“压缩”的句子画一个树形结构。用于建立这样一个长句的主要的句法结构是什么?
8. ☼ 在递归下降分析器的演示中,通过选择 *Edit* 菜单上的 *Edit Text* 改变实验句子。
......@@ -513,11 +513,11 @@ grammar = nltk.PCFG.fromstring("""
12. ☼ 我们已经看到图表分析器增加边而从来不从图表中删除的边。为什么?
13. ☼ 思考词序列:Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo。如`http://en.wikipedia.org/wiki/Buffalo_buffalo_Buffalo_buffalo_buffalo_buffalo_Buffalo_buffalo`解释的,这是一个语法正确的句子。思考此维基百科页面上表示的树形图,写一个合适的语法。正常情况下是小写,模拟听到这句话时听者会遇到的问题。你能为这句话找到其他的解析吗?当句子变长时分析树的数量如何增长?(这些句子的更多的例子可以在`http://en.wikipedia.org/wiki/List_of_homophonous_phrases`找到。)
13. ☼ 思考词序列:`Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo`。如`http://en.wikipedia.org/wiki/Buffalo_buffalo_Buffalo_buffalo_buffalo_buffalo_Buffalo_buffalo`解释的,这是一个语法正确的句子。思考此维基百科页面上表示的树形图,写一个合适的语法。正常情况下是小写,模拟听到这句话时听者会遇到的问题。你能为这句话找到其他的解析吗?当句子变长时分析树的数量如何增长?(这些句子的更多的例子可以在`http://en.wikipedia.org/wiki/List_of_homophonous_phrases`找到。)
14. ◑ 你可以通过选择 *Edit* 菜单上的 *Edit Grammar* 修改递归下降分析器演示程序。改变第二次扩充产生式,即`NP -> Det N PP`为`NP -> NP PP`。使用 *Step* 按钮,尝试建立一个分析树。发生了什么?
14. ◑ 你可以通过选择`Edit`菜单上的`Edit Grammar`修改递归下降分析器演示程序。改变第二次扩充产生式,即`NP -> Det N PP``NP -> NP PP`。使用`Step`按钮,尝试建立一个分析树。发生了什么?
15. ◑ 扩展`grammar2`中的语法,将产生式中的介词扩展为不及物的,及物的和需要`PP`补语的。基于这些产生式,使用前面练习中的方法为句子 Lee ran away home 画一棵树。
15. ◑ 扩展`grammar2`中的语法,将产生式中的介词扩展为不及物的,及物的和需要`PP`补语的。基于这些产生式,使用前面练习中的方法为句子`Lee ran away home`画一棵树。
16. ◑ 挑选一些常用动词,完成以下任务:
......@@ -525,7 +525,7 @@ grammar = nltk.PCFG.fromstring("""
2. 制定 CFG 语法产生式涵盖其中一些情况。
17. ◑ 写一个程序,比较自上而下的图表分析器与递归下降分析器的效率`(4)`。使用相同的语法和输入的句子。使用`timeit`模块比较它们的性能(见 4.7,如何做到这一点的一个例子)。
18. 比较自上而下、自下而上和左角落分析器的性能,使用相同的语法和 3 个符合语法的测试句子。使用`timeit`记录每个分析器在同一个句子上花费的时间。写一个函数,在这三句话上运行这三个分析器,输出 3×3 格的时间,以及行和列的总计。讨论你的发现。
18. 比较自上而下、自下而上和左角落分析器的性能,使用相同的语法和 3 个符合语法的测试句子。使用`timeit`记录每个分析器在同一个句子上花费的时间。写一个函数,在这三句话上运行这三个分析器,输出`3×3`格的时间,以及行和列的总计。讨论你的发现。
19. ◑ 阅读“garden path”的句子。一个分析器的计算工作与人类处理这些句子的困难性有什么关系?`http://en.wikipedia.org/wiki/Garden_path_sentence`
......@@ -540,7 +540,7 @@ grammar = nltk.PCFG.fromstring("""
22. ◑ 查看 PP 附着语料库,尝试提出一些影响`PP`附着的因素。
23. ◑ 在本节中,我们说过简单的用术语 n-grams 不能描述所有语言学规律。思考下面的句子,尤其是短语 in his turn 的位置。这是基于 n-grams 的方法的一个问题吗?
23. ◑ 在本节中,我们说过简单的用术语 N 元组不能描述所有语言学规律。思考下面的句子,尤其是短语`in his turn`的位置。这是基于 N 元组的方法的一个问题吗?
> `What was more, the in his turn somewhat youngish Nikolay Parfenovich also turned out to be the only person in the entire world to acquire a sincere liking to our "discriminated-against" public procurator.` (Dostoevsky: The Brothers Karamazov)
24. ◑ 编写一个递归函数产生嵌套的括号括起的形式的一棵树,显示去掉叶节点之后的子树的非终结符。于是上面的关于 Pierre Vinken 的例子会产生:`[[[NNP NNP]NP , [ADJP [CD NNS]NP JJ]ADJP ,]NP-SBJ MD [VB [DT NN]NP [IN [DT JJ NN]NP]PP-CLR [NNP CD]NP-TMP]VP .]S`。连续的类别应用空格分隔。
......@@ -549,7 +549,7 @@ grammar = nltk.PCFG.fromstring("""
26. ◑ 修改函数`init_wfst()``complete_wfst()`,使 WFST 中每个单元的内容是一组非终端符而不是一个单独的非终结符。
27. ◑ 思考 4.4 中的算法。你能解释为什么分析上下文无关语法是与`n`<sup>3</sup>成正比的,其中 *n* 是输入句子的长度。
27. ◑ 思考 4.4 中的算法。你能解释为什么分析上下文无关语法是与`n^3`成正比的,其中`n`是输入句子的长度。
28. ◑ 处理宾州树库语料库样本`nltk.corpus.treebank`中的每棵树,在`Tree.productions()`的帮助下提取产生式。丢弃只出现一次的产生式。具有相同的左侧和类似的右侧的产生式可以被折叠,产生一个等价的却更紧凑的规则集。编写代码输出一个紧凑的语法。
......@@ -559,7 +559,7 @@ grammar = nltk.PCFG.fromstring("""
31. ★ 使用回溯实现移位-规约分析器的一个版本,使它找出一个句子所有可能的解析,它可以被称为“递归上升分析器”。咨询维基百科关于回溯的条目`http://en.wikipedia.org/wiki/Backtracking`
32. ★ 正如我们在 7 中所看到的,可以将词块表示成它们的词块标签。当我们为包含 gave 的句子做这个的时候,我们发现如以下模式:
32. ★ 正如我们在 7 中所看到的,可以将词块表示成它们的词块标签。当我们为包含`gave`的句子做这个的时候,我们发现如以下模式:
```py
gave NP
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册