提交 3e6455ef 编写于 作者: W wizardforcel

2020-12-29 17:03:08

上级 83d3f379
......@@ -61,7 +61,7 @@ canton chungking dairen harbin kowloon mukden peking shanghai sian tientsin
由于每行`r`是一个单元素的元组,我们输出元组的成员,而不是元组本身❶。
总结一下,我们已经定义了一个任务:计算机对自然语言查询做出反应,返回有用的数据。我们通过将英语的一个小的子集翻译成 SQL 来实现这个任务们可以说,我们的 NLTK 代码已经“理解”SQL,只要 Python 能够对数据库执行 SQL 查询,通过扩展,它也“理解”如 What cities are located in China 这样的查询。这相当于自然语言理解的例子能够从荷兰语翻译成英语。假设你是一个英语为母语的人,已经开始学习荷兰语。你的老师问你是否理解[(3)](./ch10.html#ex-sem1)的意思:
总结一下,我们已经定义了一个任务:计算机对自然语言查询做出反应,返回有用的数据。我们通过将英语的一个小的子集翻译成 SQL 来实现这个任务们可以说,我们的 NLTK 代码已经“理解”SQL,只要 Python 能够对数据库执行 SQL 查询,通过扩展,它也“理解”如 What cities are located in China 这样的查询。这相当于自然语言理解的例子能够从荷兰语翻译成英语。假设你是一个英语为母语的人,已经开始学习荷兰语。你的老师问你是否理解`(3)`的意思:
```py
>>> nltk.boolean_ops()
......@@ -149,7 +149,7 @@ True
**轮到你来**:做实验为不同的命题逻辑公式估值。模型是否给出你所期望的值?
到目前为止,我们已经将我们的英文句子翻译成命题逻辑。因为我们只限于用字母如`P``Q`表示原子句子,不能深入其内部结构。实际上,我们说将原子句子分成主语、宾语和谓词并没有语义上的好处。然而,这似乎是错误的:如果我们想形式化如[(9)](./ch10.html#ex-proplog8)这样的论证,就必须要能“看到里面”基本的句子。因此,我们将超越命题逻辑到一个更有表现力的东西,也就是一阶逻辑。这正是我们下一节要讲的。
到目前为止,我们已经将我们的英文句子翻译成命题逻辑。因为我们只限于用字母如`P``Q`表示原子句子,不能深入其内部结构。实际上,我们说将原子句子分成主语、宾语和谓词并没有语义上的好处。然而,这似乎是错误的:如果我们想形式化如`(9)`这样的论证,就必须要能“看到里面”基本的句子。因此,我们将超越命题逻辑到一个更有表现力的东西,也就是一阶逻辑。这正是我们下一节要讲的。
## 3 一阶逻辑
......@@ -187,7 +187,7 @@ e
在一阶逻辑中,谓词的参数也可以是独立变量,如 x,y 和 z。在 NLTK 中,我们采用的惯例:*e* 类型的变量都是小写。独立变量类似于人称代词,如 he,she 和 it ,其中我们为了弄清楚它们的含义需要知道它们使用的上下文。
解释[(14)](./ch10.html#ex-predlog2)中的代名词的方法之一是指向上下文中相关的个体。
解释`(14)`中的代名词的方法之一是指向上下文中相关的个体。
```py
((exists x. dog(x)) -> bark(x))
......@@ -196,7 +196,7 @@ e
## 3.2 一阶定理证明
回顾一下我们较早前在[(10)](./ch10.html#ex-north)中提出的 to the north of 上的限制:
回顾一下我们较早前在`(10)`中提出的 to the north of 上的限制:
```py
all x. all y.(north_of(x, y) -> -north_of(y, x))
......@@ -336,14 +336,14 @@ True
## 3.6 量化
现代逻辑的关键特征之一就是变量满足的概念可以用来解释量化的公式。让我们用[(24)](./ch10.html#ex-exists1)作为一个例子。
现代逻辑的关键特征之一就是变量满足的概念可以用来解释量化的公式。让我们用`(24)`作为一个例子。
```py
>>> m.evaluate('exists x.(girl(x) & walk(x))', g)
True
```
在这里`evaluate()``True`,因为`dom`中有某些 *u* 通过绑定`x`*u* 的赋值满足([(25)](./ch10.html#ex-exists2) )。事实上,`o`是这样一个 *u*
在这里`evaluate()``True`,因为`dom`中有某些 *u* 通过绑定`x`*u* 的赋值满足(`(25)` )。事实上,`o`是这样一个 *u*
```py
>>> m.evaluate('girl(x) & walk(x)', g.add('x', 'o'))
......@@ -393,7 +393,7 @@ True
>>> val2 = nltk.Valuation.fromstring(v2)
```
admire 关系可以使用[(28)](./ch10.html#ex-admire-mapping)所示的映射图进行可视化。
admire 关系可以使用`(28)`所示的映射图进行可视化。
```py
>>> dom2 = val2.domain
......@@ -498,7 +498,7 @@ True
我们将假设一个复杂的表达式的语义相关部分由句法分析理论给出。在本章中,我们将认为表达式已经用上下文无关语法分析过。然而,这不是组合原则的内容。
我们现在的目标是以一种可以与分析过程平滑对接的方式整合语义表达的构建。[(29)](./ch10.html#ex-sem3)说明了我们想建立的这种分析的第一个近似。
我们现在的目标是以一种可以与分析过程平滑对接的方式整合语义表达的构建。`(29)`说明了我们想建立的这种分析的第一个近似。
```py
VP[SEM=?v] -> IV[SEM=?v]
......@@ -509,7 +509,7 @@ IV[SEM=<\x.bark(x)>] -> 'barks'
## 4.2 λ演算
在 3 中,我们指出数学集合符号对于制定我们想从文档中选择的词的属性 P 很有用。我们用[(31)](./ch10.html#ex-set-comprehension-math2)说明这个,它是“所有 w 的集合,其中 w 是 V(词汇表)的元素且 w 有属性 P”的表示。
在 3 中,我们指出数学集合符号对于制定我们想从文档中选择的词的属性 P 很有用。我们用`(31)`说明这个,它是“所有 w 的集合,其中 w 是 V(词汇表)的元素且 w 有属性 P”的表示。
```py
>>> read_expr = nltk.sem.Expression.fromstring
......@@ -576,7 +576,7 @@ exists z1.see(z1,x)
\x.exists z2.(dog(z2) & chase(x,z2))
```
为了建立一个句子的语义表示,我们也需要组合主语`NP`的语义。如果后者是一个量化的表达式,例如 every girl,一切都与我们前面讲过的 a dog barks 一样的处理方式;主语转换为函数表达式,这被用于`VP`的语义表示。然而,我们现在似乎已经用适当的名称为自己创造了另一个问题。到目前为止,这些已经作为单独的常量进行了语义的处理,这些不能作为像[(47)](./ch10.html#ex-sem99)那样的表达式的函数应用。因此,我们需要为它们提出不同的语义表示。我们在这种情况下所做的是重新解释适当的名称,使它们也成为如量化的`NP`那样的函数表达式。这里是 Angus 的λ表达式。
为了建立一个句子的语义表示,我们也需要组合主语`NP`的语义。如果后者是一个量化的表达式,例如 every girl,一切都与我们前面讲过的 a dog barks 一样的处理方式;主语转换为函数表达式,这被用于`VP`的语义表示。然而,我们现在似乎已经用适当的名称为自己创造了另一个问题。到目前为止,这些已经作为单独的常量进行了语义的处理,这些不能作为像`(47)`那样的表达式的函数应用。因此,我们需要为它们提出不同的语义表示。我们在这种情况下所做的是重新解释适当的名称,使它们也成为如量化的`NP`那样的函数表达式。这里是 Angus 的λ表达式。
```py
>>> from nltk import load_parser
......@@ -640,7 +640,7 @@ True
## 4.5 再述量词歧义
上述方法的一个重要的限制是它们没有处理范围歧义。我们的翻译方法是句法驱动的,认为语义表示与句法分析紧密耦合,语义中量词的范围也因此反映句法分析树中相应的`NP`的相对范围。因此,像[(26)](./ch10.html#ex-scope1)这样的句子,在这里重复,总是会被翻译为[(53a)](./ch10.html#ex-scope12a)而不是[(53b)](./ch10.html#ex-scope12b)
上述方法的一个重要的限制是它们没有处理范围歧义。我们的翻译方法是句法驱动的,认为语义表示与句法分析紧密耦合,语义中量词的范围也因此反映句法分析树中相应的`NP`的相对范围。因此,像`(26)`这样的句子,在这里重复,总是会被翻译为[(53a)](./ch10.html#ex-scope12a)而不是[(53b)](./ch10.html#ex-scope12b)
```py
\P.exists y.(dog(y) & P(y))(\z2.chase(z1,z2))
......
......@@ -394,7 +394,7 @@ class ConsecutivePosTagger(nltk.TaggerI): ❷
## 1.7 其他序列分类方法
这种方法的一个缺点是我们的决定一旦做出无法更改。例如,如果我们决定将一个词标注为名词,但后来发现的证据表明应该是一个动词,就没有办法回去修复我们的错误。这个问题的一个解决方案是采取转型策略。转型联合分类的工作原理是为输入的标签创建一个初始值,然后反复提炼那个值,尝试修复相关输入之间的不一致。Brill 标注器,[(1)](./ch05.html#sec-transformation-based-tagging)中描述的,是这种策略的一个很好的例子。
这种方法的一个缺点是我们的决定一旦做出无法更改。例如,如果我们决定将一个词标注为名词,但后来发现的证据表明应该是一个动词,就没有办法回去修复我们的错误。这个问题的一个解决方案是采取转型策略。转型联合分类的工作原理是为输入的标签创建一个初始值,然后反复提炼那个值,尝试修复相关输入之间的不一致。Brill 标注器,`(1)`中描述的,是这种策略的一个很好的例子。
另一种方案是为词性标记所有可能的序列打分,选择总得分最高的序列。隐马尔可夫模型就采取这种方法。隐马尔可夫模型类似于连续分类器,它不光看输入也看已预测标记的历史。然而,不是简单地找出一个给定的词的单个最好的标签,而是为标记产生一个概率分布。然后将这些概率结合起来计算标记序列的概率得分,最高概率的标记序列会被选中。不幸的是,可能的标签序列的数量相当大。给定 30 个标签的标记集,有大约 600 万亿(`30^10`)种方式来标记一个 10 个词的句子。为了避免单独考虑所有这些可能的序列,隐马尔可夫模型要求特征提取器只看最近的标记(或最近的`n`个标记,其中`n`是相当小的)。由于这种限制,它可以使用动态规划(4.7),有效地找出最有可能的标记序列。特别是,对每个连续的词索引`i`,每个可能的当前及以前的标记都被计算得分。这种同样基础的方法被两个更先进的模型所采用,它们被称为最大熵马尔可夫模型和线性链条件随机场模型;但为标记序列打分用的是不同的算法。
......
......@@ -54,7 +54,7 @@
图 2.1:词符和词块级别的分割与标注
在本节中,我们将在较深的层面探讨词块划分,以词块的定义和表示开始。我们将看到正则表达式和 N 元的方法来词块划分,使用 CoNLL-2000 词块划分语料库开发和评估词块划分器。我们将在[(5)](./ch07.html#sec-ner)和 6 回到命名实体识别和关系抽取的任务。
在本节中,我们将在较深的层面探讨词块划分,以词块的定义和表示开始。我们将看到正则表达式和 N 元的方法来词块划分,使用 CoNLL-2000 词块划分语料库开发和评估词块划分器。我们将在`(5)`和 6 回到命名实体识别和关系抽取的任务。
## 2.1 名词短语词块划分
......
......@@ -412,7 +412,7 @@ NLTK 语料库也收集了*中央研究院树库语料*,包括 10,000 句已
随着句子长度增加到(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&lt;sup&gt;12&lt;/sup&gt;的解析,这只是 Piglet 句子长度的一半`(1)`,这些句子小孩可以毫不费力的处理。没有实际的自然语言处理系统可以为一个句子构建数以百万计的树,并根据上下文选择一个合适的。很显然,人也不会这样做!
请注意,这个问题不是只在我们选择的例子中存在。[(Church & Patil, 1982)](./bibliography.html#church1982csa)指出`PP`附着句法歧义在像[(18)](./ch08.html#ex-pp)这样的句子中也是按卡塔兰数的比例增长。
请注意,这个问题不是只在我们选择的例子中存在。[(Church & Patil, 1982)](./bibliography.html#church1982csa)指出`PP`附着句法歧义在像`(18)`这样的句子中也是按卡塔兰数的比例增长。
```py
def give(t):
......
......@@ -131,7 +131,7 @@ Feature Single Edge Fundamental Rule:
(NP[NUM='pl'] (N[NUM='pl'] children))))
```
分析过程中的细节对于当前的目标并不重要。然而,有一个实施上的问题与我们前面的讨论语法的大小有关。分析包含特征限制的产生式的一种可行的方法是编译出问题中特征的所有可接受的值,是我们最终得到一个大的完全指定的[(6)](./ch09.html#ex-agcfg1)中那样的 CFG。相比之下,前面例子中显示的分析器过程直接与给定语法的未指定的产生式一起运作。特征值从词汇条目“向上流动”,变量值于是通过如`{?n: 'sg', ?t: 'pres'}`这样的绑定(即字典)与那些值关联起来。当分析器装配有关它正在建立的树的节点的信息时,这些变量绑定被用来实例化这些节点中的值;从而通过查找绑定中`?n``?t`的值,未指定的`VP[NUM=?n, TENSE=?t] -&gt; TV[NUM=?n, TENSE=?t] NP[]`实例化为`VP[NUM='sg', TENSE='pres'] -&gt; TV[NUM='sg', TENSE='pres'] NP[]`
分析过程中的细节对于当前的目标并不重要。然而,有一个实施上的问题与我们前面的讨论语法的大小有关。分析包含特征限制的产生式的一种可行的方法是编译出问题中特征的所有可接受的值,是我们最终得到一个大的完全指定的`(6)`中那样的 CFG。相比之下,前面例子中显示的分析器过程直接与给定语法的未指定的产生式一起运作。特征值从词汇条目“向上流动”,变量值于是通过如`{?n: 'sg', ?t: 'pres'}`这样的绑定(即字典)与那些值关联起来。当分析器装配有关它正在建立的树的节点的信息时,这些变量绑定被用来实例化这些节点中的值;从而通过查找绑定中`?n``?t`的值,未指定的`VP[NUM=?n, TENSE=?t] -&gt; TV[NUM=?n, TENSE=?t] NP[]`实例化为`VP[NUM='sg', TENSE='pres'] -&gt; TV[NUM='sg', TENSE='pres'] NP[]`
最后,我们可以检查生成的分析树(在这种情况下,只有一个)。
......@@ -146,7 +146,7 @@ Feature Single Edge Fundamental Rule:
## 1.3 术语
到目前为止,我们只看到像`sg``pl`这样的特征值。这些简单的值通常被称为原子——也就是,它们不能被分解成更小的部分。原子值的一种特殊情况是布尔值,也就是说,值仅仅指定一个属性是真还是假。例如,我们可能要用布尔特征`AUX`区分助动词,如 can,may,will 和 do。例如,产生式`V[TENSE=pres, AUX=+] -&gt; 'can'`意味着 can 接受`TENSE`的值为`pres`,并且`AUX`的值为`+``true`。有一个广泛采用的约定用缩写表示布尔特征`f`;不用`AUX=+``AUX=-`,我们分别用`+AUX``-AUX`。这些都是缩写,然而,分析器就像`+``-`是其他原子值一样解释它们。[(15)](./ch09.html#ex-lex)显示了一些有代表性的产生式:
到目前为止,我们只看到像`sg``pl`这样的特征值。这些简单的值通常被称为原子——也就是,它们不能被分解成更小的部分。原子值的一种特殊情况是布尔值,也就是说,值仅仅指定一个属性是真还是假。例如,我们可能要用布尔特征`AUX`区分助动词,如 can,may,will 和 do。例如,产生式`V[TENSE=pres, AUX=+] -&gt; 'can'`意味着 can 接受`TENSE`的值为`pres`,并且`AUX`的值为`+``true`。有一个广泛采用的约定用缩写表示布尔特征`f`;不用`AUX=+``AUX=-`,我们分别用`+AUX``-AUX`。这些都是缩写,然而,分析器就像`+``-`是其他原子值一样解释它们。`(15)`显示了一些有代表性的产生式:
```py
V[TENSE=pres, +AUX] -> 'can'
......@@ -157,9 +157,9 @@ V[TENSE=pres, -AUX] -> 'likes'
```
在传递中,我们应该指出有显示 AVM 的替代方法;1.3 显示了一个例子。虽然特征结构呈现的[(16)](./ch09.html#ex-agr0)中的风格不太悦目,我们将坚持用这种格式,因为它对应我们将会从 NLTK 得到的输出。
在传递中,我们应该指出有显示 AVM 的替代方法;1.3 显示了一个例子。虽然特征结构呈现的`(16)`中的风格不太悦目,我们将坚持用这种格式,因为它对应我们将会从 NLTK 得到的输出。
关于表示,我们也注意到特征结构,像字典,对特征的*顺序*没有指定特别的意义。所以[(16)](./ch09.html#ex-agr0)等同于:
关于表示,我们也注意到特征结构,像字典,对特征的*顺序*没有指定特别的意义。所以`(16)`等同于:
```py
[AGR = [NUM = pl ]]
......@@ -234,7 +234,7 @@ fem
在接下来的几页中,我们会使用这样的例子来探讨特征结构的标准操作。这将使我们暂时从自然语言处理转移,因为在我们回来谈论语法之前需要打下基础。坚持!
将特征结构作为图来查看往往是有用的;更具体的,作为有向无环图(DAG)。[(19)](./ch09.html#ex-dag01)等同于上面的 AVM。
将特征结构作为图来查看往往是有用的;更具体的,作为有向无环图(DAG)。`(19)`等同于上面的 AVM。
```py
>>> print(nltk.FeatStruct("""[NAME='Lee', ADDRESS=(1)[NUMBER=74, STREET='rue Pascal'],
......@@ -288,7 +288,7 @@ fem
None
```
现在,如果我们看一下统一如何与结构共享相互作用,事情就变得很有趣。首先,让我们在 Python 中定义[(21)](./ch09.html#ex-dag04)
现在,如果我们看一下统一如何与结构共享相互作用,事情就变得很有趣。首先,让我们在 Python 中定义`(21)`
```py
>>> fs0 = nltk.FeatStruct("""[NAME=Lee,
......@@ -326,7 +326,7 @@ None
[ [ NAME = 'Kim' ] ]
```
通过对比,如果`fs1``fs2`的结构共享版本统一,结果是非常不同的(如图[(22)](./ch09.html#ex-dag03)所示):
通过对比,如果`fs1``fs2`的结构共享版本统一,结果是非常不同的(如图`(22)`所示):
```py
>>> fs2 = nltk.FeatStruct("""[NAME=Lee, ADDRESS=(1)[NUMBER=74, STREET='rue Pascal'],
......@@ -458,7 +458,7 @@ Comp -> 'that'
(VP[]/NP[] (V[-AUX, SUBCAT='trans'] like) (NP[]/NP[] )))))))
```
这棵树的一个更易读的版本如[(52)](./ch09.html#ex-gapparse)所示。
这棵树的一个更易读的版本如`(52)`所示。
```py
>>> tokens = 'you claim that you like cats'.split()
......@@ -651,7 +651,7 @@ In the case of complex values, we say that feature structures are themselves typ
## 6 练习
1. ☼ 需要什么样的限制才能正确分析词序列,如 I am happy 和 she is happy 而不是*you is happy 或*they am happy?实现英语中动词 be 的现在时态范例的两个解决方案,首先以语法[(6)](./ch09.html#ex-agcfg1)作为起点,然后以语法 [(18)](./ch09.html#ex-agr2)为起点。
1. ☼ 需要什么样的限制才能正确分析词序列,如 I am happy 和 she is happy 而不是*you is happy 或*they am happy?实现英语中动词 be 的现在时态范例的两个解决方案,首先以语法`(6)`作为起点,然后以语法 `(18)`为起点。
2. ☼ 开发 1.1 中语法的变体,使用特征`count`来区分下面显示的句子:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册