Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
nlp-py-2e-zh
提交
a60d5e2d
N
nlp-py-2e-zh
项目概览
OpenDocCN
/
nlp-py-2e-zh
大约 1 年 前同步成功
通知
2
Star
69
Fork
24
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
N
nlp-py-2e-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a60d5e2d
编写于
12月 29, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-12-29 14:09:23
上级
49c2019c
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
28 addition
and
28 deletion
+28
-28
0.md
0.md
+15
-15
1.md
1.md
+7
-7
2.md
2.md
+6
-6
未找到文件。
0.md
浏览文件 @
a60d5e2d
...
...
@@ -21,7 +21,7 @@ NLP 是科学、经济、社会和文化的一个重要因素。NLP 正在迅速
...
print
(
word
)
```
这段程序演示了 Python 的一些主要特征。首先,使用空格
*缩进*
代码,从而使
`if`
后面的代码都在前面一行
`for`
语句的范围之内;这保证了检查单词是否以
`ing`
结尾的测试对所有单词都进行。第二,Python 是
*面向对象*
语言;每一个变量都是包含特定属性和方法的对象。例如,变量
`line`
的值不仅仅是一个字符串序列。它是一个 string 对象,包含一个用来把字符串分割成词的
`split()`
方法(或叫操作)。我们在对象名称后面写上一个点再写上方法名称就可以调用对象的一个方法,例如
`line.split()`
。第三,方法的
*参数*
写在括号内。例如,上面的例子中的
`word.endswith('ing')`
具有一个参数
`'ing'`
表示我们需要找的是 ing
结尾的词而不是别的结尾的词。最后也是最重要的,Python 的可读性如此之强以至于可以相当容易的猜出程序的功能,即使你以前从未写过一行代码。
这段程序演示了 Python 的一些主要特征。首先,使用空格
*缩进*
代码,从而使
`if`
后面的代码都在前面一行
`for`
语句的范围之内;这保证了检查单词是否以
`ing`
结尾的测试对所有单词都进行。第二,Python 是
*面向对象*
语言;每一个变量都是包含特定属性和方法的对象。例如,变量
`line`
的值不仅仅是一个字符串序列。它是一个
`string`
对象,包含一个用来把字符串分割成词的
`split()`
方法(或叫操作)。我们在对象名称后面写上一个点再写上方法名称就可以调用对象的一个方法,例如
`line.split()`
。第三,方法的
*参数*
写在括号内。例如,上面的例子中的
`word.endswith('ing')`
具有一个参数
`'ing'`
表示我们需要找的是
`ing`
结尾的词而不是别的结尾的词。最后也是最重要的,Python 的可读性如此之强以至于可以相当容易的猜出程序的功能,即使你以前从未写过一行代码。
我们选择 Python 是因为它的学习曲线比较平缓,文法和语义都很清晰,具有良好的处理字符串的功能。作为解释性语言,Python 便于交互式编程。作为面向对象语言,Python 允许数据和方法被方便的封装和重用。作为动态语言,Python 允许属性等到程序运行时才被添加到对象,允许变量自动类型转换,提高开发效率。Python 自带强大的标准库,包括图形编程、数值处理和网络连接等组件。
...
...
@@ -48,7 +48,7 @@ NLTK 同样很多地方都有更改︰
*
许多类型使用
`fromstring()`
方法从字符串初始化
*
许多函数现在返回迭代器而不是列表
*
`ContextFreeGrammar`
现在叫做
`CFG`
,
`WeightedGrammar`
现在叫做
`PCFG`
*
`batch_tokenize()`
现在叫做
`tokenize_sents()`
;对应的
批 taggers, parsers 和 classifiers
都有变化
*
`batch_tokenize()`
现在叫做
`tokenize_sents()`
;对应的
标记器, 解析器和分类器
都有变化
*
有些实现已删除以支持外部包,或因为不能充分维护
更详细的变更列表请参见
`https://github.com/nltk/nltk/wiki/Porting-your-code-to-NLTK-3.0`
。
...
...
@@ -77,18 +77,18 @@ NLTK 创建于 2001 年,最初是宾州大学计算机与信息科学系计算
| 语言处理任务 | NLTK 模块 | 功能 |
| --- | --- | --- |
| 访问语料库 |
corpus
| 语料库与词典的标准化接口 |
| 字符串处理 |
tokenize, stem
| 分词,分句,提取主干 |
| 搭配的发现 |
collocations
| t-检验,卡方,点互信息 PMI |
| 词性标注 |
tag
| n-gram, backoff, Brill, HMM, TnT |
| 机器学习 |
classify, cluster, tbl
| 决策树,最大熵,贝叶斯,EM,k-means |
| 分块 |
chunk
| 正则表达式,n-gram,命名实体 |
| 解析 |
parse, ccg
| 图表,基于特征,一致性,概率,依赖 |
| 语义解释 |
sem, inference
| λ演算,一阶逻辑,模型检验 |
| 指标评测 |
metrics
| 精度,召回率,协议系数 |
| 概率和估计 |
probability
| 频率分布,平滑概率分布 |
| 应用 |
app, chat
| 图形化的语料库检索工具,分析器,WordNet 查看器,聊天机器人 |
| 语言学领域的工作 |
toolbox
| 处理 SIL 工具箱格式的数据 |
| 访问语料库 |
`corpus`
| 语料库与词典的标准化接口 |
| 字符串处理 |
`tokenize, stem`
| 分词,分句,提取主干 |
| 搭配的发现 |
`collocations`
| t-检验,卡方,点互信息 PMI |
| 词性标注 |
`tag`
| n-gram, backoff, Brill, HMM, TnT |
| 机器学习 |
`classify, cluster, tbl`
| 决策树,最大熵,贝叶斯,EM,k-means |
| 分块 |
`chunk`
| 正则表达式,n-gram,命名实体 |
| 解析 |
`parse, ccg`
| 图表,基于特征,一致性,概率,依赖 |
| 语义解释 |
`sem, inference`
| λ演算,一阶逻辑,模型检验 |
| 指标评测 |
`metrics`
| 精度,召回率,协议系数 |
| 概率和估计 |
`probability`
| 频率分布,平滑概率分布 |
| 应用 |
`app, chat`
| 图形化的语料库检索工具,分析器,WordNet 查看器,聊天机器人 |
| 语言学领域的工作 |
`toolbox`
| 处理 SIL 工具箱格式的数据 |
NLTK 设计中的四个主要目标:
...
...
@@ -98,7 +98,7 @@ NLTK 设计中的四个主要目标:
| 可扩展︰ | 提供一种结构,新的软件模块包括同一个任务中的不同的实现和相互冲突的方法都可以方便添加进来 |
| 模块化︰ | 提供的组件可以独立使用而无需理解工具包的其他部分 |
对比上述目标,我们有意回避了工具包三个非需求行的但可能有用的特征。首先,虽然工具包提供了广泛的工具,但它不是面面俱全的;它是一个工具包而不是一个系统,它将会随着 NLP 领域一起演化。第二,虽然这个工具包的效率足以支持实际的任务,但它运行时的性能还没有高度优化;这种优化往往涉及更复杂的算法或使用 C 或 C++等较低一级的编程语言来实现。这将影响工具包的可读性且更难以安装。第三,我们试图避开巧妙的编程技巧,因为我们相信清楚直白的实现比巧妙却可读性差的方法好。
对比上述目标,我们有意回避了工具包三个非需求行的但可能有用的特征。首先,虽然工具包提供了广泛的工具,但它不是面面俱全的;它是一个工具包而不是一个系统,它将会随着 NLP 领域一起演化。第二,虽然这个工具包的效率足以支持实际的任务,但它运行时的性能还没有高度优化;这种优化往往涉及更复杂的算法或使用 C 或 C++
等较低一级的编程语言来实现。这将影响工具包的可读性且更难以安装。第三,我们试图避开巧妙的编程技巧,因为我们相信清楚直白的实现比巧妙却可读性差的方法好。
## 教师请看
...
...
1.md
浏览文件 @
a60d5e2d
...
...
@@ -7,7 +7,7 @@
3.
Python 编程语言为上述工作提供了哪些工具和技术?
4.
自然语言处理中有哪些有趣的挑战?
本章分为完全不同风格的两部分。在“语言计算”部分,我们将选取一些语言相关的编程任务而不去解释它们是如何实现的。在“近观 Python”部分,我们将系统地回顾关键的编程概念。两种风格将按章节标题区分,而后面几章将混合两种风格而不作明显的区分。我们希望这种风格的介绍能使你对接下来将要碰到的内容有一个真实的体味,与此同时,涵盖语言学与计算机科学的基本概念。如果你对这两个方面已经有了基本的了解,可以跳到第
[
5
](
http://www.nltk.org/book/ch01.html#sec-automatic-natural-language-understanding
)
节 ; 我们将在后续的章节中重复所有要点,如果错过了什么,你可以很容易地在
`http://nltk.org/`
上查询在线参考材料。如果这些材料对你而言是全新的,那么本章将引发比解答本身更多的问题,这些问题将在本书的其余部分讨论。
本章分为完全不同风格的两部分。在“语言计算”部分,我们将选取一些语言相关的编程任务而不去解释它们是如何实现的。在“近观 Python”部分,我们将系统地回顾关键的编程概念。两种风格将按章节标题区分,而后面几章将混合两种风格而不作明显的区分。我们希望这种风格的介绍能使你对接下来将要碰到的内容有一个真实的体味,与此同时,涵盖语言学与计算机科学的基本概念。如果你对这两个方面已经有了基本的了解,可以跳到第
5
节 ; 我们将在后续的章节中重复所有要点,如果错过了什么,你可以很容易地在
`http://nltk.org/`
上查询在线参考材料。如果这些材料对你而言是全新的,那么本章将引发比解答本身更多的问题,这些问题将在本书的其余部分讨论。
## 1 语言计算:文本和单词
...
...
@@ -316,7 +316,7 @@ Note
注意
**轮到你来:**
通过输入名字、等号和一个单词列表, 组建几个你自己的句子,如
`ex1 = ['Monty', 'Python', 'and', 'the', 'Holy', 'Grail']`
。重复一些我们先前在第
[
1
](
http://www.nltk.org/book/ch01.html#sec-computing-with-language-texts-and-words
)
节看到的其他 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 加法运算。两个列表相加
[
❶
](
http://www.nltk.org/book/ch01.html#list-plus-list
)
创造出一个新的列表,包括第一个列表的全部,后面跟着第二个列表的全部。
...
...
@@ -464,7 +464,7 @@ IndexError: list index out of range
## 2.3 变量
从第
[
1
](
http://www.nltk.org/book/ch01.html#sec-computing-with-language-texts-and-words
)
节一开始,你已经访问过名为
`text1`
,
`text2`
等的文本。像这样只输入简短的名字来引用一本 250,000 字的书节省了很多打字时间。一般情况下,我们可以对任何我们关心的计算命名。我们在前面的小节中已经这样做了,例如定义一个变量变量
`sent1`
,如下所示:
从第
1
节一开始,你已经访问过名为
`text1`
,
`text2`
等的文本。像这样只输入简短的名字来引用一本 250,000 字的书节省了很多打字时间。一般情况下,我们可以对任何我们关心的计算命名。我们在前面的小节中已经这样做了,例如定义一个变量变量
`sent1`
,如下所示:
```
py
>>>
sent1
=
[
'Call'
,
'me'
,
'Ishmael'
,
'.'
]
...
...
@@ -549,13 +549,13 @@ SyntaxError: invalid syntax
>>>
```
我们将在第
[
3
](
http://www.nltk.org/book/ch03.html#chap-words
)
章回到字符串的主题。目前,我们已经有了两个重要的基石——列表和字符串——已经准备好可以重新做一些语言分析了。
我们将在第
3
章回到字符串的主题。目前,我们已经有了两个重要的基石——列表和字符串——已经准备好可以重新做一些语言分析了。
## 3 计算语言:简单的统计
让我们重新开始探索用我们的计算资源处理大量文本的方法。我们在第
[
1
](
http://www.nltk.org/book/ch01.html#sec-computing-with-language-texts-and-words
)
节已经开始讨论了,在那里我们看到如何搜索词及其上下文,如何汇编一个文本中的词汇,如何产生一种文体的随机文本等。
让我们重新开始探索用我们的计算资源处理大量文本的方法。我们在第
1
节已经开始讨论了,在那里我们看到如何搜索词及其上下文,如何汇编一个文本中的词汇,如何产生一种文体的随机文本等。
在本节中,我们重新拾起是什么让一个文本不同与其他文本这样的问题,并使用程序自动寻找特征词汇和文字表达。正如在第
[
1
](
http://www.nltk.org/book/ch01.html#sec-computing-with-language-texts-and-words
)
节中那样,你可以通过复制它们到 Python 解释器中来尝试 Python 语言的新特征,你将在下一节中系统的了解这些功能。
在本节中,我们重新拾起是什么让一个文本不同与其他文本这样的问题,并使用程序自动寻找特征词汇和文字表达。正如在第
1
节中那样,你可以通过复制它们到 Python 解释器中来尝试 Python 语言的新特征,你将在下一节中系统的了解这些功能。
在这之前,你可能会想通过预测下面的代码的输出来检查你对上一节的理解。你可以使用解释器来检查你是否正确。如果你不确定如何做这个任务,你最好在继续之前复习一下上一节的内容。
...
...
@@ -935,7 +935,7 @@ conscientious conscientiously deceitful deceive ...
* ◑ 找出聊天语料库(`text5`)中所有四个字母的词。使用频率分布函数(`FreqDist`),以频率从高到低显示这些词。
* ◑ 复习第
[4](http://www.nltk.org/book/ch01.html#sec-making-decisions)
节中条件循环的讨论。使用`for`和`if`语句组合循环遍历《巨蟒和圣杯》(`text6`)的电影剧本中的词,`print`所有的大写词,每行输出一个。
* ◑ 复习第
4
节中条件循环的讨论。使用`for`和`if`语句组合循环遍历《巨蟒和圣杯》(`text6`)的电影剧本中的词,`print`所有的大写词,每行输出一个。
* ◑ 写表达式找出`text6`中所有符合下列条件的词。结果应该是单词列表的形式:`['word1', 'word2', ...]`。
...
...
2.md
浏览文件 @
a60d5e2d
...
...
@@ -37,7 +37,7 @@ NLTK 包含古腾堡项目(Project Gutenberg)电子文本档案的经过挑
注意
在第
[
1
](
./ch01.html#sec-computing-with-language-texts-and-words
)
章中,我们演示了如何使用
`text1.concordance()`
命令对
`text1`
这样的文本进行索引。然而,这是假设你正在使用由
`from nltk.book import *`
导入的 9 个文本之一。现在你开始研究
`nltk.corpus`
中的数据,像前面的例子一样,你必须采用以下语句对来处理索引和第
[
1
](
./ch01.html#sec-computing-with-language-texts-and-words
)
章中的其它任务:
在第
1 章中,我们演示了如何使用
`text1.concordance()`
命令对
`text1`
这样的文本进行索引。然而,这是假设你正在使用由
`from nltk.book import *`
导入的 9 个文本之一。现在你开始研究
`nltk.corpus`
中的数据,像前面的例子一样,你必须采用以下语句对来处理索引和第 1
章中的其它任务:
```
py
>>>
emma
=
nltk
.
Text
(
nltk
.
corpus
.
gutenberg
.
words
(
'austen-emma.txt'
))
...
...
@@ -176,7 +176,7 @@ can: 94 could: 87 may: 93 might: 38 must: 53 will: 389
**轮到你来:**
选择布朗语料库的不同部分,修改前面的例子,计数包含 wh 的词,如:what, when, where, who 和 why。
下面,我们来统计每一个感兴趣的文体。我们使用 NLTK 提供的带条件的频率分布函数。在第
[
2
](
./ch02.html#sec-conditional-frequency-distributions
)
节中会系统的把下面的代码一行行拆开来讲解。现在,你可以忽略细节,只看输出。
下面,我们来统计每一个感兴趣的文体。我们使用 NLTK 提供的带条件的频率分布函数。在第
2
节中会系统的把下面的代码一行行拆开来讲解。现在,你可以忽略细节,只看输出。
```
py
>>>
cfd
=
nltk
.
ConditionalFreqDist
(
...
...
@@ -241,7 +241,7 @@ science_fiction 16 49 4 12 8 16
## 1.5 就职演说语料库
在第
[
1
](
./ch01.html#sec-computing-with-language-texts-and-words
)
章,我们看到了就职演说语料库,但是把它当作一个单独的文本对待。图
[
fig-inaugural
](
./ch01.html#fig-inaugural
)
中使用的“词偏移”就像是一个坐标轴;它是语料库中词的索引数,从第一个演讲的第一个词开始算起。然而,语料库实际上是 55 个文本的集合,每个文本都是一个总统的演说。这个集合的一个有趣特性是它的时间维度:
在第
1
章,我们看到了就职演说语料库,但是把它当作一个单独的文本对待。图
[
fig-inaugural
](
./ch01.html#fig-inaugural
)
中使用的“词偏移”就像是一个坐标轴;它是语料库中词的索引数,从第一个演讲的第一个词开始算起。然而,语料库实际上是 55 个文本的集合,每个文本都是一个总统的演说。这个集合的一个有趣特性是它的时间维度:
```
py
>>>
from
nltk.corpus
import
inaugural
...
...
@@ -253,7 +253,7 @@ science_fiction 16 49 4 12 8 16
请注意,每个文本的年代都出现在它的文件名中。要从文件名中获得年代,我们使用
`fileid[:4]`
提取前四个字符。
让我们来看看词汇 America 和 citizen 随时间推移的使用情况。下面的代码使用
`w.lower()`
[
❶
](
./ch02.html#lowercase-startswith
)
将就职演说语料库中的词汇转换成小写,然后用
`startswith()`
[
❶
](
./ch02.html#lowercase-startswith
)
检查它们是否以“目标”词汇
`america`
或
`citizen`
开始。因此,它会计算如 American's 和 Citizens 等词。我们将在第
[
2
](
./ch02.html#sec-conditional-frequency-distributions
)
节学习条件频率分布,现在只考虑输出,如图
[
1.1
](
./ch02.html#fig-inaugural2
)
所示。
让我们来看看词汇 America 和 citizen 随时间推移的使用情况。下面的代码使用
`w.lower()`
[
❶
](
./ch02.html#lowercase-startswith
)
将就职演说语料库中的词汇转换成小写,然后用
`startswith()`
[
❶
](
./ch02.html#lowercase-startswith
)
检查它们是否以“目标”词汇
`america`
或
`citizen`
开始。因此,它会计算如 American's 和 Citizens 等词。我们将在第
2
节学习条件频率分布,现在只考虑输出,如图
[
1.1
](
./ch02.html#fig-inaugural2
)
所示。
```
py
>>>
cfd
=
nltk
.
ConditionalFreqDist
(
...
...
@@ -313,7 +313,7 @@ NLTK 中的一些语料库和语料库样本:关于下载和使用它们,请
**轮到你来:**
在
`udhr.fileids()`
中选择一种感兴趣的语言,定义一个变量
`raw_text = udhr.raw(`
_Language-Latin1_
`)`
。使用
`nltk.FreqDist(raw_text).plot()`
画出此文本的字母频率分布图。
不幸的是,许多语言没有大量的语料库。通常是政府或工业对发展语言资源的支持不够,个人的努力是零碎的,难以发现或重用。有些语言没有既定的书写系统,或濒临灭绝。(见第
[
7
](
./ch02.html#sec-further-reading-corpora
)
节有关如何寻找语言资源的建议。)
不幸的是,许多语言没有大量的语料库。通常是政府或工业对发展语言资源的支持不够,个人的努力是零碎的,难以发现或重用。有些语言没有既定的书写系统,或濒临灭绝。(见第
7
节有关如何寻找语言资源的建议。)
## 1.8 文本语料库的结构
...
...
@@ -377,7 +377,7 @@ NLTK 中定义的基本语料库函数:使用`help(nltk.corpus.reader)`可以
## 2 条件频率分布
我们在第
[
3
](
./ch01.html#sec-computing-with-language-simple-statistics
)
节介绍了频率分布。我们看到给定某个词汇或其他元素的列表
`mylist`
,
`FreqDist(mylist)`
会计算列表中每个元素项目出现的次数。在这里,我们将推广这一想法。
我们在第
3
节介绍了频率分布。我们看到给定某个词汇或其他元素的列表
`mylist`
,
`FreqDist(mylist)`
会计算列表中每个元素项目出现的次数。在这里,我们将推广这一想法。
当语料文本被分为几类,如文体、主题、作者等时,我们可以计算每个类别独立的频率分布。这将允许我们研究类别之间的系统性差异。在上一节中,我们是用 NLTK 的
`ConditionalFreqDist`
数据类型实现的。条件频率分布是频率分布的集合,每个频率分布有一个不同的“条件”。这个条件通常是文本的类别。
[
2.1
](
./ch02.html#fig-tally2
)
描绘了一个带两个条件的条件频率分布的片段,一个是新闻文本,一个是言情文本。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录