提交 3575190f 编写于 作者: W wizardforcel

2020-12-29 14:23:44

上级 11a66740
......@@ -129,7 +129,7 @@ of Whale - Bones ; for Whales of a monstrous size are oftentimes cast up dead u
注意
**轮到你来:** 尝试搜索其他词;为了方便重复输入,你也许会用到上箭头,`Ctrl+↑`或者`Alt+p`获取之前输入的命令,然后修改要搜索的词。你也可以在我们包含的其他文本上搜索。例如, 使用`text2.concordance("affection")`,搜索《理智与情感》(*Sense and Sensibility*)中的`affection`。使用`text3.concordance("lived")`搜索《创世纪》(Genesis)找出某人活了多久。你也可以看看`text4`,《就职演说语料》(*Inaugural Address Corpus*),回到 1789 年看看那时英语的例子,搜索如`nation`, `terror``god`这样的词,看看随着时间推移这些词的使用如何不同。我们也包括了`text5`,《NPS 聊天语料库》(NPS Chat Corpus):你可以在里面搜索一些网络词,如`im ur``lol`。(注意这个语料库未经审查!)
**轮到你来**尝试搜索其他词;为了方便重复输入,你也许会用到上箭头,`Ctrl+↑`或者`Alt+p`获取之前输入的命令,然后修改要搜索的词。你也可以在我们包含的其他文本上搜索。例如, 使用`text2.concordance("affection")`,搜索《理智与情感》(*Sense and Sensibility*)中的`affection`。使用`text3.concordance("lived")`搜索《创世纪》(Genesis)找出某人活了多久。你也可以看看`text4`,《就职演说语料》(*Inaugural Address Corpus*),回到 1789 年看看那时英语的例子,搜索如`nation`, `terror``god`这样的词,看看随着时间推移这些词的使用如何不同。我们也包括了`text5`,《NPS 聊天语料库》(NPS Chat Corpus):你可以在里面搜索一些网络词,如`im ur``lol`。(注意这个语料库未经审查!)
在你花了一小会儿研究这些文本之后,我们希望你对语言的丰富性和多样性有一个新的认识。在下一章中,你将学习获取更广泛的文本,包括英语以外其他语言的文本。
......@@ -158,7 +158,7 @@ a_pretty is_pretty am_glad be_glad a_lucky
注意
**轮到你来:** 挑选另一对词,使用`similar()``common_contexts()`函数比较它们在两个不同文本中的用法。
**轮到你来**挑选另一对词,使用`similar()``common_contexts()`函数比较它们在两个不同文本中的用法。
自动检测出现在文本中的特定的词,并显示同样上下文中出现的一些词,这只是一个方面。我们也可以判断词在文本中的*位置*:从文本开头算起在它前面有多少词。这个位置信息可以用离散图表示。每一个竖线代表一个单词,每一行代表整个文本。在 1.2 中,我们看到在过去 220 年中的一些显著的词语用法模式(在一个由就职演说语料首尾相连的人为组合的文本中)。可以用下面的方法画出这幅图。你也许会想尝试更多的词(如,`liberty``constitution`)和不同的文本。你能在看到这幅图之前预测一个词的分布吗?跟以前一样,请保证引号、逗号、中括号及小括号的使用完全正确。
......@@ -173,7 +173,7 @@ a_pretty is_pretty am_glad be_glad a_lucky
注意
**重要事项:** 为了画出这本书中用到的图形,你需要安装 Python 的 NumPy 和 Matplotlib 包。请参阅`http://nltk.org/`上的安装说明。
**重要事项**为了画出这本书中用到的图形,你需要安装 Python 的 NumPy 和 Matplotlib 包。请参阅`http://nltk.org/`上的安装说明。
注意
......@@ -242,9 +242,9 @@ Note
**轮到你来:** `text5`中 lol 出现了多少次?它占文本全部词数的百分比是多少?
**轮到你来**`text5``lol`出现了多少次?它占文本全部词数的百分比是多少?
你也许想要对几个文本重复这些计算,但重新输入公式是乏味的。你可以自己命名一个任务,如“lexical_diversity”或“percentage”,然后用一个代码块关联它。现在,你只需输入一个很短的名字就可以代替一行或多行 Python 代码,而且你想用多少次就用多少次。执行一个任务的代码段叫做一个函数,我们使用关键字`def`给函数定义一个简短的名字。下面的例子演示如何定义两个新的函数,`lexical_diversity()``percentage()`
你也许想要对几个文本重复这些计算,但重新输入公式是乏味的。你可以自己命名一个任务,如`lexical_diversity``percentage`,然后用一个代码块关联它。现在,你只需输入一个很短的名字就可以代替一行或多行 Python 代码,而且你想用多少次就用多少次。执行一个任务的代码段叫做一个函数,我们使用关键字`def`给函数定义一个简短的名字。下面的例子演示如何定义两个新的函数,`lexical_diversity()``percentage()`
```py
>>> def lexical_diversity(text):
......@@ -257,7 +257,7 @@ Note
小心!
当遇到第一行末尾的冒号后,Python 解释器提示符由`>>>`变为`...``...`提示符表示 Python 期望在后面是一个缩进代码块 。缩进是输入四个空格还是敲击 Tab 键,这由你决定。要结束一个缩进代码段,只需输入一个空行。
当遇到第一行末尾的冒号后,Python 解释器提示符由`>>>`变为`...``...`提示符表示 Python 期望在后面是一个缩进代码块 。缩进是输入四个空格还是敲击`Tab`键,这由你决定。要结束一个缩进代码段,只需输入一个空行。
`lexical_diversity()`❶的定义中,我们指定了一个`text`参数。这个参数是我们想要计算词汇多样性的实际文本的一个“占位符”,并在用到这个函数的时候出现在将要运行的代码块中❷。类似地,`percentage()`定义了两个参数,`count``total`❸。
......@@ -316,7 +316,7 @@ Note
注意
**轮到你来:** 通过输入名字、等号和一个单词列表, 组建几个你自己的句子,如`ex1 = ['Monty', 'Python', 'and', 'the', 'Holy', 'Grail']`。重复一些我们先前在第 1 节看到的其他 Python 操作,如:`sorted(ex1)`, `len(set(ex1))`, `ex1.count('the')`
**轮到你来**通过输入名字、等号和一个单词列表, 组建几个你自己的句子,如`ex1 = ['Monty', 'Python', 'and', 'the', 'Holy', 'Grail']`。重复一些我们先前在第 1 节看到的其他 Python 操作,如:`sorted(ex1)`, `len(set(ex1))`, `ex1.count('the')`
令人惊喜的是,我们可以对列表使用 Python 加法运算。两个列表相加❶创造出一个新的列表,包括第一个列表的全部,后面跟着第二个列表的全部。
......@@ -460,7 +460,7 @@ IndexError: list index out of range
注意
**轮到你来:**花几分钟定义你自己的句子,使用前文中的方法修改个别词和词组(切片)。尝试本章结尾关于列表的练习,检验你是否理解。
**轮到你来**花几分钟定义你自己的句子,使用前文中的方法修改个别词和词组(切片)。尝试本章结尾关于列表的练习,检验你是否理解。
## 2.3 变量
......@@ -603,7 +603,7 @@ what output do you expect here?
注意
**轮到你来:**使用`text2`尝试前面的频率分布的例子。注意正确使用括号和大写字母。如果你得到一个错误消息`NameError: name 'FreqDist' is not defined`,你需要在一开始输入`from nltk.book import *`
**轮到你来**使用`text2`尝试前面的频率分布的例子。注意正确使用括号和大写字母。如果你得到一个错误消息`NameError: name 'FreqDist' is not defined`,你需要在一开始输入`from nltk.book import *`
上一个例子中是否有什么词有助于我们把握这个文本的主题或风格呢?只有一个词,whale,稍微有些信息量!它出现了超过 900 次。其余的词没有告诉我们关于文本的信息;它们只是“管道”英语。这些词在文本中占多少比例?我们可以产生一个这些词汇的累积频率图,使用`fdist1.plot(50, cumulative=True)`来生成 3.2 中的图。这 50 个词占了书的将近一半!
......@@ -634,7 +634,7 @@ what output do you expect here?
注意
**轮到你来:** 在 Python 解释器中尝试上面的表达式,改变文本和长度条件做一些实验。如果改变变量名,你的结果会产生什么变化吗,如使用`[word for word in vocab if ...]`
**轮到你来**在 Python 解释器中尝试上面的表达式,改变文本和长度条件做一些实验。如果改变变量名,你的结果会产生什么变化吗,如使用`[word for word in vocab if ...]`
让我们回到寻找文本特征词汇的任务上来。请注意,`text4`中的长词反映国家主题 — constitutionally, transcontinental — 而`text5`中的长词反映的不是真正的内容 boooooooooooglyyyyyy 和 yuuuuuuuuuuuummmmmmmmmmmm。我们是否已经成功的自动提取出文本的特征词汇呢?好的,这些很长的词通常是 hapaxes(即唯一的),也许找出*频繁出现的*长词会更好。这样看起来更有前途,因为这样忽略了短高频词(如 the)和长低频词(如 antiphilosophists)。以下是聊天语料库中所有长度超过 7 个字符,且出现次数超过 7 次的词:
......@@ -764,7 +764,7 @@ NLTK 频率分布类中定义的函数
注意
**轮到你来:** 运行下面的例子,尝试解释每一条指令中所发生的事情。然后,试着自己组合一些条件。
**轮到你来**运行下面的例子,尝试解释每一条指令中所发生的事情。然后,试着自己组合一些条件。
```py
>>> sorted(w for w in set(text7) if '-' in w and 'index' in w)
......
......@@ -48,7 +48,7 @@ SELECT City FROM city_table WHERE Country="china"
注意
**轮到你来:**设置跟踪为最大,运行分析器,即`cp = load_parser('grammars/book_grammars/sql0.fcfg', trace=3)`,研究当边被完整的加入到图表中时,如何建立`sem`的值。
**轮到你来**设置跟踪为最大,运行分析器,即`cp = load_parser('grammars/book_grammars/sql0.fcfg', trace=3)`,研究当边被完整的加入到图表中时,如何建立`sem`的值。
最后,我们在数据库`city.db`上执行查询,检索出一些结果:
......@@ -147,7 +147,7 @@ True
注意
**轮到你来:**做实验为不同的命题逻辑公式估值。模型是否给出你所期望的值?
**轮到你来**做实验为不同的命题逻辑公式估值。模型是否给出你所期望的值?
到目前为止,我们已经将我们的英文句子翻译成命题逻辑。因为我们只限于用字母如`P``Q`表示原子句子,不能深入其内部结构。实际上,我们说将原子句子分成主语、宾语和谓词并没有语义上的好处。然而,这似乎是错误的:如果我们想形式化如[(9)](./ch10.html#ex-proplog8)这样的论证,就必须要能“看到里面”基本的句子。因此,我们将超越命题逻辑到一个更有表现力的东西,也就是一阶逻辑。这正是我们下一节要讲的。
......@@ -260,7 +260,7 @@ False
注意
**轮到你来:**模仿 1.2 绘制一个图,描述域`m`和相应的每个一元谓词的集合。
**轮到你来**模仿 1.2 绘制一个图,描述域`m`和相应的每个一元谓词的集合。
你可能已经注意到,我们的一元谓词(即`boy``girl``dog`)也是以单个元组的集合而不是个体的集合出现的。这使我们能够方便的统一处理任何元数的关系。一个形式为 P(τ[1], ... τ<sub>n</sub>)的谓词,其中 P 是 n 元的,为真的条件是对应于(τ[1], ... τ<sub>n</sub>) 的值的元组属于 P 的值的元组的集合。
......@@ -375,7 +375,7 @@ True
注意
**轮到你来:**先用笔和纸,然后用`m.evaluate()`,尝试弄清楚`all x.(girl(x) & walk(x))``exists x.(boy(x) -> walk(x))`的真值。确保你能理解为什么它们得到这些值。
**轮到你来**先用笔和纸,然后用`m.evaluate()`,尝试弄清楚`all x.(girl(x) & walk(x))``exists x.(boy(x) -> walk(x))`的真值。确保你能理解为什么它们得到这些值。
## 3.7 量词范围歧义
......@@ -422,7 +422,7 @@ set()
注意
**轮到你来:**基于`m2`设计一个新的模型,使[(27a)](./ch10.html#ex-scope2a)在你的模型中为假;同样的,设计一个新的模型使[(27b)](./ch10.html#ex-scope2b)为真。
**轮到你来**基于`m2`设计一个新的模型,使[(27a)](./ch10.html#ex-scope2a)在你的模型中为假;同样的,设计一个新的模型使[(27b)](./ch10.html#ex-scope2b)为真。
## 3.8 模型的建立
......
......@@ -436,7 +436,7 @@ Python 的 ElementTree 模块提供了一种方便的方式访问存储在 XML
注意
**轮到你来:**对语料库中包含的其他莎士比亚戏剧,如《罗密欧与朱丽叶》或《麦克白》,重复上述的一些方法;方法列表请参阅`nltk.corpus.shakespeare.fileids()`
**轮到你来**对语料库中包含的其他莎士比亚戏剧,如《罗密欧与朱丽叶》或《麦克白》,重复上述的一些方法;方法列表请参阅`nltk.corpus.shakespeare.fileids()`
虽然我们可以通过这种方式访问整个树,使用特定名称查找子元素会更加方便。回想一下顶层的元素有几种类型。我们可以使用`merchant.findall('ACT')`遍历我们感兴趣的类型(如幕)。下面是一个做这种特定标记在每一个级别的嵌套搜索的例子:
......
......@@ -174,7 +174,7 @@ can: 94 could: 87 may: 93 might: 38 must: 53 will: 389
注意
**轮到你来:** 选择布朗语料库的不同部分,修改前面的例子,计数包含 wh 的词,如:what, when, where, who 和 why。
**轮到你来**选择布朗语料库的不同部分,修改前面的例子,计数包含 wh 的词,如:what, when, where, who 和 why。
下面,我们来统计每一个感兴趣的文体。我们使用 NLTK 提供的带条件的频率分布函数。在第 2 节中会系统的把下面的代码一行行拆开来讲解。现在,你可以忽略细节,只看输出。
......@@ -311,7 +311,7 @@ NLTK 中的一些语料库和语料库样本:关于下载和使用它们,请
注意
**轮到你来:**`udhr.fileids()`中选择一种感兴趣的语言,定义一个变量`raw_text = udhr.raw(`_Language-Latin1_`)`。使用`nltk.FreqDist(raw_text).plot()`画出此文本的字母频率分布图。
**轮到你来**`udhr.fileids()`中选择一种感兴趣的语言,定义一个变量`raw_text = udhr.raw(`_Language-Latin1_`)`。使用`nltk.FreqDist(raw_text).plot()`画出此文本的字母频率分布图。
不幸的是,许多语言没有大量的语料库。通常是政府或工业对发展语言资源的支持不够,个人的努力是零碎的,难以发现或重用。有些语言没有既定的书写系统,或濒临灭绝。(见第 7 节有关如何寻找语言资源的建议。)
......@@ -493,7 +493,7 @@ German_Deutsch 0 171 263 614 717 894 1013 1110 1213 1275
注意
**轮到你来:** 处理布朗语料库的新闻和言情文体,找出一周中最有新闻价值并且是最浪漫的日子。定义一个变量`days`,包含星期的列表,如`['Monday', ...]`。然后使用`cfd.tabulate(samples=days)`为这些词的计数制表。接下来用`plot`替代`tabulate`尝试同样的事情。你可以在额外的参数`samples=['Monday', ...]`的帮助下控制星期输出的顺序。
**轮到你来**处理布朗语料库的新闻和言情文体,找出一周中最有新闻价值并且是最浪漫的日子。定义一个变量`days`,包含星期的列表,如`['Monday', ...]`。然后使用`cfd.tabulate(samples=days)`为这些词的计数制表。接下来用`plot`替代`tabulate`尝试同样的事情。你可以在额外的参数`samples=['Monday', ...]`的帮助下控制星期输出的顺序。
你可能已经注意到:我们已经在使用的条件频率分布看上去像列表推导,但是不带方括号。通常,我们使用列表推导作为一个函数的参数,如`set([w.lower() for w in t])`,忽略掉方括号而只写`set(w.lower() for w in t)`是允许的。(更多的讲解请参见 4.2 节“生成器表达式”的讨论。)
......@@ -540,7 +540,7 @@ print('Monty Python')
注意
**要点:** 我们的内联代码的例子包含`>>>``...`提示符,好像我们正在直接与解释器交互。随着程序变得更加复杂,你应该在编辑器中输入它们,没有提示符,如前面所示的那样在编辑器中运行它们。当我们在这本书中提供更长的程序时,我们将不使用提示符以提醒你在文件中输入它而不是使用解释器。你可以看到 2.2 已经这样了。请注意,这个例子还包括两行代码带有 Python 提示符;它是任务的互动部分,在这里你观察一些数据,并调用一个函数。请记住,像 2.2 这样的所有示例代码都可以从`http://nltk.org/`下载。
**要点**我们的内联代码的例子包含`>>>``...`提示符,好像我们正在直接与解释器交互。随着程序变得更加复杂,你应该在编辑器中输入它们,没有提示符,如前面所示的那样在编辑器中运行它们。当我们在这本书中提供更长的程序时,我们将不使用提示符以提醒你在文件中输入它而不是使用解释器。你可以看到 2.2 已经这样了。请注意,这个例子还包括两行代码带有 Python 提示符;它是任务的互动部分,在这里你观察一些数据,并调用一个函数。请记住,像 2.2 这样的所有示例代码都可以从`http://nltk.org/`下载。
## 3.2 函数
......@@ -998,7 +998,7 @@ Lemma('car.n.04.car'), Lemma('cable_car.n.01.car')]
注意
**轮到你来:**写下词 dish 的你能想到的所有意思。现在,在 WordNet 的帮助下使用前面所示的相同的操作探索这个词。
**轮到你来**写下词 dish 的你能想到的所有意思。现在,在 WordNet 的帮助下使用前面所示的相同的操作探索这个词。
## 5.2 WordNet 的层次结构
......@@ -1057,7 +1057,7 @@ Synset('ambulance.n.01')
注意
**轮到你来:** 尝试 NLTK 中便捷的图形化 WordNet 浏览器:`nltk.app.wordnet()`。沿着上位词与下位词之间的链接,探索 WordNet 的层次结构。
**轮到你来**尝试 NLTK 中便捷的图形化 WordNet 浏览器:`nltk.app.wordnet()`。沿着上位词与下位词之间的链接,探索 WordNet 的层次结构。
## 5.3 更多的词汇关系
......
......@@ -12,7 +12,7 @@
注意
**重点:** 从本章开始往后我们的例子程序将假设你以下面的导入语句开始你的交互式会话或程序:
**重点**从本章开始往后我们的例子程序将假设你以下面的导入语句开始你的交互式会话或程序:
```py
>>> from __future__ import division # Python 2 users only
......@@ -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())`检查其内容。
当你尝试这样做时可能会出各种各样的错误。如果解释器无法找到你的文件,你会看到类似这样的错误:
......@@ -357,7 +357,7 @@ And Summer's lease hath all too short a date:
注意
**轮到你来:** 试运行下面的代码,然后尝试使用你对字符串`+``*`操作的理解,弄清楚它是如何运作的。要小心区分字符串`' '`,这是一个空格符,和字符串`''`,这是一个空字符串。
**轮到你来**试运行下面的代码,然后尝试使用你对字符串`+``*`操作的理解,弄清楚它是如何运作的。要小心区分字符串`' '`,这是一个空格符,和字符串`''`,这是一个空字符串。
```py
>>> a = [1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1]
......@@ -501,7 +501,7 @@ found "thing"
注意
**轮到你来:** 造一句话,将它分配给一个变量, 例如,`sent = 'my sentence...'`。写切片表达式抽取个别词。(这显然不是一种方便的方式来处理文本中的词!)
**轮到你来**造一句话,将它分配给一个变量, 例如,`sent = 'my sentence...'`。写切片表达式抽取个别词。(这显然不是一种方便的方式来处理文本中的词!)
### 更多的字符串操作
......@@ -556,7 +556,7 @@ TypeError: object does not support item assignment
注意
**轮到你来:** 通过尝试本章结尾的一些练习,巩固你的字符串知识。
**轮到你来**通过尝试本章结尾的一些练习,巩固你的字符串知识。
## 3.3 使用 Unicode 进行文字处理
......@@ -732,7 +732,7 @@ NLTK 分词器允许 Unicode 字符串作为输入,并输出相应地 Unicode
注意
**轮到你来:** 驼字符`^`匹配字符串的开始,就像`如果我们不用这两个符号而使用«`..j..t..`»搜索,刚才例子中我们会得到什么样的结果?
**轮到你来**:驼字符`^`匹配字符串的开始,就像`如果我们不用这两个符号而使用«`..j..t..`»搜索,刚才例子中我们会得到什么样的结果?
最后,`?`符合表示前面的字符是可选的。因此«`^e-?mail 我们可以使用`sum(1 for w in text if re.search('^e-?mail/font>, w))`计数一个文本中这个词(任一拼写形式)出现的总次数。
......@@ -753,7 +753,7 @@ T9 系统用于在手机上输入文本(见 3.5))。两个或两个以上以
注意
**轮到你来:** 来看一些“手指绕口令”,只用一部分数字键盘搜索词汇。例如«`^[ghijklmno]+`-``+`表示什么意思?
**轮到你来**:来看一些“手指绕口令”,只用一部分数字键盘搜索词汇。例如«`^[ghijklmno]+`-``+`表示什么意思?
让我们进一步探索`+`符号。请注意,它可以适用于单个字母或括号内的字母集:
......@@ -795,7 +795,7 @@ T9 系统用于在手机上输入文本(见 3.5))。两个或两个以上以
注意
**轮到你来:** 研究前面的例子,在你继续阅读之前尝试弄清楚`\`, `{}`, `()``|`这些符号的功能。
**轮到你来**:研究前面的例子,在你继续阅读之前尝试弄清楚`\`, `{}`, `()``|`这些符号的功能。
你可能已经知道反斜杠表示其后面的字母不再有特殊的含义而是按照字面的表示匹配词中特定的字符。因此,虽然`.`很特别,但是`\.`只匹配一个句号。大括号表达式,如`{3,5}`, 表示前面的项目重复指定次数。管道字符表示从其左边的内容和右边的内容中选择一个。圆括号表示一个操作符的范围,它们可以与管道(或叫析取)符号一起使用,如«`w(i|e|ai|oo)t`»,匹配 wit, wet, wait 和 woot。你可以省略这个例子里的最后一个表达式中的括号,使用«`ed|ing
......@@ -826,7 +826,7 @@ T9 系统用于在手机上输入文本(见 3.5))。两个或两个以上以
注意
**轮到你来:** 在 W3C 日期时间格式中,日期像这样表示:2009-12-31。Replace the `?` in the following Python code with a regular expression, in order to convert the string `'2009-12-31'` to a list of integers `[2009, 12, 31]`:
**轮到你来**:在 W3C 日期时间格式中,日期像这样表示:2009-12-31。Replace the `?` in the following Python code with a regular expression, in order to convert the string `'2009-12-31'` to a list of integers `[2009, 12, 31]`:
`[int(n) for n in re.findall(?, '2009-12-31')]`
......@@ -983,7 +983,7 @@ la la; lovely lol lol love; lol lol lol.; la la la; la la la
注意
**轮到你来:**巩固你对正则表达式模式与替换的理解,使用`nltk.re_show(`_p, s_`)`,它能标注字符串 *s* 中所有匹配模式 *p* 的地方,以及`nltk.app.nemo()`,它能提供一个探索正则表达式的图形界面。更多的练习,可以尝试本章尾的正则表达式的一些练习。
**轮到你来**巩固你对正则表达式模式与替换的理解,使用`nltk.re_show(`_p, s_`)`,它能标注字符串 *s* 中所有匹配模式 *p* 的地方,以及`nltk.app.nemo()`,它能提供一个探索正则表达式的图形界面。更多的练习,可以尝试本章尾的正则表达式的一些练习。
当我们研究的语言现象与特定词语相关时建立搜索模式是很容易的。在某些情况下,一个小小的创意可能会花很大功夫。例如,在大型文本语料库中搜索 x and other ys 形式的表达式能让我们发现上位词(见5):
......@@ -1008,7 +1008,7 @@ abstracts and other compilations; iron and other metals
注意
**轮到你来:** 查找模式 as x as y 的实例以发现实体及其属性信息。
**轮到你来**查找模式 as x as y 的实例以发现实体及其属性信息。
## 3.6 规范化文本
......@@ -1118,7 +1118,7 @@ WordNet 词形归并器只在产生的词在它的词典中时才删除词缀。
注意
**要点:** 记住在正则表达式前加字母`r`(表示"原始的"),它告诉 Python 解释器按照字面表示对待字符串,而不去处理正则表达式中包含的反斜杠字符。
**要点**记住在正则表达式前加字母`r`(表示"原始的"),它告诉 Python 解释器按照字面表示对待字符串,而不去处理正则表达式中包含的反斜杠字符。
在空格符处分割文本给我们如`'(not'``'herself,'`这样的词符。另一种方法是使用 Python 提供给我们的字符类`\w`匹配词中的字符,相当于`[a-zA-Z0-9_]`。它还定义了这个类的补集`\W`,即所有字母、数字和下划线以外的字符。我们可以在一个简单的正则表达式中用`\W`来分割所有单词字符*以外*的输入:
......
......@@ -58,7 +58,7 @@
注意
**轮到你来:** 用乘法创建一个列表的列表:`nested = [[]] * 3`。现在修改列表中的一个元素,观察所有的元素都改变了。使用 Python 的`id()`函数找出任一对象的数字标识符, 并验证`id(nested[0])``id(nested[1])``id(nested[2])`是一样的。
**轮到你来**用乘法创建一个列表的列表:`nested = [[]] * 3`。现在修改列表中的一个元素,观察所有的元素都改变了。使用 Python 的`id()`函数找出任一对象的数字标识符, 并验证`id(nested[0])``id(nested[1])``id(nested[2])`是一样的。
现在请注意,当我们分配一个新值给列表中的一个元素时,它并不会传送给其他元素:
......@@ -74,7 +74,7 @@
注意
**重要:** 要从列表`foo`复制项目到一个新的列表`bar`,你可以写`bar = foo[:]`。这会复制列表中的对象引用。若要复制结构而不复制任何对象引用,请使用`copy.deepcopy()`
**重要**要从列表`foo`复制项目到一个新的列表`bar`,你可以写`bar = foo[:]`。这会复制列表中的对象引用。若要复制结构而不复制任何对象引用,请使用`copy.deepcopy()`
### 等式
......@@ -300,7 +300,7 @@ True
注意
**轮到你来:**使用`lexicon = tuple(lexicon)``lexicon`转换为一个元组,然后尝试上述操作,确认它们都不能运用在元组上。
**轮到你来**使用`lexicon = tuple(lexicon)``lexicon`转换为一个元组,然后尝试上述操作,确认它们都不能运用在元组上。
### 生成器表达式
......
......@@ -40,7 +40,7 @@ NLTK 为每个标记提供了文档,可以使用该标记来查询,如`nltk.
注意
**轮到你来:** 很多单词,如 ski 和 race,可以用作名词或动词而发音没有区别。你能想出其他的吗?提示:想想一个常见的东西,尝试把词 to 放到它前面,看它是否也是一个动词;或者想想一个动作,尝试把 the 放在它前面,看它是否也是一个名词。现在用这个词的两种用途造句,在这句话上运行词性标注器。
**轮到你来**很多单词,如 ski 和 race,可以用作名词或动词而发音没有区别。你能想出其他的吗?提示:想想一个常见的东西,尝试把词 to 放到它前面,看它是否也是一个动词;或者想想一个动作,尝试把 the 放在它前面,看它是否也是一个名词。现在用这个词的两种用途造句,在这句话上运行词性标注器。
词汇类别如“名词”和词性标记如`NN`,看上去似乎有其用途,但在细节上将使许多读者感到晦涩。你可能想知道要引进这种额外的信息的理由是什么。很多这些类别源于对文本中单词分布的粗略分析。考虑下面的分析,涉及 woman(名词),bought(动词),over(介词)和 the(限定词)。`text.similar()`方法接收一个单词 w,找出所有上下文 w[1]w w[2],然后找出所有出现在相同上下文中的词 w',即 w[1]w'w[2]。
......@@ -175,7 +175,7 @@ NLTK 中还有其他几种语言的已标注语料库,包括中文,印地语
注意
**轮到你来:**使用`tag_fd.plot(cumulative=True)`为上面显示的频率分布绘图。标注为上述列表中的前五个标记的词的百分比是多少?
**轮到你来**使用`tag_fd.plot(cumulative=True)`为上面显示的频率分布绘图。标注为上述列表中的前五个标记的词的百分比是多少?
我们可以使用这些标记做强大的搜索,结合一个图形化的词性索引工具`nltk.app.concordance()`。用它来寻找任一单词和词性标记的组合,如`N N N N`, `hit/VD`, `hit/VN`或者`the ADJ man`
......@@ -253,7 +253,7 @@ NLTK 中还有其他几种语言的已标注语料库,包括中文,印地语
注意
**轮到你来:** 通过`list(cfd2['VN'])`指定一个过去分词的列表,尝试收集所有直接在列表中项目前面的词-标记对。
**轮到你来**通过`list(cfd2['VN'])`指定一个过去分词的列表,尝试收集所有直接在列表中项目前面的词-标记对。
## 2.6 形容词和副词
......@@ -263,7 +263,7 @@ NLTK 中还有其他几种语言的已标注语料库,包括中文,印地语
注意
**轮到你来:**如果你对这些词性中的一些不确定,使用`nltk.app.concordance()`学习它们,或看 *Schoolhouse Rock!* 语法视频于 YouTube,或者查询本章结束的进一步阅读一节。
**轮到你来**如果你对这些词性中的一些不确定,使用`nltk.app.concordance()`学习它们,或看 *Schoolhouse Rock!* 语法视频于 YouTube,或者查询本章结束的进一步阅读一节。
## 2.7 未简化的标记
......@@ -379,7 +379,7 @@ that CNJ V WH DET
注意
**轮到你来:**打开词性索引工具`nltk.app.concordance()`并加载完整的布朗语料库(简化标记集)。现在挑选一些上面代码例子末尾处列出的词,看看词的标记如何与词的上下文相关。例如搜索`near`会看到所有混合在一起的形式,搜索`near/ADJ`会看到它作为形容词使用,`near N`会看到只是名词跟在后面的情况,等等。更多的例子,请修改附带的代码,以便它列出的词具有三个不同的标签。
**轮到你来**:打开词性索引工具`nltk.app.concordance()`并加载完整的布朗语料库(简化标记集)。现在挑选一些上面代码例子末尾处列出的词,看看词的标记如何与词的上下文相关。例如搜索`near`会看到所有混合在一起的形式,搜索`near/ADJ`会看到它作为形容词使用,`near N`会看到只是名词跟在后面的情况,等等。更多的例子,请修改附带的代码,以便它列出的词具有三个不同的标签。
## 3 使用 Python 字典映射单词到其属性
......@@ -807,7 +807,7 @@ Python 字典方法:常用的方法与字典相关习惯用法的总结。
注意
**轮到你来:**看看你能不能想出一些模式,提高上面所示的正则表达式标注器的性能。(请注意1描述部分自动化这类工作的方法。)
**轮到你来**:看看你能不能想出一些模式,提高上面所示的正则表达式标注器的性能。(请注意1描述部分自动化这类工作的方法。)
## 4.3 查询标注器
......@@ -993,7 +993,7 @@ N-gram 标注器不应考虑跨越句子边界的上下文。因此,NLTK 的
注意
**轮到你来:** 通过定义一个名为`t3`的`TrigramTagger`,扩展前面的例子,它是`t2`的回退标注器。
**轮到你来**:通过定义一个名为`t3`的`TrigramTagger`,扩展前面的例子,它是`t2`的回退标注器。
请注意,我们在标注器初始化时指定回退标注器,从而使训练能利用回退标注器。于是,在一个特定的上下文中,如果二元标注器将分配与它的一元回退标注器一样的标记,那么二元标注器丢弃训练的实例。这样保持尽可能小的二元标注器模型。我们可以进一步指定一个标注器需要看到一个上下文的多个实例才能保留它,例如`nltk.BigramTagger(sents, cutoff=2, backoff=t1)`将会丢弃那些只看到一次或两次的上下文。
......
......@@ -97,7 +97,7 @@ Most Informative Features
注意
**轮到你来:**修改`gender_features()`函数,为分类器提供名称的长度、它的第一个字母以及任何其他看起来可能有用的特征。用这些新特征重新训练分类器,并测试其准确性。
**轮到你来**修改`gender_features()`函数,为分类器提供名称的长度、它的第一个字母以及任何其他看起来可能有用的特征。用这些新特征重新训练分类器,并测试其准确性。
在处理大型语料库时,构建一个包含每一个实例的特征的单独的列表会使用大量的内存。在这些情况下,使用函数`nltk.classify.apply_features`,返回一个行为像一个列表而不会在内存存储所有特征集的对象:
......
......@@ -153,7 +153,7 @@ sentence = [("Rapunzel", "NNP"), ("let", "VBD"), ("down", "RP"), ❶
注意
**轮到你来:**将上面的例子封装在函数`find_chunks()`内,以一个如`"CHUNK: {<V.*> <TO> <V.*>}"`的词块字符串作为参数。Use it to search the corpus for several other patterns, such as four or more nouns in a row, e.g. `"NOUNS: {<N.*>{4,}}"`
**轮到你来**:将上面的例子封装在函数`find_chunks()`内,以一个如`"CHUNK: {<V.*> <TO> <V.*>}"`的词块字符串作为参数。Use it to search the corpus for several other patterns, such as four or more nouns in a row, e.g. `"NOUNS: {<N.*>{4,}}"`
## 2.5 词缝加塞
......@@ -476,7 +476,7 @@ ChunkParse score:
注意
**轮到你来:**尝试为特征提取器函数`npchunk_features`增加不同的特征,看看是否可以进一步改善 NP 词块划分器的表现。
**轮到你来**:尝试为特征提取器函数`npchunk_features`增加不同的特征,看看是否可以进一步改善 NP 词块划分器的表现。
## 4 语言结构中的递归
......@@ -704,7 +704,7 @@ VAN('annie_lennox', 'eurythmics')
注意
**轮到你来:**替换最后一行❶为`print(rtuple(rel, lcon=True, rcon=True))`。这将显示实际的词表示两个 NE 之间关系以及它们左右的默认 10 个词的窗口的上下文。在一本荷兰语词典的帮助下,你也许能够找出为什么结果`VAN('annie_lennox', 'eurythmics')`是个误报。
**轮到你来**:替换最后一行❶为`print(rtuple(rel, lcon=True, rcon=True))`。这将显示实际的词表示两个 NE 之间关系以及它们左右的默认 10 个词的窗口的上下文。在一本荷兰语词典的帮助下,你也许能够找出为什么结果`VAN('annie_lennox', 'eurythmics')`是个误报。
## 7 小结
......
......@@ -146,7 +146,7 @@ NLTK 中提供`ShiftReduceParser()`,移进-归约分析器的一个简单的
注意
**轮到你来:** 以跟踪模式运行上述分析器,看看序列的移进和规约操作,使用`sr_parse = nltk.ShiftReduceParser(grammar1, trace=2)`
**轮到你来**以跟踪模式运行上述分析器,看看序列的移进和规约操作,使用`sr_parse = nltk.ShiftReduceParser(grammar1, trace=2)`
移进-规约分析器可能会到达一个死胡同,而不能找到任何解析,即使输入的句子是符合语法的。这种情况发生时,没有剩余的输入,而堆栈包含不能被规约到一个`S`的项目。问题出现的原因是较早前做出的选择不能被分析器撤销(虽然图形演示中用户可以撤消它们的选择)。分析器可以做两种选择:(a)当有多种规约可能时选择哪个规约(b)当移进和规约都可以时选择哪个动作。
......@@ -257,7 +257,7 @@ WFST 有几个缺点。首先,正如你可以看到的,WFST 本身不是一
注意
**轮到你来:**尝试交互式图表分析器应用程序`nltk.app.chartparser()`
**轮到你来**尝试交互式图表分析器应用程序`nltk.app.chartparser()`
## 5 依存关系和依存文法
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册