提交 7370f7c1 编写于 作者: W wizardforcel

2020-11-21 11:28:03

上级 37f75b0b
......@@ -760,7 +760,7 @@ NLTK 频率分布类中定义的函数
>>>
```
我们还可以创建更复杂的条件。如果 c 是一个条件,那么`not` c 也是一个条件。如果我们有两个条件 c<sub>1</sub> 和 c<sub>2</sub>,那么我们可以使用合取和析取将它们合并形成一个新的条件:c<sub>1</sub> `and` c<sub>2</sub>, c<sub>1</sub> `or` c<sub>2</sub>
我们还可以创建更复杂的条件。如果 c 是一个条件,那么`not` c 也是一个条件。如果我们有两个条件 c[1] 和 c[2],那么我们可以使用合取和析取将它们合并形成一个新的条件:c[1] `and` c[2], c[1] `or` c[2]
注意
......
......@@ -215,7 +215,7 @@ False
我们将借此机会重新表述前面的命题逻辑的语法规则,并添加量词的形式化规则;所有这些一起组成一阶逻辑的句法。此外,我们会明确相关表达式的类型。我们将采取约定:〈e<sup>n</sup>, t〉一种由 n 个类型为 e 的参数组成产生一个类型为 t 的表达式的谓词的类型。在这种情况下,我们说 n 是谓词的元数。
> 1. If P is a predicate of type 〈e<sup>n</sup>, t〉, and α<sub>1</sub>, ... α<sub>n</sub> are terms of type e, then P(α<sub>1</sub>, ... α<sub>n</sub>) is of type t.
> 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 (φ `<->` ψ).
......@@ -262,7 +262,7 @@ False
**轮到你来:**模仿[1.2](./ch10.html#fig-model-kids)绘制一个图,描述域`m`和相应的每个一元谓词的集合。
你可能已经注意到,我们的一元谓词(即`boy``girl``dog`)也是以单个元组的集合而不是个体的集合出现的。这使我们能够方便的统一处理任何元数的关系。一个形式为 P(τ<sub>1</sub>, ... τ<sub>n</sub>)的谓词,其中 P 是 n 元的,为真的条件是对应于(τ<sub>1</sub>, ... τ<sub>n</sub>) 的值的元组属于 P 的值的元组的集合。
你可能已经注意到,我们的一元谓词(即`boy``girl``dog`)也是以单个元组的集合而不是个体的集合出现的。这使我们能够方便的统一处理任何元数的关系。一个形式为 P(τ[1], ... τ<sub>n</sub>)的谓词,其中 P 是 n 元的,为真的条件是对应于(τ[1], ... τ<sub>n</sub>) 的值的元组属于 P 的值的元组的集合。
```py
>>> ('o', 'c') in val['see']
......@@ -740,7 +740,7 @@ Det[num=sg,SEM=<\P Q. exists x.(P(x) & Q(x))>] -> 'a'
我们解释一句话时会使用丰富的上下文知识,一部分取决于前面的内容,一部分取决于我们的背景假设。DRT 提供了一个句子的含义如何集成到前面段落表示中的理论,但是在前面的讨论中明显缺少这两个部分。首先,一直没有尝试纳入任何一种推理;第二,我们只处理了个别句子。这些遗漏由模块`nltk.inference.discourse`纠正。
段落是一个句子的序列 s&lt;sub&gt;1&lt;/sub&gt;, ... s&lt;sub&gt;n&lt;/sub&gt;,段落线是读法的序列 s&lt;sub&gt;1&lt;/sub&gt;-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&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; ,每个序列对应段落中的一个句子。该模块按增量处理句子,当有歧义时保持追踪所有可能的线。为简单起见,下面的例子中忽略了范围歧义。
```py
>>> dt = nltk.DiscourseTester(['A student dances', 'Every student is a person'])
......@@ -839,7 +839,7 @@ d1: ['s0-r1', 's1-r0'] : ([z12,z15],[boy(z12), (([x],[dog(x)]) ->
* 量词的解释是对于具有变量 x 的公式φ[x],构建个体的集合,赋值 *g* 分配它们作为 x 的值使φ[x]为真。然后量词对这个集合加以约束。
* 一个封闭的表达式是一个没有自由变量的表达式;也就是,变量都被绑定。一个封闭的表达式是真是假取决于所有变量赋值。
* 如果两个公式只是由绑定操作符(即λ或量词)绑定的变量的标签不同,那么它们是α-等价。重新标记公式中的绑定变量的结果被称为α-转换。
* 给定有两个嵌套量词 *Q*&lt;sub&gt;1&lt;/sub&gt;*Q*&lt;sub&gt;2&lt;/sub&gt;的公式,最外层的量词 *Q*&lt;sub&gt;1&lt;/sub&gt;有较广的范围(或范围超出 *Q*&lt;sub&gt;2&lt;/sub&gt;)。英语句子往往由于它们包含的量词的范围而产生歧义。
* 给定有两个嵌套量词 *Q*[1]和 *Q*[2]的公式,最外层的量词 *Q*[1]有较广的范围(或范围超出 *Q*[2])。英语句子往往由于它们包含的量词的范围而产生歧义。
* 在基于特征的语法中英语句子可以通过将`sem`作为特征与语义表达关联。一个复杂的表达式的`sem`值通常包括成分表达式的`sem`值的函数应用。
## 7 深入阅读
......
......@@ -102,9 +102,9 @@ Kappa 系数 K 测量两个人判断类别和修正预期的期望一致性的
![Images/windowdiff.png](Images/58a1097522dc6fbe24eddd96cfd6cbc9.jpg)
图 2.1:一个序列的三种分割:小矩形代表字、词、句,总之,任何可能被分为语言单位的序列;S&lt;sub&gt;1&lt;/sub&gt;和 S&lt;sub&gt;2&lt;/sub&gt;是接近一致的,两者都与 S&lt;sub&gt;3&lt;/sub&gt;显著不同。
图 2.1:一个序列的三种分割:小矩形代表字、词、句,总之,任何可能被分为语言单位的序列;S[1]和 S[2]是接近一致的,两者都与 S[3]显著不同。
我们还可以测量语言输入的两个独立分割的一致性,例如分词、句子分割、命名实体识别。在[2.1](./ch11.html#fig-windowdiff)中,我们看到三种可能的由标注者(或程序)产生的项目序列的分割。虽然没有一个完全一致,S&lt;sub&gt;1&lt;/sub&gt;和 S&lt;sub&gt;2&lt;/sub&gt;是接近一致的,我们想要一个合适的测量。Windowdiff 是评估两个分割一致性的一个简单的算法,通过在数据上移动一个滑动窗口计算近似差错的部分得分。如果我们将词符预处理成 0 和 1 的序列,当词符后面跟着边界符号时记录下来,我们就可以用字符串表示分割,应用 windowdiff 打分器。
我们还可以测量语言输入的两个独立分割的一致性,例如分词、句子分割、命名实体识别。在[2.1](./ch11.html#fig-windowdiff)中,我们看到三种可能的由标注者(或程序)产生的项目序列的分割。虽然没有一个完全一致,S[1]和 S[2]是接近一致的,我们想要一个合适的测量。Windowdiff 是评估两个分割一致性的一个简单的算法,通过在数据上移动一个滑动窗口计算近似差错的部分得分。如果我们将词符预处理成 0 和 1 的序列,当词符后面跟着边界符号时记录下来,我们就可以用字符串表示分割,应用 windowdiff 打分器。
```py
>>> s1 = "00000010000000001000000"
......@@ -150,7 +150,7 @@ Kappa 系数 K 测量两个人判断类别和修正预期的期望一致性的
最简单的方法是获得出版的网页文本的文集。Web 语料库 ACL 特别兴趣组(SIGWAC)在`http://www.sigwac.org.uk/`维护一个资源列表。使用定义好的 Web 语料库的优点是它们有文档、稳定并允许重复性实验。
如果所需的内容在一个特定的网站,有许多实用程序能捕获网站的所有可访问内容,如 _GNU Wget_ `http://www.gnu.org/software/wget/`。For maximal flexibility and control, a web crawler can be used, such as *Heritrix* `http://crawler.archive.org/`. 为了最大的灵活性和可控制,可以使用网络爬虫如[(Croft, Metzler, & Strohman, 2009)](./bibliography.html#croft2009)。例如:如果我们要编译双语文本集合,对应两种语言的文档对,爬虫需要检测站点的结构以提取文件之间的对应关系,它需要按照捕获的对应方式组织下载的页面。写你自己的网页爬虫可能使很有诱惑力的,但也有很多陷阱需要克服,如检测 MIME 类型、转换相对地址为绝对 URL、避免被困在循环链接结构、处理网络延迟、避免使站点超载或被禁止访问该网站等。
如果所需的内容在一个特定的网站,有许多实用程序能捕获网站的所有可访问内容,如 *GNU Wget* `http://www.gnu.org/software/wget/`。For maximal flexibility and control, a web crawler can be used, such as *Heritrix* `http://crawler.archive.org/`. 为了最大的灵活性和可控制,可以使用网络爬虫如[(Croft, Metzler, & Strohman, 2009)](./bibliography.html#croft2009)。例如:如果我们要编译双语文本集合,对应两种语言的文档对,爬虫需要检测站点的结构以提取文件之间的对应关系,它需要按照捕获的对应方式组织下载的页面。写你自己的网页爬虫可能使很有诱惑力的,但也有很多陷阱需要克服,如检测 MIME 类型、转换相对地址为绝对 URL、避免被困在循环链接结构、处理网络延迟、避免使站点超载或被禁止访问该网站等。
## 3.2 从字处理器文件获取数据
......@@ -198,7 +198,7 @@ f_out.write(bytes(s, 'UTF-8'))
注意
更多 HTML 复杂的处理可以使用`http://www.crummy.com/software/BeautifulSoup/`上的 _Beautiful Soup_ 的包。
更多 HTML 复杂的处理可以使用`http://www.crummy.com/software/BeautifulSoup/`上的 *BeautifulSoup* 的包。
## 3.3 从电子表格和数据库中获取数据
......@@ -206,7 +206,7 @@ f_out.write(bytes(s, 'UTF-8'))
有时词典存储在一个完全成熟的关系数据库。经过适当的标准化,这些数据库可以确保数据的有效性。例如,我们可以要求所有词性都来自指定的词汇,通过声明词性字段为*枚举类型*或用一个外键引用一个单独的词性表。然而,关系模型需要提前定义好的数据(模式)结构,这与高度探索性的构造语言数据的主导方法相违背。被认为是强制性的和独特的字段往往需要是可选的、可重复。只有当数据类型提前全都知道时关系数据库才是适用的,如果不是,或者几乎所有的属性都是可选的或重复的,关系的做法就行不通了。
然而,当我们的目标只是简单的从数据库中提取内容时,完全可以将表格(或 SQL 查询结果)转换成 CSV 格式,并加载到我们的程序中。我们的程序可能会执行不太容易用 SQL 表示的语言学目的的查询,如 _select all words that appear in example sentences for which no dictionary entry is provided_。对于这个任务,我们需要从记录中提取足够的信息,使它连同词条和例句能被唯一的识别。让我们假设现在这个信息是在一个 CSV 文件`dict.csv`中:
然而,当我们的目标只是简单的从数据库中提取内容时,完全可以将表格(或 SQL 查询结果)转换成 CSV 格式,并加载到我们的程序中。我们的程序可能会执行不太容易用 SQL 表示的语言学目的的查询,如 *select all words that appear in example sentences for which no dictionary entry is provided*。对于这个任务,我们需要从记录中提取足够的信息,使它连同词条和例句能被唯一的识别。让我们假设现在这个信息是在一个 CSV 文件`dict.csv`中:
```py
"sleep","sli:p","v.i","a condition of body and mind ..."
......
......@@ -7,7 +7,7 @@
```
(1)
a. Overhead the day drives level and grey, hiding the sun by a flight of grey spears. (William Faulkner, _As I Lay Dying_, 1935)
a. Overhead the day drives level and grey, hiding the sun by a flight of grey spears. (William Faulkner, *As I Lay Dying*, 1935)
b. When using the toaster please ensure that the exhaust fan is turned on. (sign in dormitory kitchen)
......@@ -36,7 +36,7 @@ g. There are two ways to do this, AFAIK :smile: (internet discussion archive)
另一个密切相关的发展是组合原理,即一个复杂表达式的意思由它的各个部分的意思和它们的组合模式组成([10.](./ch10.html#chap-semantics))。这一原理提供了句法和语义之间的有用的对应,即一个复杂的表达式的含义可以递归的计算。考虑句子 It is not true that p,其中 p 是一个命题。我们可以表示这个句子的意思为 not(p)。同样,我们可以表示 John saw Mary 的意思为 saw(j, m)。现在,我们可以使用上述信息递归地计算 It is not true that John saw Mary 的表示,得到 not(saw(j,m))。
刚刚简要介绍的方法都有一个前提,自然语言计算关键依赖于操纵符号表示的规则。NLP 发展的一个特定时期,特别是 1980 年代,这个前提为语言学家和 NLP 从业人员提供了一个共同的起点,导致一种被称为基于归一(基于特征)语法的形式化语法家族(参见[9.](./ch09.html#chap-featgram)),也导致了在 Prolog 编程语言上实现 NLP 应用。虽然基于语法的自然语言处理仍然是一个研究的重要领域,由于多种因素在过去的 15-20 年它已经有些黯然失色。一个显著的影响因素来自于自动语音识别。虽然早期的语音处理采用一个模拟一类基于规则的音韵处理的模型,典型的如 _Sound Pattern of English_ [(Chomsky & Halle, 1968)](./bibliography.html#chomskyhalle68),结果远远不能够解决实时的识别实际的讲话这样困难的问题。相比之下,包含从大量语音数据中学习的模式的系统明显更准确、高效和稳健的。此外,言语社区发现建立对常见的测试数据的性能的定量测量的共享资源对建立更好的系统的过程有巨大帮助。最终,大部分的 NLP 社区拥抱面向数据密集型的语言处理,配合机器学习技术和评价为主导的方法的越来越多地使用。
刚刚简要介绍的方法都有一个前提,自然语言计算关键依赖于操纵符号表示的规则。NLP 发展的一个特定时期,特别是 1980 年代,这个前提为语言学家和 NLP 从业人员提供了一个共同的起点,导致一种被称为基于归一(基于特征)语法的形式化语法家族(参见[9.](./ch09.html#chap-featgram)),也导致了在 Prolog 编程语言上实现 NLP 应用。虽然基于语法的自然语言处理仍然是一个研究的重要领域,由于多种因素在过去的 15-20 年它已经有些黯然失色。一个显著的影响因素来自于自动语音识别。虽然早期的语音处理采用一个模拟一类基于规则的音韵处理的模型,典型的如 *Sound Pattern of English* [(Chomsky & Halle, 1968)](./bibliography.html#chomskyhalle68),结果远远不能够解决实时的识别实际的讲话这样困难的问题。相比之下,包含从大量语音数据中学习的模式的系统明显更准确、高效和稳健的。此外,言语社区发现建立对常见的测试数据的性能的定量测量的共享资源对建立更好的系统的过程有巨大帮助。最终,大部分的 NLP 社区拥抱面向数据密集型的语言处理,配合机器学习技术和评价为主导的方法的越来越多地使用。
## 当代哲学划分
......@@ -69,7 +69,7 @@ g. There are two ways to do this, AFAIK :smile: (internet discussion archive)
这本书涵盖了自然语言处理领域的许多主题。大多数的例子都使用 Python 和英语。不过,如果读者得出的结论是 NLP 是有关如何编写 Python 程序操纵英文文本,或者更广泛的,关于如何编写程序(以任何一种编程语言)处理(任何一种自然语言)文本的,这将是不幸的。我们选择 Python 和英语是权宜之计,仅此而已。即使我们关注编程本身也只是一种解决问题的手段:作为一种了解表示和操纵语言标注文本的集合的数据结构和算法的方式,作为一种方法来建立新的语言技术,更好地服务于信息社会的需求,并最终作为对人类语言极度丰富性的更深的理解的方法。
_ 但是目前为止,happy hacking!_
*但是目前为止,happy hacking!*
关于本文档...
......
......@@ -453,6 +453,6 @@
About this document...
UPDATED FOR NLTK 3.0. This is a chapter from *Natural Language Processing with Python*, by [Steven Bird](http://estive.net/), [Ewan Klein](http://homepages.inf.ed.ac.uk/ewan/) and [Edward Loper](http://ed.loper.org/), Copyright © 2014 the authors. It is distributed with the _Natural Language Toolkit_ [`http://nltk.org/`], Version 3.0, under the terms of the *Creative Commons Attribution-Noncommercial-No Derivative Works 3\.0 United States License* [[http://creativecommons.org/licenses/by-nc-nd/3.0/us/](http://creativecommons.org/licenses/by-nc-nd/3.0/us/)].
UPDATED FOR NLTK 3.0. This is a chapter from *Natural Language Processing with Python*, by [Steven Bird](http://estive.net/), [Ewan Klein](http://homepages.inf.ed.ac.uk/ewan/) and [Edward Loper](http://ed.loper.org/), Copyright © 2014 the authors. It is distributed with the *Natural Language Toolkit* [`http://nltk.org/`], Version 3.0, under the terms of the *Creative Commons Attribution-Noncommercial-No Derivative Works 3\.0 United States License* [[http://creativecommons.org/licenses/by-nc-nd/3.0/us/](http://creativecommons.org/licenses/by-nc-nd/3.0/us/)].
This document was built on Wed 1 Jul 2015 12:30:05 AEST
\ No newline at end of file
......@@ -1209,7 +1209,7 @@ WordNet 原始描述是[(Fellbaum, 1998)](./bibliography.html#fellbaum1998)。
7. ☼ 根据 Strunk 和 White 的《Elements of Style》,词 however 在句子开头使用是“in whatever way”或“to whatever extent”的意思,而没有“nevertheless”的意思。他们给出了正确用法的例子:However you advise him, he will probably do as he thinks best.(`http://www.bartleby.com/141/strunk3.html`) 使用词汇索引工具在我们一直在思考的各种文本中研究这个词的实际用法。也可以看 *LanguageLog* 发布在`http://itre.cis.upenn.edu/~myl/languagelog/archives/001913.html`上的“Fossilized prejudices abou‘t however’”。
8. ◑ 在名字语料库上定义一个条件频率分布,显示哪个*首*字母在男性名字中比在女性名字中更常用(参见[4.4](./ch02.html#fig-cfd-gender))。
9. ◑ 挑选两个文本,研究它们之间在词汇、词汇丰富性、文体等方面的差异。你能找出几个在这两个文本中词意相当不同的词吗,例如在《白鲸记》与《理智与情感》中的 monstrous?
10. ◑ 阅读 BBC 新闻文章:_UK's Vicky Pollards 'left behind'_ `http://news.bbc.co.uk/1/hi/education/6173441.stm`。文章给出了有关青少年语言的以下统计:“使用最多的 20 个词,包括 yeah, no, but 和 like,占所有词的大约三分之一”。对于大量文本源来说,所有词标识符的三分之一有多少词类型?你从这个统计中得出什么结论?更多相关信息请阅读`http://itre.cis.upenn.edu/~myl/languagelog/archives/003993.html`上的 *LanguageLog*
10. ◑ 阅读 BBC 新闻文章:*UK's Vicky Pollards 'left behind'* `http://news.bbc.co.uk/1/hi/education/6173441.stm`。文章给出了有关青少年语言的以下统计:“使用最多的 20 个词,包括 yeah, no, but 和 like,占所有词的大约三分之一”。对于大量文本源来说,所有词标识符的三分之一有多少词类型?你从这个统计中得出什么结论?更多相关信息请阅读`http://itre.cis.upenn.edu/~myl/languagelog/archives/003993.html`上的 *LanguageLog*
11. ◑ 调查模式分布表,寻找其他模式。试着用你自己对不同文体的印象理解来解释它们。你能找到其他封闭的词汇归类,展现不同文体的显著差异吗?
12. ◑ CMU 发音词典包含某些词的多个发音。它包含多少种不同的词?具有多个可能的发音的词在这个词典中的比例是多少?
13. ◑ 没有下位词的名词同义词集所占的百分比是多少?你可以使用`wn.all_synsets('n')`得到所有名词同义词集。
......@@ -1222,7 +1222,7 @@ WordNet 原始描述是[(Fellbaum, 1998)](./bibliography.html#fellbaum1998)。
20. ◑ 写一个函数`word_freq()`,用一个词和布朗语料库中的一个部分的名字作为参数,计算这部分语料中词的频率。
21. ◑ 写一个程序,估算一个文本中的音节数,利用 CMU 发音词典。
22. ◑ 定义一个函数`hedge(text)`,处理一个文本和产生一个新的版本在每三个词之间插入一个词`'like'`
23.**齐夫定律**_f(w)_ 是一个自由文本中的词 *w* 的频率。假设一个文本中的所有词都按照它们的频率排名,频率最高的在最前面。齐夫定律指出一个词类型的频率与它的排名成反比(即 *f* × _r = k_*k* 是某个常数)。例如:最常见的第 50 个词类型出现的频率应该是最常见的第 150 个词型出现频率的 3 倍。
23.**齐夫定律***f(w)* 是一个自由文本中的词 *w* 的频率。假设一个文本中的所有词都按照它们的频率排名,频率最高的在最前面。齐夫定律指出一个词类型的频率与它的排名成反比(即 *f* × *r = k**k* 是某个常数)。例如:最常见的第 50 个词类型出现的频率应该是最常见的第 150 个词型出现频率的 3 倍。
1. 写一个函数来处理一个大文本,使用`pylab.plot`画出相对于词的排名的词的频率。你认可齐夫定律吗?(提示:使用对数刻度会有帮助。)所绘的线的极端情况是怎样的?
2. 随机生成文本,如使用`random.choice("abcdefg ")`,注意要包括空格字符。你需要事先`import random`。使用字符串连接操作将字符累积成一个很长的字符串。然后为这个字符串分词,产生前面的齐夫图,比较这两个图。此时你怎么看齐夫定律?
24. ★ 修改例[2.2](./ch02.html#code-random-text)的文本生成程序,进一步完成下列任务:
......
......@@ -99,7 +99,7 @@ Project Gutenberg; Dmitri Prokofitch; Andrey Semyonovitch; Hay Market
### 处理 HTML
网络上的文本大部分是 HTML 文件的形式。你可以使用网络浏览器将网页作为文本保存为本地文件,然后按照下面关于文件的小节描述的那样来访问它。不过,如果你要经常这样做,最简单的办法是直接让 Python 来做这份工作。第一步是像以前一样使用`urlopen`。为了好玩,我们将挑选一个被称为 _Blondes to die out in 200 years_ 的 BBC 新闻故事,一个都市传奇被 BBC 作为确立的科学事实流传下来:
网络上的文本大部分是 HTML 文件的形式。你可以使用网络浏览器将网页作为文本保存为本地文件,然后按照下面关于文件的小节描述的那样来访问它。不过,如果你要经常这样做,最简单的办法是直接让 Python 来做这份工作。第一步是像以前一样使用`urlopen`。为了好玩,我们将挑选一个被称为 *Blondes to die out in 200 years* 的 BBC 新闻故事,一个都市传奇被 BBC 作为确立的科学事实流传下来:
```py
>>> url = "http://news.bbc.co.uk/2/hi/health/2284783.stm"
......@@ -176,7 +176,7 @@ des would disappear is if having the gene was a disadvantage and I do not thin
注意
**轮到你来:** 使用文本编辑器创建一个名为`document.txt`的文件,然后输入几行文字,保存为纯文本。如果你使用 IDLE,在 *File* 菜单中选择 _New Window_ 命令,在新窗口中输入所需的文本,然后在 IDLE 提供的弹出式对话框中的文件夹内保存文件为`document.txt`。然后在 Python 解释器中使用`f = open('document.txt')`打开这个文件,并使用`print(f.read())`检查其内容。
**轮到你来:** 使用文本编辑器创建一个名为`document.txt`的文件,然后输入几行文字,保存为纯文本。如果你使用 IDLE,在 *File* 菜单中选择 *New Window* 命令,在新窗口中输入所需的文本,然后在 IDLE 提供的弹出式对话框中的文件夹内保存文件为`document.txt`。然后在 Python 解释器中使用`f = open('document.txt')`打开这个文件,并使用`print(f.read())`检查其内容。
当你尝试这样做时可能会出各种各样的错误。如果解释器无法找到你的文件,你会看到类似这样的错误:
......@@ -691,7 +691,7 @@ NLTK 分词器允许 Unicode 字符串作为输入,并输出相应地 Unicode
### 在 Python 中使用本地编码
如果你习惯了使用特定的本地编码字符,你可能希望能够在一个 Python 文件中使用你的字符串输入及编辑的标准方法。为了做到这一点,你需要在你的文件的第一行或第二行中包含字符串:`'# -*- coding: &lt;coding&gt; -*-'`。请注意 _&lt;coding&gt;_ 必须是像`'latin-1'`, `'big5'``'utf-8'`这样的字符串 (见 [3.4](./ch03.html#fig-polish-utf8))。
如果你习惯了使用特定的本地编码字符,你可能希望能够在一个 Python 文件中使用你的字符串输入及编辑的标准方法。为了做到这一点,你需要在你的文件的第一行或第二行中包含字符串:`'# -*- coding: &lt;coding&gt; -*-'`。请注意 *&lt;coding&gt;* 必须是像`'latin-1'`, `'big5'``'utf-8'`这样的字符串 (见 [3.4](./ch03.html#fig-polish-utf8))。
![Images/polish-utf8.png](Images/5eeb4cf55b6d18d4bcb098fc72ddc6d7.jpg)
......@@ -1585,14 +1585,14 @@ After (5), all (3), is (2), said (4), and (3), done (4), , (1), more
更多的使用 NLTK 处理词汇的例子请参阅`http://nltk.org/howto`上的分词、词干提取以及语料库 HOWTO 文档。[(Jurafsky & Martin, 2008)](./bibliography.html#jurafskymartin2008)的第 2、3 章包含正则表达式和形态学的更高级的材料。Python 文本处理更广泛的讨论请参阅[(Mertz, 2003)](./bibliography.html#mertz2003tpp)。规范非标准词的信息请参阅[(Sproat et al, 2001)](./bibliography.html#sproat2001nor)
关于正则表达式的参考材料很多,无论是理论的还是实践的。在 Python 中使用正则表达式的一个入门教程,请参阅 Kuchling 的 _Regular Expression HOWTO_`http://www.amk.ca/python/howto/regex/`。关于使用正则表达式的全面而详细的手册,请参阅[(Friedl, 2002)](./bibliography.html#friedl2002mre),其中涵盖包括 Python 在内大多数主要编程语言的语法。其他材料还包括[(Jurafsky & Martin, 2008)](./bibliography.html#jurafskymartin2008)的第 2.1 节,[(Mertz, 2003)](./bibliography.html#mertz2003tpp)的第 3 章。
关于正则表达式的参考材料很多,无论是理论的还是实践的。在 Python 中使用正则表达式的一个入门教程,请参阅 Kuchling 的 *Regular Expression HOWTO*`http://www.amk.ca/python/howto/regex/`。关于使用正则表达式的全面而详细的手册,请参阅[(Friedl, 2002)](./bibliography.html#friedl2002mre),其中涵盖包括 Python 在内大多数主要编程语言的语法。其他材料还包括[(Jurafsky & Martin, 2008)](./bibliography.html#jurafskymartin2008)的第 2.1 节,[(Mertz, 2003)](./bibliography.html#mertz2003tpp)的第 3 章。
网上有许多关于 Unicode 的资源。以下是与处理 Unicode 的 Python 的工具有关的有益的讨论:
* Ned Batchelder, _Pragmatic Unicode_, `http://nedbatchelder.com/text/unipain.html`
* _Unicode HOWTO_, Python Documentation, `http://docs.python.org/3/howto/unicode.html`
* Ned Batchelder, *Pragmatic Unicode*, `http://nedbatchelder.com/text/unipain.html`
* *Unicode HOWTO*, Python Documentation, `http://docs.python.org/3/howto/unicode.html`
* David Beazley, Mastering Python 3 I/O, `http://pyvideo.org/video/289/pycon-2010--mastering-python-3-i-o`
* Joel Spolsky, _The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)_, `http://www.joelonsoftware.com/articles/Unicode.html`
* Joel Spolsky, *The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)*, `http://www.joelonsoftware.com/articles/Unicode.html`
SIGHAN,ACL 中文语言处理特别兴趣小组`http://sighan.org/`,重点关注中文文本分词的问题。我们分割英文文本的方法依据[(Brent, 1995)](./bibliography.html#brent1995);这项工作属于语言获取领域[(Niyogi, 2006)](./bibliography.html#niyogi2006)
......@@ -1682,7 +1682,7 @@ SIGHAN,ACL 中文语言处理特别兴趣小组`http://sighan.org/`,重点
24. ◑ 尝试编写代码将文本转换成 *hAck3r*,使用正则表达式和替换,其中`e``3`, `i``1`, `o``0`, `l``|`, `s``5`, `.``5w33t!`, `ate``8`。在转换之前将文本规范化为小写。自己添加更多的替换。现在尝试将`s`映射到两个不同的值:词开头的`s`映射为`
25. ◑ _Pig Latin_ 是英语文本的一个简单的变换。文本中每个词的按如下方式变换:将出现在词首的所有辅音(或辅音群)移到词尾,然后添加 ay,例如 string → ingstray, idle → idleay。`http://en.wikipedia.org/wiki/Pig_Latin`
25. ◑ *Pig Latin* 是英语文本的一个简单的变换。文本中每个词的按如下方式变换:将出现在词首的所有辅音(或辅音群)移到词尾,然后添加 ay,例如 string → ingstray, idle → idleay。`http://en.wikipedia.org/wiki/Pig_Latin`
1. 写一个函数转换一个词为 Pig Latin。
2. 写代码转换文本而不是单个的词。
......@@ -1718,7 +1718,7 @@ SIGHAN,ACL 中文语言处理特别兴趣小组`http://sighan.org/`,重点
37. ◑ 使用`help(re.sub)`和参照本章的深入阅读,阅读有关`re.sub()`函数来使用正则表达式进行字符串替换。使用`re.sub`编写代码从一个 HTML 文件中删除 HTML 标记,规范化空格。
38. ★ 分词的一个有趣的挑战是已经被分割的跨行的词。例如如果 _long-term_ 被分割,我们就得到字符串`long-\nterm`。
38. ★ 分词的一个有趣的挑战是已经被分割的跨行的词。例如如果 *long-term* 被分割,我们就得到字符串`long-\nterm`。
1. 写一个正则表达式,识别连字符连结的跨行处的词汇。这个表达式将需要包含`\n`字符。
2. 使用`re.sub()`从这些词中删除`\n`字符。
......
......@@ -1061,7 +1061,7 @@ result = ['cat']
解决算法问题的一个重要部分是为手头的问题选择或改造一个合适的算法。有时会有几种选择,能否选择最好的一个取决于对每个选择随数据增长如何执行的知识。关于这个话题的书很多,我们只介绍一些关键概念和精心描述在自然语言处理中最普遍的做法。
最有名的策略被称为分而治之。我们解决一个大小为 *n* 的问题通过将其分成两个大小为 _n/2_ 的问题,解决这些问题,组合它们的结果成为原问题的结果。例如,假设我们有一堆卡片,每张卡片上写了一个词。我们可以排序这一堆卡片,通过将它分成两半分别给另外两个人来排序(他们又可以做同样的事情)。然后,得到两个排好序的卡片堆,将它们并成一个单一的排序堆就是一项容易的任务了。参见[4.8](./ch04.html#fig-mergesort)这个过程的说明。
最有名的策略被称为分而治之。我们解决一个大小为 *n* 的问题通过将其分成两个大小为 *n/2* 的问题,解决这些问题,组合它们的结果成为原问题的结果。例如,假设我们有一堆卡片,每张卡片上写了一个词。我们可以排序这一堆卡片,通过将它分成两半分别给另外两个人来排序(他们又可以做同样的事情)。然后,得到两个排好序的卡片堆,将它们并成一个单一的排序堆就是一项容易的任务了。参见[4.8](./ch04.html#fig-mergesort)这个过程的说明。
![Images/mergesort.png](Images/1094084b61ac3f0e4416e92869c52ccd.jpg)
......@@ -1209,7 +1209,7 @@ def preprocess(tagged_corpus):
动态规划是一种自然语言处理中被广泛使用的算法设计的一般方法。“programming”一词的用法与你可能想到的感觉不同,是规划或调度的意思。动态规划用于解决包含多个重叠的子问题的问题。不是反复计算这些子问题,而是简单的将它们的计算结果存储在一个查找表中。在本节的余下部分,我们将介绍动态规划,在一个相当不同的背景下来句法分析。
Pingala 是大约生活在公元前 5 世纪的印度作家,作品有被称为《Chandas Shastra》的梵文韵律专著。Virahanka 大约在公元 6 世纪延续了这项工作,研究短音节和长音节组合产生一个长度为 *n* 的旋律的组合数。短音节,标记为 *S*,占一个长度单位,而长音节,标记为 *L*,占 2 个长度单位。例如,Pingala 发现,有 5 种方式构造一个长度为 4 的旋律:_V_&lt;sub&gt;4&lt;/sub&gt; = _{LL, SSL, SLS, LSS, SSSS}_。请看,我们可以将 *V*&lt;sub&gt;4&lt;/sub&gt;分成两个子集,以 *L* 开始的子集和以 *S* 开始的子集,如[(1)](./ch04.html#ex-v4)所示。
Pingala 是大约生活在公元前 5 世纪的印度作家,作品有被称为《Chandas Shastra》的梵文韵律专著。Virahanka 大约在公元 6 世纪延续了这项工作,研究短音节和长音节组合产生一个长度为 *n* 的旋律的组合数。短音节,标记为 *S*,占一个长度单位,而长音节,标记为 *L*,占 2 个长度单位。例如,Pingala 发现,有 5 种方式构造一个长度为 4 的旋律:*V[4] = {LL, SSL, SLS, LSS, SSSS}*。请看,我们可以将 *V*[4]分成两个子集,以 *L* 开始的子集和以 *S* 开始的子集,如[(1)](./ch04.html#ex-v4)所示。
```py
V4 =
......@@ -1220,7 +1220,7 @@ V4 =
```
有了这个观察结果,我们可以写一个小的递归函数称为`virahanka1()`来计算这些旋律,如[4.12](./ch04.html#code-virahanka)所示。请注意,要计算 *V*&lt;sub&gt;4&lt;/sub&gt;,我们先要计算 *V*&lt;sub&gt;3&lt;/sub&gt;*V*&lt;sub&gt;2&lt;/sub&gt;。但要计算 *V*&lt;sub&gt;3&lt;/sub&gt;,我们先要计算 *V*&lt;sub&gt;2&lt;/sub&gt;*V*&lt;sub&gt;1&lt;/sub&gt;。在[(2)](./ch04.html#ex-call-structure)中描述了这种调用结构。
有了这个观察结果,我们可以写一个小的递归函数称为`virahanka1()`来计算这些旋律,如[4.12](./ch04.html#code-virahanka)所示。请注意,要计算 *V*[4],我们先要计算 *V*[3]和 *V*[2]。但要计算 *V*[3],我们先要计算 *V*[2]和 *V*[1]。在[(2)](./ch04.html#ex-call-structure)中描述了这种调用结构。
```py
from numpy import arange
......@@ -1448,7 +1448,7 @@ Python 网站提供大量文档。理解内置的函数和标准类型是很重
25. ◑ 阅读有关字符串编辑距离和 Levenshtein 算法的内容。尝试`nltk.edit_distance()`提供的实现。这用的是动态规划的何种方式?它使用的是自下而上还是自上而下的方法?[另见`http://norvig.com/spell-correct.html`]
26. ◑ Catalan 数出现在组合数学的许多应用中,包括解析树的计数([6](./ch08.html#sec-grammar-development))。该级数可以定义如下:C&lt;sub&gt;0&lt;/sub&gt; = 1, and C&lt;sub&gt;n+1&lt;/sub&gt; = Σ&lt;sub&gt;0..n&lt;/sub&gt; (C&lt;sub&gt;i&lt;/sub&gt;C&lt;sub&gt;n-i&lt;/sub&gt;)。
26. ◑ Catalan 数出现在组合数学的许多应用中,包括解析树的计数([6](./ch08.html#sec-grammar-development))。该级数可以定义如下:C[0] = 1, and C&lt;sub&gt;n+1&lt;/sub&gt; = Σ&lt;sub&gt;0..n&lt;/sub&gt; (C&lt;sub&gt;i&lt;/sub&gt;C&lt;sub&gt;n-i&lt;/sub&gt;)。
1. 编写一个递归函数计算第 n 个 Catalan 数 C&lt;sub&gt;n&lt;/sub&gt;。
2. 现在写另一个函数使用动态规划做这个计算。
......@@ -1469,10 +1469,10 @@ Python 网站提供大量文档。理解内置的函数和标准类型是很重
## Docutils System Messages
System Message: ERROR/3 (`ch04.rst2`, line 1791); _[backlink](./ch04.html#id10)_
System Message: ERROR/3 (`ch04.rst2`, line 1791); [*backlink*](./ch04.html#id10)
Unknown target name: "first-run".
System Message: ERROR/3 (`ch04.rst2`, line 1791); _[backlink](./ch04.html#id12)_
System Message: ERROR/3 (`ch04.rst2`, line 1791); [*backlink*](./ch04.html#id12)
Unknown target name: "second-run".
\ No newline at end of file
......@@ -42,7 +42,7 @@ NLTK 为每个标记提供了文档,可以使用该标记来查询,如`nltk.
**轮到你来:** 很多单词,如 ski 和 race,可以用作名词或动词而发音没有区别。你能想出其他的吗?提示:想想一个常见的东西,尝试把词 to 放到它前面,看它是否也是一个动词;或者想想一个动作,尝试把 the 放在它前面,看它是否也是一个名词。现在用这个词的两种用途造句,在这句话上运行词性标注器。
词汇类别如“名词”和词性标记如`NN`,看上去似乎有其用途,但在细节上将使许多读者感到晦涩。你可能想知道要引进这种额外的信息的理由是什么。很多这些类别源于对文本中单词分布的粗略分析。考虑下面的分析,涉及 woman(名词),bought(动词),over(介词)和 the(限定词)。`text.similar()`方法接收一个单词 w,找出所有上下文 w&lt;sub&gt;1&lt;/sub&gt;w w&lt;sub&gt;2&lt;/sub&gt;,然后找出所有出现在相同上下文中的词 w',即 w&lt;sub&gt;1&lt;/sub&gt;w'w&lt;sub&gt;2&lt;/sub&gt;
词汇类别如“名词”和词性标记如`NN`,看上去似乎有其用途,但在细节上将使许多读者感到晦涩。你可能想知道要引进这种额外的信息的理由是什么。很多这些类别源于对文本中单词分布的粗略分析。考虑下面的分析,涉及 woman(名词),bought(动词),over(介词)和 the(限定词)。`text.similar()`方法接收一个单词 w,找出所有上下文 w[1]w w[2],然后找出所有出现在相同上下文中的词 w',即 w[1]w'w[2]
```py
>>> text = nltk.Text(word.lower() for word in nltk.corpus.brown.words())
......@@ -263,7 +263,7 @@ NLTK 中还有其他几种语言的已标注语料库,包括中文,印地语
注意
**轮到你来:**如果你对这些词性中的一些不确定,使用`nltk.app.concordance()`学习它们,或看 _Schoolhouse Rock!_ 语法视频于 YouTube,或者查询本章结束的进一步阅读一节。
**轮到你来:**如果你对这些词性中的一些不确定,使用`nltk.app.concordance()`学习它们,或看 *Schoolhouse Rock!* 语法视频于 YouTube,或者查询本章结束的进一步阅读一节。
## 2.7 未简化的标记
......@@ -624,7 +624,11 @@ TypeError: list objects are unhashable
[3.3](./ch05.html#code-dictionary)的开头还有第二个有用的习惯用法,那里我们初始化一个`defaultdict`,然后使用`for`循环来更新其值。下面是一个示意版本:
`>>> my_dictionary = defaultdict(`_function to create default value_`)``>>> for` *item* `in` *sequence*`:``... my_dictionary[`_item_key_`]` _is updated with information about item_
```py
>>> my_dictionary = defaultdict(_function to create default value_)
>>> for item in sequence:
... # my_dictionary[item_key] is updated with information about item
```
下面是这种模式的另一个示例,我们按它们最后两个字母索引词汇:
......
......@@ -797,6 +797,6 @@ d. in Macbeth *versus* on Letterman
## Docutils System Messages
System Message: ERROR/3 (`ch06.rst2`, line 1264); _[backlink](./ch06.html#id18)_
System Message: ERROR/3 (`ch06.rst2`, line 1264); [*backlink*](./ch06.html#id18)
Undefined substitution referenced: "ii".
\ No newline at end of file
......@@ -723,7 +723,7 @@ VAN('annie_lennox', 'eurythmics')
根据 Ross 和 Tukey 在 1975 年的论文[(Church, Young, & Bloothooft, 1996)](./bibliography.html#abney1996pst),单词词缝最初的意思是一个停用词序列。
IOB 格式(有时也称为 BIO 格式)由[(Ramshaw & Marcus, 1995)](./bibliography.html#ramshaw1995tcu)开发用来`NP`划分词块,并被由 _Conference on Natural Language Learning_ 在 1999 年用于`NP`加括号共享任务。CoNLL 2000 采用相同的格式标注了华尔街日报的文本作为一个`NP`词块划分共享任务的一部分。
IOB 格式(有时也称为 BIO 格式)由[(Ramshaw & Marcus, 1995)](./bibliography.html#ramshaw1995tcu)开发用来`NP`划分词块,并被由 *Conference on Natural Language Learning* 在 1999 年用于`NP`加括号共享任务。CoNLL 2000 采用相同的格式标注了华尔街日报的文本作为一个`NP`词块划分共享任务的一部分。
[(Jurafsky & Martin, 2008)](./bibliography.html#jurafskymartin2008)的 13.5 节包含有关词块划分的一个讨论。第 22 章讲述信息提取,包括命名实体识别。有关生物学和医学中的文本挖掘的信息,请参阅[(Ananiadou & McNaught, 2006)](./bibliography.html#ananiadou2006)。
......
......@@ -313,7 +313,7 @@ TV -> 'chased' | 'saw'
## 5.2 扩大规模
到目前为止,我们只考虑了“玩具语法”,演示分析的关键环节的少量的语法。但有一个明显的问题就是这种做法是否可以扩大到覆盖自然语言的大型语料库。手工构建这样的一套产生式有多么困难?一般情况下,答案是:_ 非常困难 _。即使我们允许自己使用各种形式化的工具,它们可以提供语法产生式更简洁的表示,保持对覆盖一种语言的主要成分所需要的众多产生式之间的复杂的相互作用的控制,仍然是极其困难的。换句话说,很难将语法模块化,每部分语法可以独立开发。反过来这意味着,在一个语言学家团队中分配编写语法的任务是很困难的。另一个困难是当语法扩展到包括更加广泛的成分时,适用于任何一个句子的分析的数量也相应增加。换句话说,歧义随着覆盖而增加。
到目前为止,我们只考虑了“玩具语法”,演示分析的关键环节的少量的语法。但有一个明显的问题就是这种做法是否可以扩大到覆盖自然语言的大型语料库。手工构建这样的一套产生式有多么困难?一般情况下,答案是:*非常困难*。即使我们允许自己使用各种形式化的工具,它们可以提供语法产生式更简洁的表示,保持对覆盖一种语言的主要成分所需要的众多产生式之间的复杂的相互作用的控制,仍然是极其困难的。换句话说,很难将语法模块化,每部分语法可以独立开发。反过来这意味着,在一个语言学家团队中分配编写语法的任务是很困难的。另一个困难是当语法扩展到包括更加广泛的成分时,适用于任何一个句子的分析的数量也相应增加。换句话说,歧义随着覆盖而增加。
尽管存在这些问题,一些大的合作项目在为几种语言开发基于规则的语法上已取得了积极的和令人印象深刻的结果。例如,词汇功能语法(LFG)Pargram 项目、中心词驱动短语结构文法(HPSG)LinGO 矩阵框架和词汇化树邻接语法 XTAG 项目。
......@@ -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("""
......@@ -465,7 +465,7 @@ grammar = nltk.PCFG.fromstring("""
* 句子都有内部组织结构,可以用一棵树表示。组成结构的显著特点是:递归、中心词、补语和修饰语。
* 语法是一个潜在的无限的句子集合的一个紧凑的特性;我们说,一棵树是符合语法规则的或语法树授权一棵树。
* 语法是用于描述一个给定的短语是否可以被分配一个特定的成分或依赖结构的一种形式化模型。
* 给定一组句法类别,上下文无关文法使用一组生产式表示某类型 *A* 的短语如何能够被分析成较小的序列α&lt;sub&gt;1&lt;/sub&gt; ... α&lt;sub&gt;n&lt;/sub&gt;
* 给定一组句法类别,上下文无关文法使用一组生产式表示某类型 *A* 的短语如何能够被分析成较小的序列α[1] ... α&lt;sub&gt;n&lt;/sub&gt;
* 依存语法使用产生式指定给定的中心词的依赖是什么。
* 一个句子有一个以上的句法分析就产生句法歧义(如介词短语附着歧义)。
* 分析器是一个过程,为符合语法规则的句子寻找一个或多个相应的树。
......@@ -503,7 +503,7 @@ grammar = nltk.PCFG.fromstring("""
7. ☼ 分析 A.A. Milne 关于 Piglet 的句子,为它包含的所有句子画下划线,然后用`S`替换这些(如第一句话变为`S` &lt;cite&gt;when&lt;/cite&gt;:lx` `S`)。为这种“压缩”的句子画一个树形结构。用于建立这样一个长句的主要的句法结构是什么?
8. ☼ 在递归下降分析器的演示中,通过选择 *Edit* 菜单上的 _Edit Text_ 改变实验句子。
8. ☼ 在递归下降分析器的演示中,通过选择 *Edit* 菜单上的 *Edit Text* 改变实验句子。
9. ☼ `grammar1`中的语法能被用来描述长度超过 20 词的句子吗?
......@@ -515,7 +515,7 @@ grammar = nltk.PCFG.fromstring("""
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 -&gt; Det N PP`为`NP -&gt; NP PP`。使用 *Step* 按钮,尝试建立一个分析树。发生了什么?
14. ◑ 你可以通过选择 *Edit* 菜单上的 *Edit Grammar* 修改递归下降分析器演示程序。改变第二次扩充产生式,即`NP -&gt; Det N PP`为`NP -&gt; NP PP`。使用 *Step* 按钮,尝试建立一个分析树。发生了什么?
15. ◑ 扩展`grammar2`中的语法,将产生式中的介词扩展为不及物的,及物的和需要`PP`补语的。基于这些产生式,使用前面练习中的方法为句子 Lee ran away home 画一棵树。
......
......@@ -56,7 +56,7 @@ PAT => l
... 'SRC': 'sbj', 'EXP': 'obj'}
```
特征结构是非常强大的,但我们操纵它们的方式是极其 _ad hoc_。我们本章接下来的任务是,显示上下文无关语法和分析如何能扩展到合适的特征结构,使我们可以一种更通用的和有原则的方式建立像这样的分析。我们将通过查看句法协议的现象作为开始;我们将展示如何使用特征典雅的表示协议约束,并在一个简单的语法中说明它们的用法。
特征结构是非常强大的,但我们操纵它们的方式是极其 *ad hoc*。我们本章接下来的任务是,显示上下文无关语法和分析如何能扩展到合适的特征结构,使我们可以一种更通用的和有原则的方式建立像这样的分析。我们将通过查看句法协议的现象作为开始;我们将展示如何使用特征典雅的表示协议约束,并在一个简单的语法中说明它们的用法。
由于特征结构是表示任何形式的信息的通用的数据结构,我们将从更形式化的视点简要地看着它们,并演示 NLTK 提供的特征结构的支持。在本章的最后一部分,我们将表明,特征的额外表现力开辟了一个用于描述语言结构的复杂性的广泛的可能性。
......@@ -269,7 +269,7 @@ fem
```
统一被正式定义为一个(部分)二元操作:FS&lt;sub&gt;0&lt;/sub&gt; ⊔ FS&lt;sub&gt;1&lt;/sub&gt;。统一是对称的,所以 FS&lt;sub&gt;0&lt;/sub&gt; ⊔ FS&lt;sub&gt;1&lt;/sub&gt; = FS&lt;sub&gt;1&lt;/sub&gt; ⊔ FS&lt;sub&gt;0&lt;/sub&gt;。在 Python 中也是如此:
统一被正式定义为一个(部分)二元操作:FS[0] ⊔ FS[1]。统一是对称的,所以 FS[0] ⊔ FS[1] = FS[1] ⊔ FS[0]。在 Python 中也是如此:
```py
>>> print(fs2.unify(fs1))
......@@ -622,8 +622,8 @@ Feature Bottom Up Predict Combine Rule:
* 两个特征可以共享一个值(原子的或复杂的)。具有共享值的结构被称为重入。共享的值被表示为 AVM 中的数字索引(或标记)。
* 一个特征结构中的路径是一个特征的元组,对应从图的根开始的弧的序列上的标签。
* 两条路径是等价的,如果它们共享一个值。
* 包含的特征结构是偏序的。FS&lt;sub&gt;0&lt;/sub&gt;包含 FS&lt;sub&gt;1&lt;/sub&gt;,当包含在 FS&lt;sub&gt;0&lt;/sub&gt;中的所有信息也出现在 FS&lt;sub&gt;1&lt;/sub&gt;中。
* 两种结构 FS&lt;sub&gt;0&lt;/sub&gt;和 FS&lt;sub&gt;1&lt;/sub&gt;的统一,如果成功,就是包含 FS&lt;sub&gt;0&lt;/sub&gt;和 FS&lt;sub&gt;1&lt;/sub&gt;的合并信息的特征结构 FS&lt;sub&gt;2&lt;/sub&gt;
* 包含的特征结构是偏序的。FS[0]包含 FS[1],当包含在 FS[0]中的所有信息也出现在 FS[1]中。
* 两种结构 FS[0]和 FS[1]的统一,如果成功,就是包含 FS[0]和 FS[1]的合并信息的特征结构 FS[2]
* 如果统一在 FS 中指定一条路径π,那么它也指定等效与π的每个路径π'。
* 我们可以使用特征结构建立对大量广泛语言学现象的简洁的分析,包括动词子类别,倒装结构,无限制依赖结构和格支配。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册