@@ -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)`的意思:
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`这样的格式写一个论证。
一阶逻辑保留所有命题逻辑的布尔运算符。但它增加了一些重要的新机制。首先,命题被分析成谓词和参数,这将我们与自然语言的结构的距离拉近了一步。一阶逻辑的标准构造规则承认以下术语:独立变量和独立常量、带不同数量的参数的谓词。例如,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`,其中我们为了弄清楚它们的含义需要知道它们使用的上下文。
解释`(14)`中的代名词的方法之一是指向上下文中相关的个体。
...
...
@@ -196,7 +196,7 @@ e
## 3.2 一阶定理证明
回顾一下我们较早前在`(10)`中提出的 to the north of 上的限制:
回顾一下我们较早前在`(10)`中提出的`to the north of`上的限制:
```py
allx.ally.(north_of(x,y)->-north_of(y,x))
...
...
@@ -213,7 +213,7 @@ False
## 3.3 一阶逻辑语言总结
我们将借此机会重新表述前面的命题逻辑的语法规则,并添加量词的形式化规则;所有这些一起组成一阶逻辑的句法。此外,我们会明确相关表达式的类型。我们将采取约定:〈e<sup>n</sup>, t〉一种由 n 个类型为 e 的参数组成产生一个类型为 t 的表达式的谓词的类型。在这种情况下,我们说 n 是谓词的元数。
> 1. If P is a predicate of type 〈e<sup>n</sup>, t〉, and α[1], ... α<sub>n</sub> are terms of type e, then P(α[1], ... α<sub>n</sub>) 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`对象。
你可能已经注意到,我们的一元谓词(即`boy`,`girl`,`dog`)也是以单个元组的集合而不是个体的集合出现的。这使我们能够方便的统一处理任何元数的关系。一个形式为 P(τ[1], ... τ<sub>n</sub>)的谓词,其中 P 是 n 元的,为真的条件是对应于(τ[1], ... τ<sub>n</sub>) 的值的元组属于 P 的值的元组的集合。
让我们思考一个具体的方案。我们的假设是列表[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 的模型,转换成我们用来估值的格式。
我们对绑定表达式中的变量的结果有一个特殊的名字:λ-抽象。当你第一次遇到λ-抽象时,很难对它们的意思得到一个直观的感觉。`(33b)`的一对英语表示是“是一个 x,其中 x 步行且 x 嚼口香糖”或“具有步行和嚼口香糖的属性。”通常认为λ-抽象可以很好的表示动词短语(或无主语从句),尤其是当它作为参数出现在它自己的右侧时。如`(34a)`和它的翻译`(34b)`中的演示。
为了建立一个句子的语义表示,我们也需要组合主语`NP`的语义。如果后者是一个量化的表达式,例如 every girl,一切都与我们前面讲过的 a dog barks 一样的处理方式;主语转换为函数表达式,这被用于`VP`的语义表示。然而,我们现在似乎已经用适当的名称为自己创造了另一个问题。到目前为止,这些已经作为单独的常量进行了语义的处理,这些不能作为像`(47)`那样的表达式的函数应用。因此,我们需要为它们提出不同的语义表示。我们在这种情况下所做的是重新解释适当的名称,使它们也成为如量化的`NP`那样的函数表达式。这里是 Angus 的λ表达式。
为了建立一个句子的语义表示,我们也需要组合主语`NP`的语义。如果后者是一个量化的表达式,例如`every girl`,一切都与我们前面讲过的`a dog barks`一样的处理方式;主语转换为函数表达式,这被用于`VP`的语义表示。然而,我们现在似乎已经用适当的名称为自己创造了另一个问题。到目前为止,这些已经作为单独的常量进行了语义的处理,这些不能作为像`(47)`那样的表达式的函数应用。因此,我们需要为它们提出不同的语义表示。我们在这种情况下所做的是重新解释适当的名称,使它们也成为如量化的`NP`那样的函数表达式。这里是 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 自己。
段落是句子的序列。很多时候,段落中的一个句子的解释依赖它前面的句子。一个明显的例子来自照应代词,如`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 自己。