提交 015cd801 编写于 作者: W wizardforcel

2020-12-29 17:37:51

上级 52b8cd2b
......@@ -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)`的意思:
总结一下,我们已经定义了一个任务:计算机对自然语言查询做出反应,返回有用的数据。我们通过将英语的一个小的子集翻译成 SQL 来实现这个任务们可以说,我们的 NLTK 代码已经“理解”SQL,只要 Python 能够对数据库执行 SQL 查询,通过扩展,它也“理解”如`What cities are located in China`这样的查询。这相当于自然语言理解的例子能够从荷兰语翻译成英语。假设你是一个英语为母语的人,已经开始学习荷兰语。你的老师问你是否理解`(3)`的意思:
```py
>>> nltk.boolean_ops()
......@@ -74,7 +74,7 @@ equivalence <->
从命题符号和布尔运算符,我们可以建立命题逻辑的规范公式(或简称公式)的无限集合。首先,每个命题字母是一个公式。然后,如果φ是一个公式,那么`-`φ也是一个公式。如果φ和ψ是公式,那么`(`φ `&` ψ`)` `(`φ `|` ψ`)` `(`φ `->` ψ`)` `(`φ `<->` ψ`)`也是公式。
2.1 指定了包含这些运算符的公式为真的条件。和以前一样,我们使用φ和ψ作为句子中的变量,iff 作为 if and only if(当且仅当)的缩写。
2.1 指定了包含这些运算符的公式为真的条件。和以前一样,我们使用φ和ψ作为句子中的变量,`iff`作为`if and only if`(当且仅当)的缩写。
表 2.1:
......@@ -92,7 +92,7 @@ equivalence <->
<IffExpression (P <-> --P)>
```
从计算的角度来看,逻辑给了我们进行推理的一个重要工具。假设你表达 Freedonia is not to the north of Sylvania,而你给出理由 Sylvania is to the north of Freedonia。在这种情况下,你已经给出了一个论证。句子 Sylvania is to the north of Freedonia 是论证的假设,而 Freedonia is not to the north of Sylvania 是结论。从假设一步一步推到结论,被称为推理。通俗地说,就是我们以在结论前面写 therefore 这样的格式写一个论证。
从计算的角度来看,逻辑给了我们进行推理的一个重要工具。假设你表达`Freedonia is not to the north of Sylvania`,而你给出理由`Sylvania is to the north of Freedonia`。在这种情况下,你已经给出了一个论证。句子`Sylvania is to the north of Freedonia`是论证的假设,而`Freedonia is not to the north of Sylvania`是结论。从假设一步一步推到结论,被称为推理。通俗地说,就是我们以在结论前面写`therefore`这样的格式写一个论证。
```py
>>> lp = nltk.sem.Expression.fromstring
......@@ -104,7 +104,7 @@ equivalence <->
True
```
这里有另一种方式可以看到结论如何得出。`SnF -&gt; -FnS`在语义上等价于`-SnF | -FnS`,其中 "`|`"是对应于 or 的二元运算符。在一般情况下,φ`|`ψ在条件 *s* 中为真,要么φ在 *s* 中为真,要么ψ在 *s* 中为真。现在,假设`SnF``-SnF | -FnS`都在 *s* 中为真。如果`SnF`为真,那么`-SnF`不可能也为真;经典逻辑的一个基本假设是:一个句子在一种情况下不能同时为真和为假。因此,`-FnS`必须为真。
这里有另一种方式可以看到结论如何得出。`SnF -&gt; -FnS`在语义上等价于`-SnF | -FnS`,其中`|`是对应于`or`的二元运算符。在一般情况下,`φ|ψ`在条件`s`中为真,要么`φ``s`中为真,要么`ψ``s`中为真。现在,假设`SnF``-SnF | -FnS`都在`s`中为真。如果`SnF`为真,那么`-SnF`不可能也为真;经典逻辑的一个基本假设是:一个句子在一种情况下不能同时为真和为假。因此,`-FnS`必须为真。
回想一下,我们解释相对于一个模型的一种逻辑语言的句子,它们是这个世界的一个非常简化的版本。一个命题逻辑的模型需要为每个可能的公式分配值`True``False`。我们一步步的来做这个:首先,为每个命题符号分配一个值,然后确定布尔运算符的含义(即 2.1)和运用它们到这些公式的组件的值,来计算复杂的公式的值。`估值`是从逻辑的基本符号映射到它们的值。下面是一个例子:
......@@ -159,7 +159,7 @@ True
## 3.1 句法
一阶逻辑保留所有命题逻辑的布尔运算符。但它增加了一些重要的新机制。首先,命题被分析成谓词和参数,这将我们与自然语言的结构的距离拉近了一步。一阶逻辑的标准构造规则承认以下术语:独立变量和独立常量、带不同数量的参数的谓词。例如,Angus walks 可以被形式化为 walk(angus),Angus sees Bertie 可以被形式化为 see(angus, bertie)。我们称 walk 为一元谓词,see 为二元谓词。作为谓词使用的符号不具有内在的含义,虽然很难记住这一点。回到我们前面的一个例子,`(13a)``(13b)`之间没有逻辑区别。
一阶逻辑保留所有命题逻辑的布尔运算符。但它增加了一些重要的新机制。首先,命题被分析成谓词和参数,这将我们与自然语言的结构的距离拉近了一步。一阶逻辑的标准构造规则承认以下术语:独立变量和独立常量、带不同数量的参数的谓词。例如,`Angus walks`可以被形式化为`walk(angus)``Angus sees Bertie`可以被形式化为`see(angus, bertie)`。我们称`walk`为一元谓词,`see`为二元谓词。作为谓词使用的符号不具有内在的含义,虽然很难记住这一点。回到我们前面的一个例子,`(13a)``(13b)`之间没有逻辑区别。
```py
>>> read_expr = nltk.sem.Expression.fromstring
......@@ -183,9 +183,9 @@ e
e
```
一种二元谓词具有类型〈e, 〈e, t〉〉。虽然这是先组合类型 e 的一个参数成一个一元谓词的类型,我们可以用二元谓词的两个参数直接组合来表示二元谓词。例如,在`Angus sees Cyril`的翻译中谓词 see 会与它的参数结合得到结果 see(angus, cyril)
一种二元谓词具有类型`<e, <e, t>>`。虽然这是先组合类型`e`的一个参数成一个一元谓词的类型,我们可以用二元谓词的两个参数直接组合来表示二元谓词。例如,在`Angus sees Cyril`的翻译中谓词`see`会与它的参数结合得到结果`see(angus, cyril)`
在一阶逻辑中,谓词的参数也可以是独立变量,如 x,y 和 z。在 NLTK 中,我们采用的惯例:*e* 类型的变量都是小写。独立变量类似于人称代词,如 he,she 和 it ,其中我们为了弄清楚它们的含义需要知道它们使用的上下文。
在一阶逻辑中,谓词的参数也可以是独立变量,如`x, y, z`。在 NLTK 中,我们采用的惯例:`e`类型的变量都是小写。独立变量类似于人称代词,如`he``she``it`,其中我们为了弄清楚它们的含义需要知道它们使用的上下文。
解释`(14)`中的代名词的方法之一是指向上下文中相关的个体。
......@@ -196,7 +196,7 @@ e
## 3.2 一阶定理证明
回顾一下我们较早前在`(10)`中提出的 to the north of 上的限制:
回顾一下我们较早前在`(10)`中提出的`to the north of`上的限制:
```py
all x. all y.(north_of(x, y) -> -north_of(y, x))
......@@ -213,7 +213,7 @@ False
## 3.3 一阶逻辑语言总结
我们将借此机会重新表述前面的命题逻辑的语法规则,并添加量词的形式化规则;所有这些一起组成一阶逻辑的句法。此外,我们会明确相关表达式的类型。我们将采取约定:〈e&lt;sup&gt;n&lt;/sup&gt;, t〉一种由 n 个类型为 e 的参数组成产生一个类型为 t 的表达式的谓词的类型。在这种情况下,我们说 n 是谓词的元数。
我们将借此机会重新表述前面的命题逻辑的语法规则,并添加量词的形式化规则;所有这些一起组成一阶逻辑的句法。此外,我们会明确相关表达式的类型。我们将采取约定:`<e^n, t>`,一种由`n`个类型为`e`的参数组成产生一个类型为`t`的表达式的谓词的类型。在这种情况下,我们说`n`是谓词的元数。
> 1. If P is a predicate of type 〈e&lt;sup&gt;n&lt;/sup&gt;, t〉, and α[1], ... α&lt;sub&gt;n&lt;/sub&gt; are terms of type e, then P(α[1], ... α&lt;sub&gt;n&lt;/sub&gt;) is of type t.
> 2. If α and β are both of type e, then (α = β) and (α != β) are of type t.
......@@ -231,7 +231,7 @@ False
>>> dom = {'b', 'o', 'c'}
```
我们使用工具函数`Valuation.fromstring()` symbol `=>` value 形式的字符串序列转换成一个`Valuation`对象。
我们使用工具函数`Valuation.fromstring()``symbol => value`形式的字符串序列转换成一个`Valuation`对象。
```py
>>> v = """
......@@ -262,7 +262,7 @@ False
**轮到你来**:模仿 1.2 绘制一个图,描述域`m`和相应的每个一元谓词的集合。
你可能已经注意到,我们的一元谓词(即`boy``girl``dog`)也是以单个元组的集合而不是个体的集合出现的。这使我们能够方便的统一处理任何元数的关系。一个形式为 P(τ[1], ... τ&lt;sub&gt;n&lt;/sub&gt;)的谓词,其中 P 是 n 元的,为真的条件是对应于(τ[1], ... τ&lt;sub&gt;n&lt;/sub&gt;) 的值的元组属于 P 的值的元组的集合。
你可能已经注意到,我们的一元谓词(即`boy``girl``dog`)也是以单个元组的集合而不是个体的集合出现的。这使我们能够方便的统一处理任何元数的关系。一个形式为`P(τ[1], ... τ[n])`的谓词,其中`P``n`元的,为真的条件是对应于`(τ[1], ..., τ[n])`的值的元组属于`P`的值的元组的集合。
```py
>>> ('o', 'c') in val['see']
......@@ -303,7 +303,7 @@ True
'c'
```
由于我们已经知道`o``c` see 关系中表示的含义,所以`True`值是我们所期望的。在这种情况下,我们可以说赋值`g`满足公式`see(olive, y)`。相比之下,下面的公式相对`g`的评估结果为`False`(检查为什么会是你看到的这样)。
由于我们已经知道`o``c``see`关系中表示的含义,所以`True`值是我们所期望的。在这种情况下,我们可以说赋值`g`满足公式`see(olive, y)`。相比之下,下面的公式相对`g`的评估结果为`False`(检查为什么会是你看到的这样)。
```py
>>> m.evaluate('see(y, x)', g)
......@@ -318,7 +318,7 @@ False
{}
```
如果我们现在尝试为公式,如`see(olive, y)`,相对于`g`估值,就像试图解释一个包含一个 him 的句子,我们不知道 him 指什么。在这种情况下,估值函数未能提供一个真值。
如果我们现在尝试为公式,如`see(olive, y)`,相对于`g`估值,就像试图解释一个包含一个`him`的句子,我们不知道`him`指什么。在这种情况下,估值函数未能提供一个真值。
```py
>>> m.evaluate('see(olive, y)', g)
......@@ -393,7 +393,7 @@ True
>>> val2 = nltk.Valuation.fromstring(v2)
```
admire 关系可以使用`(28)`所示的映射图进行可视化。
`admire`关系可以使用`(28)`所示的映射图进行可视化。
```py
>>> dom2 = val2.domain
......@@ -428,7 +428,7 @@ set()
我们一直假设我们已经有了一个模型,并要检查模型中的一个句子的真值。相比之下,模型的建立是给定一些句子的集合,尝试创造一种新的模型。如果成功,那么我们知道集合是一致的,因为我们有模型的存在作为证据。
我们通过创建`Mace()`的一个实例并调用它的`build_model()`方法来调用 Mace4 模式产生器,与调用 Prover9 定理证明器类似的方法。一种选择是将我们的候选的句子集合作为假设,保留目标为未指定。下面的交互显示了`[a, c1]``[a, c2]`都是一致的列表,因为 Mace 成功的为它们都建立了一个模型,而`[c1, c2]`不一致。
我们通过创建`Mace()`的一个实例并调用它的`build_model()`方法来调用 Mace4 模式产生器,与调用 Prover9 定理证明器类似的方法。一种选择是将我们的候选的句子集合作为假设,保留目标为未指定。下面的交互显示了`[a, c1]``[a, c2]`都是一致的列表,因为`Mace`成功的为它们都建立了一个模型,而`[c1, c2]`不一致。
```py
>>> a3 = read_expr('exists x.(man(x) & walks(x))')
......@@ -445,7 +445,7 @@ False
我们也可以使用模型建立器作为定理证明器的辅助。假设我们正试图证明`S``g`,即`g`是假设`S = [s1, s2, ..., sn]`的逻辑派生。我们可以同样的输入提供给 Mace4,模型建立器将尝试找出一个反例,就是要表明`g`*不*遵循从`S`。因此,给定此输入,Mace4 将尝试为假设`S`连同`g`的否定找到一个模型,即列表`S' = [s1, s2, ..., sn, -g]`。如果`g``S`不能证明出来,那么 Mace4 会返回一个反例,比 Prover9 更快的得出结论:无法找到所需的证明。相反,如果`g``S`是可以证明出来,Mace4 可能要花很长时间不能成功地找到一个反例模型,最终会放弃。
让我们思考一个具体的方案。我们的假设是列表[There is a woman that every man loves, Adam is a man, Eve is a woman]。我们的结论是 Adam loves Eve。Mace4 能找到使假设为真而结论为假的模型吗?在下面的代码中,我们使用`MaceCommand()`检查已建立的模型。
让我们思考一个具体的方案。我们的假设是列表`[There is a woman that every man loves, Adam is a man, Eve is a woman]`。我们的结论是`Adam loves Eve`。Mace4 能找到使假设为真而结论为假的模型吗?在下面的代码中,我们使用`MaceCommand()`检查已建立的模型。
```py
>>> a4 = read_expr('exists y. (woman(y) & all x. (man(x) -> love(x,y)))')
......@@ -457,7 +457,7 @@ False
True
```
因此答案是肯定的:Mace4 发现了一个反例模型,其中 Adam 爱某个女人而不是 Eve。但是,让我们细看 Mace4 的模型,转换成我们用来估值的格式。
因此答案是肯定的:Mace4 发现了一个反例模型,其中`Adam`爱某个女人而不是`Eve`。但是,让我们细看 Mace4 的模型,转换成我们用来估值的格式。
```py
>>> print(mc.valuation)
......@@ -469,7 +469,7 @@ True
'woman': {('a',), ('b',)}}
```
这个估值的一般形式应是你熟悉的:它包含了一些单独的常量和谓词,每一个都有适当类型的值。可能令人费解的是`C1`。它是一个“Skolem 常量”,模型生成器作为存在量词的表示引入的。也就是说,模型生成器遇到`a4`里面的`exists y`,它知道,域中有某个个体`b`满足`a4`中的开放公式。然而,它不知道`b`是否也是它的输入中的某个地方的一个独立常量的标志,所以它为`b`凭空创造了一个新名字,即`C1`。现在,由于我们的假设中没有关于独立常量`adam``eve`的信息,模型生成器认为没有任何理由将它们当做表示不同的实体,于是它们都得到映射到`a`。此外,我们并没有指定`man``woman`表示不相交的集合,因此,模型生成器让它们相互重叠。这个演示非常明显的隐含了我们用来解释我们的情境的知识,而模型生成器对此一无所知。因此,让我们添加一个新的假设,使 man 和 woman 不相交。模型生成器仍然产生一个反例模型,但这次更符合我们直觉的有关情况:
这个估值的一般形式应是你熟悉的:它包含了一些单独的常量和谓词,每一个都有适当类型的值。可能令人费解的是`C1`。它是一个“Skolem 常量”,模型生成器作为存在量词的表示引入的。也就是说,模型生成器遇到`a4`里面的`exists y`,它知道,域中有某个个体`b`满足`a4`中的开放公式。然而,它不知道`b`是否也是它的输入中的某个地方的一个独立常量的标志,所以它为`b`凭空创造了一个新名字,即`C1`。现在,由于我们的假设中没有关于独立常量`adam``eve`的信息,模型生成器认为没有任何理由将它们当做表示不同的实体,于是它们都得到映射到`a`。此外,我们并没有指定`man``woman`表示不相交的集合,因此,模型生成器让它们相互重叠。这个演示非常明显的隐含了我们用来解释我们的情境的知识,而模型生成器对此一无所知。因此,让我们添加一个新的假设,使`man``woman`不相交。模型生成器仍然产生一个反例模型,但这次更符合我们直觉的有关情况:
```py
>>> a7 = read_expr('all x. (man(x) -> -woman(x))')
......@@ -492,7 +492,7 @@ True
## 4.1 基于特征的语法中的合成语义学
在本章开头,我们简要说明了一种在句法分析的基础上建立语义表示的方法,使用在 9 开发的语法框架。这一次,不是构建一个 SQL 查询,我们将建立一个逻辑形式。我们设计这样的语法的指导思想之一是组合原则。(也称为 Frege 原则;下面给出的公式参见(Gleitman & Liberman, 1995) 。)
在本章开头,我们简要说明了一种在句法分析的基础上建立语义表示的方法,使用在 9 开发的语法框架。这一次,不是构建一个 SQL 查询,我们将建立一个逻辑形式。我们设计这样的语法的指导思想之一是组合原则。(也称为 Frege 原则;下面给出的公式参见(Gleitman & Liberman, 1995)。)
**组合原则**:整体的含义是部分的含义与它们的句法结合方式的函数。
......@@ -509,7 +509,7 @@ IV[SEM=<\x.bark(x)>] -> 'barks'
## 4.2 λ演算
在 3 中,我们指出数学集合符号对于制定我们想从文档中选择的词的属性 P 很有用。我们用`(31)`说明这个,它是“所有 w 的集合,其中 w 是 V(词汇表)的元素且 w 有属性 P”的表示。
在 3 中,我们指出数学集合符号对于制定我们想从文档中选择的词的属性`P`很有用。我们用`(31)`说明这个,它是“所有`w`的集合,其中`w``V`(词汇表)的元素且`w`有属性`P`”的表示。
```py
>>> read_expr = nltk.sem.Expression.fromstring
......@@ -522,14 +522,14 @@ set()
\x.(walk(x) & chew_gum(y))
```
我们对绑定表达式中的变量的结果有一个特殊的名字:λ-抽象。当你第一次遇到λ-抽象时,很难对它们的意思得到一个直观的感觉。`(33b)`的一对英语表示是“是一个 x,其中 x 步行且 x 嚼口香糖”或“具有步行和嚼口香糖的属性。”通常认为λ-抽象可以很好的表示动词短语(或无主语从句),尤其是当它作为参数出现在它自己的右侧时。如`(34a)`和它的翻译`(34b)`中的演示。
我们对绑定表达式中的变量的结果有一个特殊的名字:λ 抽象。当你第一次遇到 λ 抽象时,很难对它们的意思得到一个直观的感觉。`(33b)`的一对英语表示是“是一个`x`,其中`x`步行且`x`嚼口香糖”或“具有步行和嚼口香糖的属性。”通常认为λ-抽象可以很好的表示动词短语(或无主语从句),尤其是当它作为参数出现在它自己的右侧时。如`(34a)`和它的翻译`(34b)`中的演示。
```py
(walk(x) & chew_gum(x))[gerald/x]
```
虽然我们迄今只考虑了λ-抽象的主体是一个某种类型 t 的开放公式,这不是必要的限制;主体可以是任何符合语法的表达式。下面是一个有两个λ的例子。
虽然我们迄今只考虑了λ-抽象的主体是一个某种类型`t`的开放公式,这不是必要的限制;主体可以是任何符合语法的表达式。下面是一个有两个λ的例子。
```py
>>> print(read_expr(r'\x.\y.(dog(x) & own(y, x))(cyril)').simplify())
......@@ -563,7 +563,7 @@ exists z1.see(z1,x)
## 4.3 量化的 NP
在本节开始,我们简要介绍了如何为 Cyril barks 构建语义表示。你会以为这太容易了——肯定还有更多关于建立组合语义的。例如,量词?没错,这是一个至关重要的问题。例如,我们要给出`(42a)`的逻辑形式`(42b)`。如何才能实现呢?
在本节开始,我们简要介绍了如何为`Cyril barks`构建语义表示。你会以为这太容易了——肯定还有更多关于建立组合语义的。例如,量词?没错,这是一个至关重要的问题。例如,我们要给出`(42a)`的逻辑形式`(42b)`。如何才能实现呢?
```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)`那样的表达式的函数应用。因此,我们需要为它们提出不同的语义表示。我们在这种情况下所做的是重新解释适当的名称,使它们也成为如量化的`NP`那样的函数表达式。这里是 Angus 的λ表达式。
为了建立一个句子的语义表示,我们也需要组合主语`NP`的语义。如果后者是一个量化的表达式,例如`every girl`,一切都与我们前面讲过的`a dog barks`一样的处理方式;主语转换为函数表达式,这被用于`VP`的语义表示。然而,我们现在似乎已经用适当的名称为自己创造了另一个问题。到目前为止,这些已经作为单独的常量进行了语义的处理,这些不能作为像`(47)`那样的表达式的函数应用。因此,我们需要为它们提出不同的语义表示。我们在这种情况下所做的是重新解释适当的名称,使它们也成为如量化的`NP`那样的函数表达式。这里是 Angus 的 λ 表达式。
```py
>>> from nltk import load_parser
......@@ -588,7 +588,7 @@ exists z1.see(z1,x)
all z2.(dog(z2) -> exists z1.(bone(z1) & give(angus,z1,z2)))
```
NLTK 提供一些实用工具使获得和检查的语义解释更容易。函数`interpret_sents()`用于批量解释输入句子的列表。它建立一个字典`d`,其中对每个输入的句子`sent``d[sent]`是包含`sent`的分析树和语义表示的(_synrep_, *semrep*)对的列表。该值是一个列表,因为`sent`可能有句法歧义;在下面的例子中,列表中的每个句子只有一个分析树。
NLTK 提供一些实用工具使获得和检查的语义解释更容易。函数`interpret_sents()`用于批量解释输入句子的列表。它建立一个字典`d`,其中对每个输入的句子`sent``d[sent]`是包含`sent`的分析树和语义表示的`(synrep, semrep)`对的列表。该值是一个列表,因为`sent`可能有句法歧义;在下面的例子中,列表中的每个句子只有一个分析树。
```py
>>> sents = ['Irene walks', 'Cyril bites an ankle']
......@@ -668,7 +668,7 @@ all x.(girl(x) -> exists z4.(dog(z4) & chase(x,z4)))
## 5 段落语义层
段落是句子的序列。很多时候,段落中的一个句子的解释依赖它前面的句子。一个明显的例子来自照应代词,如 he、she 和 it。给定一个段落如 Angus used to have a dog. But he recently disappeared.,你可能会解释 he 指的是 Angus 的狗。然而,在 Angus used to have a dog. He took him for walks in New Town.中,你更可能解释 he 指的是 Angus 自己。
段落是句子的序列。很多时候,段落中的一个句子的解释依赖它前面的句子。一个明显的例子来自照应代词,如`he``she``it`。给定一个段落如`Angus used to have a dog. But he recently disappeared.`,你可能会解释`he`指的是 Angus 的狗。然而,在`Angus used to have a dog. He took him for walks in New Town.`中,你更可能解释`he`指的是 Angus 自己。
## 5.1 段落表示理论
......@@ -696,7 +696,7 @@ all x.(girl(x) -> exists z4.(dog(z4) & chase(x,z4)))
exists x y.(angus(x) & dog(y) & own(x,y))
```
作为一阶逻辑表达式功能补充,DRT`表达式`有 DRS-连接运算符,用`+`符号表示。两个 DRS 的连接是一个单独的 DRS 包含合并的段落指称和来自两个论证的条件。DRS-连接自动进行α-转换绑定变量避免名称冲突。
作为一阶逻辑表达式功能补充,DRT 表达式有 DRS 连接运算符,用`+`符号表示。两个 DRS 的连接是一个单独的 DRS 包含合并的段落指称和来自两个论证的条件。DRS 连接自动进行 α 转换绑定变量避免名称冲突。
```py
>>> drs2 = read_dexpr('([x], [walk(x)]) + ([y], [run(y)])')
......@@ -740,7 +740,7 @@ Det[num=sg,SEM=<\P Q. exists x.(P(x) & Q(x))>] -> 'a'
我们解释一句话时会使用丰富的上下文知识,一部分取决于前面的内容,一部分取决于我们的背景假设。DRT 提供了一个句子的含义如何集成到前面段落表示中的理论,但是在前面的讨论中明显缺少这两个部分。首先,一直没有尝试纳入任何一种推理;第二,我们只处理了个别句子。这些遗漏由模块`nltk.inference.discourse`纠正。
段落是一个句子的序列 s[1], ... s&lt;sub&gt;n&lt;/sub&gt;,段落线是读法的序列 s[1]-r&lt;sub&gt;i&lt;/sub&gt;, ... s&lt;sub&gt;n&lt;/sub&gt;-r&lt;sub&gt;j&lt;/sub&gt; ,每个序列对应段落中的一个句子。该模块按增量处理句子,当有歧义时保持追踪所有可能的线。为简单起见,下面的例子中忽略了范围歧义。
段落是一个句子的序列`s[1], ..., s[n]`,段落线是读法的序列`s[1]-r[i], ... s[n]-r[j]`,每个序列对应段落中的一个句子。该模块按增量处理句子,当有歧义时保持追踪所有可能的线。为简单起见,下面的例子中忽略了范围歧义。
```py
>>> dt = nltk.DiscourseTester(['A student dances', 'Every student is a person'])
......@@ -782,7 +782,7 @@ Not informative relative to thread 'd0'
也可以传递另一套假设作为背景知识,并使用这些筛选出不一致的读法;详情请参阅`http://nltk.org/howto`上的段落 HOWTO。
`discourse`模块可适应语义歧义,筛选出不可接受的读法。下面的例子调用 Glue 语义和 DRT。由于 Glue 语义模块被配置为使用的覆盖面广的 Malt 依存关系分析器,输入(Every dog chases a boy. He runs.)需要分词和标注。
`discourse`模块可适应语义歧义,筛选出不可接受的读法。下面的例子调用 Glue 语义和 DRT。由于 Glue 语义模块被配置为使用的覆盖面广的 Malt 依存关系分析器,输入(`Every dog chases a boy. He runs.`)需要分词和标注。
```py
>>> from nltk.tag import RegexpTagger
......@@ -816,7 +816,7 @@ d1: ['s0-r1', 's1-r0'] : ([z6,z10],[boy(z6), (([x],[dog(x)]) ->
([],[chases(x,z6)])), (z10 = z6), runs(z10)])
```
当我们检查段落线`d0``d1`时,我们看到读法`s0-r0`,其中 every dog 超出了`a boy`的范围,被认为是不可接受的,因为第二句的代词不能得到解释。相比之下,段落线`d1`中的代词(重写为`z24`*通过*等式`(z24 = z20)`绑定。
当我们检查段落线`d0``d1`时,我们看到读法`s0-r0`,其中`every dog`超出了`a boy`的范围,被认为是不可接受的,因为第二句的代词不能得到解释。相比之下,段落线`d1`中的代词(重写为`z24`*通过*等式`(z24 = z20)`绑定。
不可接受的读法可以通过传递参数`filter=True`过滤掉。
......@@ -836,10 +836,10 @@ d1: ['s0-r1', 's1-r0'] : ([z12,z15],[boy(z12), (([x],[dog(x)]) ->
* λ-演算中的β-约简在语义上与函数传递参数对应。句法上,它包括将被函数表达式中的λ绑定的变量替换为函数应用中表达式提供的参数。
* 构建模型的一个关键部分在于建立估值,为非逻辑常量分配解释。这些被解释为 *n* 元谓词或独立常量。
* 一个开放表达式是一个包含一个或多个自由变量的表达式。开放表达式只在它的自由变量被赋值时被解释。
* 量词的解释是对于具有变量 x 的公式φ[x],构建个体的集合,赋值 *g* 分配它们作为 x 的值使φ[x]为真。然后量词对这个集合加以约束。
* 量词的解释是对于具有变量`x`的公式`φ[x]`,构建个体的集合,赋值`g`分配它们作为`x`的值使`φ[x]`为真。然后量词对这个集合加以约束。
* 一个封闭的表达式是一个没有自由变量的表达式;也就是,变量都被绑定。一个封闭的表达式是真是假取决于所有变量赋值。
* 如果两个公式只是由绑定操作符(即λ或量词)绑定的变量的标签不同,那么它们是α-等价。重新标记公式中的绑定变量的结果被称为α-转换。
* 给定有两个嵌套量词 *Q*[1]和 *Q*[2]的公式,最外层的量词 *Q*[1]有较广的范围(或范围超出 *Q*[2])。英语句子往往由于它们包含的量词的范围而产生歧义。
* 给定有两个嵌套量词`Q[1]``Q[2]`的公式,最外层的量词`Q[1]`有较广的范围(或范围超出`Q[2]`)。英语句子往往由于它们包含的量词的范围而产生歧义。
* 在基于特征的语法中英语句子可以通过将`sem`作为特征与语义表达关联。一个复杂的表达式的`sem`值通常包括成分表达式的`sem`值的函数应用。
## 7 深入阅读
......@@ -852,8 +852,8 @@ d1: ['s0-r1', 's1-r0'] : ([z12,z15],[boy(z12), (([x],[dog(x)]) ->
1. 事件、时态和体;
2. 语义角色;
3. 广义量词,如 most
4. 内涵结构,例如像 may 和 believe 这样的动词。
3. 广义量词,如`most`
4. 内涵结构,例如像`may``believe`这样的动词。
`(1)``(2)`可以使用一阶逻辑处理,`(3)``(4)`需要不同的逻辑。下面的读物中很多都讲述了这些问题。
......@@ -863,7 +863,7 @@ d1: ['s0-r1', 's1-r0'] : ([z12,z15],[boy(z12), (([x],[dog(x)]) ->
要说范围广泛,参阅两卷本的关于逻辑教科书(Gamut, 1991)和(Gamut, 1991),也包含了有关自然语言的形式语义的当代材料,例如 Montague 文法和内涵逻辑。(Kamp & Reyle, 1993)提供段落表示理论的权威报告,包括涵盖大量且有趣的自然语言片段,包括时态、体和形态。另一个对许多自然语言结构的语义的全面研究是(Carpenter, 1997)。
有许多作品介绍语言学理论框架内的逻辑语义。(Chierchia & McConnell-Ginet, 1990)与句法相对无关,而(Heim & Kratzer, 1998) and (Larson & Segal, 1995)都更明确的倾向于将语义真值条件整合到乔姆斯基框架中。
有许多作品介绍语言学理论框架内的逻辑语义。(Chierchia & McConnell-Ginet, 1990)与句法相对无关,而(Heim & Kratzer, 1998)(Larson & Segal, 1995)都更明确的倾向于将语义真值条件整合到乔姆斯基框架中。
(Blackburn & Bos, 2005)是致力于计算语义的第一本教科书,为该领域提供了极好的介绍。它扩展了许多本章涵盖的主题,包括量词范围歧义的未指定、一阶逻辑推理以及段落处理。
......@@ -980,9 +980,9 @@ d1: ['s0-r1', 's1-r0'] : ([z12,z15],[boy(z12), (([x],[dog(x)]) ->
all x.(dog(x) -&gt; bark(x))
```
8. ◑ 开发一种方法,翻译英语句子为带有二元广义量词的公式。在此方法中,给定广义量词`Q`,量化公式的形式为`Q(A, B)`,其中`A``B`〈_e_, *t*类型的表达式。那么,例如`all(A, B)`为真当且仅当`A`表示的是`B`所表示的一个子集。
8. ◑ 开发一种方法,翻译英语句子为带有二元广义量词的公式。在此方法中,给定广义量词`Q`,量化公式的形式为`Q(A, B)`,其中`A``B``<e, t>`类型的表达式。那么,例如`all(A, B)`为真当且仅当`A`表示的是`B`所表示的一个子集。
9. ◑ 扩展前面练习中的方法,使量词如 most 和 exactly three 的真值条件可以在模型中计算。
9. ◑ 扩展前面练习中的方法,使量词如`most``exactly three`的真值条件可以在模型中计算。
10. ◑ 修改`sem.evaluate`代码,使它能提供一个有用的错误消息,如果一个表达式不在模型的估值函数的域中。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册