diff --git a/1.md b/1.md index 784ef5b45b580489a3dbf2c9b49d8c0fecbf2e7b..7053d1e6dd1f0d74f1b4c69f6a4ab718741f9ec7 100644 --- a/1.md +++ b/1.md @@ -53,7 +53,7 @@ SyntaxError: invalid syntax >>> ``` -产生了一个语法错误。在 Python 中,指令以加号结尾是没有意义的。Python 解释器会指出发生错误的行(“标准输入”`<stdin>`的第 1 行)。 +产生了一个语法错误。在 Python 中,指令以加号结尾是没有意义的。Python 解释器会指出发生错误的行(“标准输入”``的第 1 行)。 现在我们学会使用 Python 解释器了,已经准备好可以开始处理语言数据了。 @@ -664,7 +664,7 @@ what output do you expect here? 注意 -如果上面省掉`list()`,只输入`bigrams(['more', ...])`,你将看到`<generator object bigrams at 0x10fb8b3a8>` 的输出形式。这是 Python 的方式表示它已经准备好要计算一个序列,在这里是双连词。现在,你只需要知道告诉 Python 使用`list()`将它转换成一个列表。 +如果上面省掉`list()`,只输入`bigrams(['more', ...])`,你将看到`` 的输出形式。这是 Python 的方式表示它已经准备好要计算一个序列,在这里是双连词。现在,你只需要知道告诉 Python 使用`list()`将它转换成一个列表。 在这里我们看到词对 than-done 是一个双连词,在 Python 中写成`('than', 'done')`。现在,搭配基本上就是频繁的双连词,除非我们更加注重包含不常见词的的情况。特别的,我们希望找到比我们基于单个词的频率预期得到的更频繁出现的双连词。`collocations()` 函数为我们做这些。我们将在以后看到它是如何工作。 diff --git a/10.md b/10.md index 9f3e516aa07175e8fae81e86e3ce090570c9fe15..efa62b81540251876388dc494193f0784e524c15 100644 --- a/10.md +++ b/10.md @@ -72,7 +72,7 @@ implication -> equivalence <-> ``` -从命题符号和布尔运算符,我们可以建立命题逻辑的规范公式(或简称公式)的无限集合。首先,每个命题字母是一个公式。然后,如果φ是一个公式,那么`-`φ也是一个公式。如果φ和ψ是公式,那么`(`φ `&` ψ`)` `(`φ `|` ψ`)` `(`φ `->` ψ`)` `(`φ `<->` ψ`)`也是公式。 +从命题符号和布尔运算符,我们可以建立命题逻辑的规范公式(或简称公式)的无限集合。首先,每个命题字母是一个公式。然后,如果φ是一个公式,那么`-`φ也是一个公式。如果φ和ψ是公式,那么`(`φ `&` ψ`)` `(`φ `|` ψ`)` `(`φ `->` ψ`)` `(`φ `<->` ψ`)`也是公式。 [2.1](./ch10.html#tab-boolean-tcs)指定了包含这些运算符的公式为真的条件。和以前一样,我们使用φ和ψ作为句子中的变量,iff 作为 if and only if(当且仅当)的缩写。 @@ -174,7 +174,7 @@ e ``` -为什么我们在这个例子的结尾看到`<e,?>`呢?虽然类型检查器会尝试推断出尽可能多的类型,在这种情况下,它并没有能够推断出`walk`的类型,所以其结果的类型是未知的。虽然我们期望`walk`的类型是`<e, t>`,迄今为止类型检查器知道的,在这个上下文中可能是一些其他类型,如`<e, e>`或`<e, <e, t>`。要帮助类型检查器,我们需要指定一个信号,作为一个字典来实施,明确的与非逻辑常量类型关联: +为什么我们在这个例子的结尾看到``呢?虽然类型检查器会尝试推断出尽可能多的类型,在这种情况下,它并没有能够推断出`walk`的类型,所以其结果的类型是未知的。虽然我们期望`walk`的类型是``,迄今为止类型检查器知道的,在这个上下文中可能是一些其他类型,如``或``。要帮助类型检查器,我们需要指定一个信号,作为一个字典来实施,明确的与非逻辑常量类型关联: ```py >>> sig = {'walk': ''} @@ -218,7 +218,7 @@ False > 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. > 3. If φ is of type t, then so is `-`φ. -> 4. If φ and ψ are of type t, then so are (φ `&` ψ), (φ `|` ψ), (φ `->` ψ) and (φ `<->` ψ). +> 4. If φ and ψ are of type t, then so are (φ `&` ψ), (φ `|` ψ), (φ `->` ψ) and (φ `<->` ψ). > 5. If φ is of type t, and x is a variable of type e, then `exists x.`φ and `all x.`φ are of type t. [3.1](./ch10.html#tab-nltk-logic)总结了`logic`模块的新的逻辑常量,以及`Expression`模块的两个方法。 @@ -231,7 +231,7 @@ False >>> dom = {'b', 'o', 'c'} ``` -我们使用工具函数`Valuation.fromstring()`将 symbol `=>` value 形式的字符串序列转换成一个`Valuation`对象。 +我们使用工具函数`Valuation.fromstring()`将 symbol `=>` value 形式的字符串序列转换成一个`Valuation`对象。 ```py >>> v = """ @@ -364,7 +364,7 @@ NLTK 中提供了一个有用的工具是`satisfiers()`方法。它返回满足 {'b', 'o'} ``` -想一想为什么`fmla2`和`fmla3`是那样的值,这是非常有用。`->`的真值条件的意思是`fmla2`等价于`-girl(x) | walk(x)`,要么不是女孩要么没有步行的个体满足条件。因为`b`(Bertie)和`c`(Cyril)都不是女孩,根据模型`m`,它们都满足整个公式。当然`o`也满足公式,因为`o`两项都满足。现在,因为话题的域的每一个成员都满足`fmla2`,相应的全称量化公式也为真。 +想一想为什么`fmla2`和`fmla3`是那样的值,这是非常有用。`->`的真值条件的意思是`fmla2`等价于`-girl(x) | walk(x)`,要么不是女孩要么没有步行的个体满足条件。因为`b`(Bertie)和`c`(Cyril)都不是女孩,根据模型`m`,它们都满足整个公式。当然`o`也满足公式,因为`o`两项都满足。现在,因为话题的域的每一个成员都满足`fmla2`,相应的全称量化公式也为真。 ```py >>> m.evaluate('all x.(girl(x) -> walk(x))', g) @@ -807,7 +807,7 @@ s1 readings: s1-r0: ([x],[PRO(x), runs(x)]) ``` -段落的第一句有两种可能的读法,取决于量词的作用域。第二句的唯一的读法通过条件<cite>PRO(x)`</cite>表示代词 He。现在让我们看看段落线的结果: +段落的第一句有两种可能的读法,取决于量词的作用域。第二句的唯一的读法通过条件<cite>PRO(x)`>> dt.readings(show_thread_readings=True) diff --git a/11.md b/11.md index 48d7812981c0d4a48ac508a7ae57d3afce7587df..0a6a2b129693bf452437156ac61d912a83dc5792 100644 --- a/11.md +++ b/11.md @@ -364,7 +364,7 @@ sleep: wake 我们可以用 XML 来表示许多种语言信息。然而,灵活性是要付出代价的。每次我们增加复杂性,如允许一个元素是可选的或重复的,我们对所有访问这些数据的程序都要做出更多的工作。我们也使它更难以检查数据的有效性,或使用一种 XML 查询语言来查询数据。 -因此,使用 XML 来表示语言结构并不能神奇地解决数据建模问题。我们仍然需要解决如何结构化数据,然后用一个模式定义结构,并编写程序读取和写入格式,以及把它转换为其他格式。同样,我们仍然需要遵循一些有关数据规范化的标准原则。这是明智的,可以避免相同信息的重复复制,所以当只有一个副本变化时,不会导致数据不一致。例如,交叉引用表示为`<xref>headword</xref>`将重复存储一些其他词条的核心词,如果在其他位置的字符串的副本被修改,链接就会被打断。信息类型之间存在的依赖关系需要建模,使我们不能创建没有根的元素。例如,如果 sense 的定义不能作为词条独立存在,那么`sense`就要嵌套在`entry`元素中。多对多关系需要从层次结构中抽象出来。例如,如果一个 word 可以有很多对应的 senses,一个 sense 可以有几个对应的 words,而 words 和 senses 都必须作为(word, sense)对的列表分别枚举。这种复杂的结构甚至可以分割成三个独立的 XML 文件。 +因此,使用 XML 来表示语言结构并不能神奇地解决数据建模问题。我们仍然需要解决如何结构化数据,然后用一个模式定义结构,并编写程序读取和写入格式,以及把它转换为其他格式。同样,我们仍然需要遵循一些有关数据规范化的标准原则。这是明智的,可以避免相同信息的重复复制,所以当只有一个副本变化时,不会导致数据不一致。例如,交叉引用表示为``将重复存储一些其他词条的核心词,如果在其他位置的字符串的副本被修改,链接就会被打断。信息类型之间存在的依赖关系需要建模,使我们不能创建没有根的元素。例如,如果 sense 的定义不能作为词条独立存在,那么`sense`就要嵌套在`entry`元素中。多对多关系需要从层次结构中抽象出来。例如,如果一个 word 可以有很多对应的 senses,一个 sense 可以有几个对应的 words,而 words 和 senses 都必须作为(word, sense)对的列表分别枚举。这种复杂的结构甚至可以分割成三个独立的 XML 文件。 正如我们看到的,虽然 XML 提供了一个格式方便和用途广泛的工具,但它不是能解决一切问题的灵丹妙药。 @@ -554,7 +554,7 @@ SHYL 15 15 2 26 21 0 ## 4.5 格式化条目 -我们可以使用在前一节看到的同样的想法生成 HTML 表格而不是纯文本。这对于将 Toolbox 词汇发布到网络上非常有用。它产生 HTML 元素`<table>`,`<tr>`(表格的行)和`<td>`(表格数据)。 +我们可以使用在前一节看到的同样的想法生成 HTML 表格而不是纯文本。这对于将 Toolbox 词汇发布到网络上非常有用。它产生 HTML 元素``,``(表格的行)和`
`(表格数据)。 ```py >>> html = "\n" diff --git a/3.md b/3.md index 45a0a4f18612639a5368bd874b0459ab63c18eb8..9e3f99985c24fa47ea0ddb64ea9200919526085c 100644 --- a/3.md +++ b/3.md @@ -248,9 +248,9 @@ You typed 8 words. 图 3.1:处理流程:打开一个 URL,读里面 HTML 格式的内容,去除标记,并选择字符的切片;然后分词,是否转换为`nltk.Text`对象是可选择的;我们也可以将所有词汇小写并提取词汇表。 -在这条流程后面还有很多操作。要正确理解它,这样有助于明确其中提到的每个变量的类型。使用`type(x)`我们可以找出任一 Python 对象`x`的类型,如`type(1)`是`<int>`因为`1`是一个整数。 +在这条流程后面还有很多操作。要正确理解它,这样有助于明确其中提到的每个变量的类型。使用`type(x)`我们可以找出任一 Python 对象`x`的类型,如`type(1)`是``因为`1`是一个整数。 -当我们载入一个 URL 或文件的内容时,或者当我们去掉 HTML 标记时,我们正在处理字符串,也就是 Python 的`<str>`数据类型。(在[3.2](./ch03.html#sec-strings)节,我们将学习更多有关字符串的内容): +当我们载入一个 URL 或文件的内容时,或者当我们去掉 HTML 标记时,我们正在处理字符串,也就是 Python 的``数据类型。(在[3.2](./ch03.html#sec-strings)节,我们将学习更多有关字符串的内容): ```py >>> raw = open('document.txt').read() @@ -258,7 +258,7 @@ You typed 8 words. ``` -当我们将一个字符串分词,会产生一个(词的)列表,这是 Python 的`<list>`类型。规范化和排序列表产生其它列表: +当我们将一个字符串分词,会产生一个(词的)列表,这是 Python 的``类型。规范化和排序列表产生其它列表: ```py >>> tokens = word_tokenize(raw) @@ -963,7 +963,7 @@ v 93 27 105 48 49 ### 搜索已分词文本 -你可以使用一种特殊的正则表达式搜索一个文本中多个词(这里的文本是一个词符列表)。例如,`"<a> <man>"`找出文本中所有 a man 的实例。尖括号用于标记词符的边界,尖括号之间的所有空白都被忽略(这只对 NLTK 中的`findall()`方法处理文本有效)。在下面的例子中,我们使用`<.*>`[❶](./ch03.html#single-token-wildcard),它将匹配所有单个词符,将它括在括号里,于是只匹配词(例如 monied)而不匹配短语(例如,a monied man)会生成。第二个例子找出以词 bro 结尾的三个词组成的短语[❷](./ch03.html#three-word-phrases)。最后一个例子找出以字母 l 开始的三个或更多词组成的序列[❸](./ch03.html#letter-l)。 +你可以使用一种特殊的正则表达式搜索一个文本中多个词(这里的文本是一个词符列表)。例如,`"<a> <man>"`找出文本中所有 a man 的实例。尖括号用于标记词符的边界,尖括号之间的所有空白都被忽略(这只对 NLTK 中的`findall()`方法处理文本有效)。在下面的例子中,我们使用`<.*>`[❶](./ch03.html#single-token-wildcard),它将匹配所有单个词符,将它括在括号里,于是只匹配词(例如 monied)而不匹配短语(例如,a monied man)会生成。第二个例子找出以词 bro 结尾的三个词组成的短语[❷](./ch03.html#three-word-phrases)。最后一个例子找出以字母 l 开始的三个或更多词组成的序列[❸](./ch03.html#letter-l)。 ```py >>> from nltk.corpus import gutenberg, nps_chat diff --git a/4.md b/4.md index d485be1d1c0233d16840deedd881ae31d469c6da..2345e7e8a0af0212a0b15a9ccde5c0c824d82e91 100644 --- a/4.md +++ b/4.md @@ -245,7 +245,7 @@ lorry: 4; red: 1; .: 1; ,: 3; Red: 1; yellow: 2 注意 -只在需要的时候进行计算(或者叫做“惰性计算”特性),这是 Python 3 和 NLTK 3 的一个普遍特点。当你期望看到一个序列时,如果你看到的却是类似`<zip object at 0x10d005448>`这样的结果, 你可以强制求值这个对象,只要把它放在一个期望序列的上下文中,比如`list(`x`)`或`for item in` x。 +只在需要的时候进行计算(或者叫做“惰性计算”特性),这是 Python 3 和 NLTK 3 的一个普遍特点。当你期望看到一个序列时,如果你看到的却是类似``这样的结果, 你可以强制求值这个对象,只要把它放在一个期望序列的上下文中,比如`list(`x`)`或`for item in` x。 对于一些 NLP 任务,有必要将一个序列分割成两个或两个以上的部分。例如,我们可能需要用 90%的数据来“训练”一个系统,剩余 10%进行测试。要做到这一点,我们指定想要分割数据的位置[❶](./ch04.html#cut-location),然后在这个位置分割序列[❷](./ch04.html#cut-sequence)。 diff --git a/7.md b/7.md index 15e180242789dbc4f67c8f4355a31b93341fcb3e..d7625493f01d081b1bd9844f60f42ae2223003d3 100644 --- a/7.md +++ b/7.md @@ -81,7 +81,7 @@ ## 2.2 标记模式 -组成一个词块语法的规则使用标记模式来描述已标注的词的序列。一个标记模式是一个词性标记序列,用尖括号分隔,如`<DT>?<JJ>*<NN>`。标记模式类似于正则表达式模式([3.4](./ch03.html#sec-regular-expressions-word-patterns))。现在,思考下面的来自《华尔街日报》的名词短语: +组成一个词块语法的规则使用标记模式来描述已标注的词的序列。一个标记模式是一个词性标记序列,用尖括号分隔,如``。标记模式类似于正则表达式模式([3.4](./ch03.html#sec-regular-expressions-word-patterns))。现在,思考下面的来自《华尔街日报》的名词短语: ```py another/DT sharp/JJ dive/NN diff --git a/9.md b/9.md index a64743342dac22a8e6aa519d52a981daa4e7cd78..7821624a413f6768a7c68a75b0198896c61da395 100644 --- a/9.md +++ b/9.md @@ -436,7 +436,7 @@ NP/NP -> Comp -> 'that' ``` -[3.1](./ch09.html#code-slashcfg)中的语法包含一个“缺口引进”产生式,即`S[-INV] -> NP S/NP`。为了正确的预填充斜线特征,我们需要为扩展`S`,`VP`和`NP`的产生式中箭头两侧的斜线添加变量值。例如,`VP/?x -> V SBar/?x`是`VP -> V SBar`的斜线版本,也就是说,可以为一个成分的父母`VP`指定斜线值,只要也为孩子`SBar`指定同样的值。最后,`NP/NP ->`允许`NP`上的斜线信息为空字符串。使用[3.1](./ch09.html#code-slashcfg)中的语法,我们可以分析序列 who do you claim that you like +[3.1](./ch09.html#code-slashcfg)中的语法包含一个“缺口引进”产生式,即`S[-INV] -> NP S/NP`。为了正确的预填充斜线特征,我们需要为扩展`S`,`VP`和`NP`的产生式中箭头两侧的斜线添加变量值。例如,`VP/?x -> V SBar/?x`是`VP -> V SBar`的斜线版本,也就是说,可以为一个成分的父母`VP`指定斜线值,只要也为孩子`SBar`指定同样的值。最后,`NP/NP ->`允许`NP`上的斜线信息为空字符串。使用[3.1](./ch09.html#code-slashcfg)中的语法,我们可以分析序列 who do you claim that you like ```py >>> tokens = 'who do you claim that you like'.split()