《用Python进行自然语言处理》归纳一
1.自然语言工具包(NLTK)
NLTK 创建于2001 年,最初是宾州大学计算机与信息科学系计算语言学课程的一部分。从那以后,在数十名贡献者的帮助下不断发展壮大。如今,它已被几十所大学的课程所采纳,并作为许多研究项目的基础。表P -2 列出了NLTK 的一些最重要的模块。
这本书提供自然语言处理领域非常方便的入门指南。它可以用来自学,也可以作为自然语言处理或计算语言学课程的教科书,或是人工智能、文本挖掘、语料库语言学课程的补充读物。本书的实践性很强,包括几百个实际可用的例子和分级练习。
本书基于Python 编程语言及其上的一个名为自然语言工具包(Natural Language Toolkit ,简称NLTK)的开源库。NLTK 包含大量的软件、数据和文档,所有这些都可以从http://www.nltk.org/免费下载。NLTK 的发行版本支持Windows、Macintosh 和Unix 平台。
2. 获得文本语料和词汇语料
2.1 获取文本语料库
通过nltk.download()下载配套的数据,本文文本语料库包括以下:
- 古腾堡语料库(Gutenberg)
- NLTK 包含古腾堡项目(Project Gutenberg)电子文本档案的经过挑选的一小部分文本。该项目大约有25,000(现在是36,000 了)本免费电子图书。
- 网络和聊天文本
- NLTK 的网络文本小集合的内容包括Firefox 交流论坛,在纽约无意听到的对话,《加勒比海盗》的电影剧本,个人广告和葡萄酒的评论等
- 布朗语料库
- 布朗语料库是第一个百万词级的英语电子语料库的,由布朗大学于1961 年创建。这个语料库包含500 个不同来源的文本,按照文体分类,如:新闻、社论等。
- 路透社语料库
- 路透社语料库包含10,788 个新闻文档,共计130 万字。这些文档分成90 个主题,按照“训练”和“测试”分为两组。这样分割是为了训练和测试算法的,这种算法自动检测文档的主题。
- 就职演说语料库
- 就职演说语料库,实际上是55 个文本的集合,每个文本都是一个总统的演说。这个集合的一个有趣特性是它的时间维度
- 标注文本语料库
- 包含语言学标注,有词性标注、命名实体、句法结构、语义角色等。NLTK 中提供了很方便的方式来访问这些语料库中的几个,还有一个包含语料库和语料样本的数据包。
- 其他语言的语料库
NLTK 包含多国语言语料库。
文本语料库的结构:语料库结构最简单的一种没有任何结构,仅仅是一个文本集合。通常,文本会按照其可能对应的文体、来源、作者、语言等分类。有时,这些类别会重叠,尤其是在按主题分类的情况下,因为一个文本可能与多个主题相关。偶尔的,文本集有一个时间结构,新闻集合是最常见的例子。NLTK 语料库阅读器支持高效的访问大量语料库,并且能用于处理新的语料库。
表2-3 NLTK中定义的基本语料库函数
载入你自己的语料库:如果你有自己收集的文本文件,并且想使用前面讨论的方法访问它们,你可以很容易地
在NLTK 中的PlaintextCorpusReader 帮助下载入它们。
在NLTK 中的PlaintextCorpusReader 帮助下载入它们。
2.2 条件频率分布
条件频率分布是频率分布的集合,每个频率分布有一个不同的“条件”,这个条件通常是文本的类别。当语料文本被分为几类(文体、主题、作者等)时,我们可以计算每个类别独立的频率分布。这将允许我们研究类别之间的系统性差异。
条件频率分布是一个对许多NLP 任务都有用的数据结构。
表2-4 NLTK中条件概率分布: 定义、访问和可视化一个计数的条件概率分布的常用方法和习惯用法
2.3 词典资源
词典或者词典资源是一个词和/或短语以及一些相关信息的集合,例如:词性和词意定义等相关信息。词典资源附属于文本,通常在文本的帮助下创建和丰富。复杂的词典资源包括在词汇项内和跨词汇项的复杂的结构。
NLTK包括的词典资源:
- 词汇列表语料库
NLTK 包括一些仅仅包含词汇列表的语料库。词汇语料库是Unix 中的/usr/dict/words 文件,被一些拼写检查程序使用。我们可以用它来寻找文本语料中不寻常的或拼写错误的词汇。 - 还有一个停用词语料库,就是那些高频词汇,如:the,to,我们有时在进一步的处理之前想要将它们从文档中过滤。停用词通常几乎没有什么词汇内容,而它们的出现会使区分文本变困难。
- 发音的词典
- 一个稍微丰富的词典资源是一个表格(或电子表格),在每一行中含有一个词加一些性质。NLTK 中包括美国英语的CMU 发音词典,它是为语音合成器使用而设计的。
- 对每一个词,这个词典资源提供语音的代码——不同的声音不同的标签——叫做音素。
请看fire 有两个发音(美国英语中):单音节F AY1 R 和双音节F AY1 ER0。
- 比较词表
- 表格词典的另一个例子是比较词表。NLTK 中包含了所谓的斯瓦迪士核心词列表(Swadesh wordlists),几种语言中约200 个常用词的列表。
- 我们可以通过在entries()方法中指定一个语言链表来访问多语言中的同源词。
- 词汇工具:Toolbox
- 可能最流行的语言学家用来管理数据的工具是Toolbox,以前叫做Shoebox,因为它用满满的档案卡片占据了语言学家的旧鞋盒。一个Toolbox 文件由一个大量条目的集合组成,其中每个条目由一个或多个字段组成。大多数字段都是可选的或重复的,这意味着这个词汇资源不能作为一个表格或电子表格来处理。
- WordNet
- 是面向语义的英语词典,类似与传统辞典,但具有更丰富的结构。NLTK 中包括英语WordNet,共有155,287 个词和117,659 个同义词集合。
2.4 WordNet
WordNet的层次结构:WordNet 的同义词集对应于抽象的概念,它们并不总是有对应的英语词汇。这些概念在层次结构中相互联系在一起。一些概念也很一般,如实体、状态、事件;这些被称为独一无二的根同义词集。其他的,如:油老虎和有仓门式后背的汽车等就比较具体的多。图2-8 展示了一个概念层次的一小部分。
图2-8. WordNet 概念层次片段:每个节点对应一个同义词集;边表示上位词/下位词关系,即上级概念与从属概念的关系。
更多的词汇关系:上位词和下位词被称为词汇关系,因为它们是同义集之间的关系。这个关系定位上下为“是一个”层次。WordNet 网络另一个重要的漫游方式是从物品到它们的部件(部分)或到它们被包含其中的东西(整体)。例如:一棵树的部分是它的树干,树冠等;这些都是part_meronyms()。一棵树的实质是包括心材和边材组成的,即substance_meronyms()。树木的集合形成了一个森林,即member_holonyms()。
语义相似度:我们已经看到同义词集之间构成复杂的词汇关系网络。给定一个同义词集,我们可以遍历WordNet 网络来查找相关含义的同义词集。知道哪些词是语义相关的,对索引文本集合非常有用,当搜索一个一般性的用语——例如:车辆——时就可以匹配包含具体用语——例如豪华轿车——的文档。回想一下每个同义词集都有一个或多个上位词路径连接到一个根上位词。连接到同一个根的两个同义词集可能有一些共同的上位词。如果两个同义词集共用一个非常具体的上位词——在上位词层次结构中处于较低层的上位词——它们一定有密切的联系。
2.5 小结
文本语料库是一个大型结构化文本的集合。NLTK 包含了许多语料库,如:布朗语料库nltk.corpus.brown。
有些文本语料库是分类的,例如通过文体或者主题分类;有时候语料库的分类会相互重叠。
条件频率分布是一个频率分布的集合,每个分布都有一个不同的条件。它们可以用于通过给定内容或者文体对词的频率计数。
行数较多的Python 程序应该使用文本编辑器来输入,保存为.py 后缀的文件,并使用import 语句来访问。
Python 函数允许你将一段特定的代码块与一个名字联系起来,然后重用这些代码想用多少次就用多少次。
一些被称为“方法”的函数与一个对象联系在起来,我们使用对象名称跟一个点然后跟方法名称来调用它,就像:x.funct(y)或者word.isalpha()。
要想找到一些关于变量v 的信息,可以在Pyhon 交互式解释器中输入help(v)来阅读这一类对象的帮助条目。
WordNet 是一个面向语义的英语词典,由同义词的集合—或称为同义词集(synsets)—组成,并且组织成一个网络。
默认情况下有些函数是不能使用的,必须使用Python 的import 语句来访问。
文本语料库是一个大型结构化文本的集合。NLTK 包含了许多语料库,如:布朗语料库nltk.corpus.brown。
有些文本语料库是分类的,例如通过文体或者主题分类;有时候语料库的分类会相互重叠。
条件频率分布是一个频率分布的集合,每个分布都有一个不同的条件。它们可以用于通过给定内容或者文体对词的频率计数。
行数较多的Python 程序应该使用文本编辑器来输入,保存为.py 后缀的文件,并使用import 语句来访问。
Python 函数允许你将一段特定的代码块与一个名字联系起来,然后重用这些代码想用多少次就用多少次。
一些被称为“方法”的函数与一个对象联系在起来,我们使用对象名称跟一个点然后跟方法名称来调用它,就像:x.funct(y)或者word.isalpha()。
要想找到一些关于变量v 的信息,可以在Pyhon 交互式解释器中输入help(v)来阅读这一类对象的帮助条目。
WordNet 是一个面向语义的英语词典,由同义词的集合—或称为同义词集(synsets)—组成,并且组织成一个网络。
默认情况下有些函数是不能使用的,必须使用Python 的import 语句来访问。