《Python自然语言处理》学习笔记-第二章

来源:互联网 发布:洞主手工皂淘宝在哪 编辑:程序博客网 时间:2024/05/18 13:08

第二章:获得文本语料和词汇资源

2.1 获取文本语料库

古滕堡语料库
(1)首先加载nltk包。
(2)使用nltk.corpus.gutenberg.fileids方法能够获取古滕堡语料库中所有的文本标识符。
(3)使用nltk.corpus.gutenberg.words方法能够获取某个文本的所有单词的列表。
(4)若要使用第一章第一节的方法,必须先将数据转换成text对象,使用nltk.Text函数。
(5)为了方便,可以先导入gutenberg对象,再使用与其相关的方法。
(6)常见文本统计量:平均词长、平均句子长度、词汇多样性(每个词出现的平均次数)。
(7)使用raw方法能够获取文本中出现的字符总个数,包括词之间的空格。
(8)sents方法能够获取文本中所有的句子,其中每一个句子是一个词链表。

网络和聊天文本
(1)Python的nltk语料库中也包含了一些不正式的语言,如:①网络文本小集合webtext库;②即时消息聊天会话语料库nps_chat。

布朗语料库
(1)布朗语料库是第一个百万词级的英语电子语料库。
(2)我们可以使用words和sents方法将语料库作为词链表或者句子链表来访问。在使用words和sents方法的时候可以使用categories参数指定特定的类别或文件。
(3)categories方法用于查看布朗语料库中的文体类别。
(4)布朗语料库用于研究文体之间系统性差异,也叫做文体学的研究。
(5)可以使用频率分布对象FreqDist和条件频率分布对象ConditionalFreqDist来实现一些文本统计,如不同文体中的情态动词的用法。

路透社语料库
(1)路透社语料库中的文档分成了90个主题,按照‘训练’和‘测试’分成两组。
(2)路透社语料库的类别是相互重叠的,是因为新闻报道往往涉及多个主题。
(3)使用categories方法剋有获取文本列表的主题。
(4)使用fileids方法可以获取涵盖主题列表中任意主题的文本标识符。
(5)使用words方法可以获取文本列表或者是主题列表的所有单词,主题列表需要指定categories参数。

就职演讲语料库
(1)语料库实际上是55个文本的集合,每个文本都是一个总统的演说,且每个文本的年代都出现在它的文件名中。
(2)使用条件概率分布对象ConditionalFreqDist可以统计随年代变化演说用词的变化。
(3)书中举的例子,词汇america和citizen随时间推移的使用情况,其中的代码有个错误,就是在创建条件概率对象时,获取年代的参数file[:4]应改为fileid[:4]。

标注文本语料库
(1)许多文本语料库都包含语言学标注,有词性标注,命名实体,句法结构,语义角色等。

其它语言的的语料库
(1)NLTK包含多国语言语料库。某些情况下,使用这些语料库之前需要学习如何在Python中处理字符编码。

文本语料库的结构
(1)最简单的语料库结构是简单的文本集合。但是可以根据文本的文体、来源、作者、语言等属性对文本进行分类。
(2)NLTK语料库阅读器支持高效的访问大量语料库,并且能用于处理新的语料库。
(3)NLTK中定义了很多语料库函数。

载入自己的语料库
(1)在NLTK中,使用PlaintextCorpusReader对象来载入自己的语料库或者文本集合。


2.2 条件频率分布

定义
(1)条件频率分布是频率分布的集合,每个频率分布对应一个条件。nltk中使用ConditionalFreqDist对象来表示。

条件和事件
(1)条件频率分布需要给每个事件关联一个条件,因此处理的不是一个词序列,而是一个配对序列。
(2)也就是说,创建条件频率分布对象需要的是元组的列表,这个元组列表一般通过列表解析的方法来得到。

绘制分布图和分布表
(1)条件频率分布对象含有一个plot方法来给内部的数据绘图,也含有一个tabulate方法给内部数据绘制表格。通过图和表格更容易表现出数据间的关系。
(2)plot方法和tabulate方法都含有conditions参数和samples参数。conditions参数控制图和表格中条件的显示,而samples参数控制样本的显示。
(3)一个特别的地方就是,在创建条件频率分布对象时,传入的列表解析式可以不加方括号。

使用双连词生成随机文本
(1)从第一章我们可以学习到,使用bigrams函数能够获取由一个词链表构成的双连词链表。
(2)因为双连词链表是一个元组链表,所以我们可以用它来构造一个条件频率对象。这个对象表示的是以每个词为条件,统计它下一个词的频率分布。
(3)使用条件频率分布,我们就可以以某个词作为条件,找出它对应的频率分布中频率最大的词,把这个词当作是生成文本的下一个词。通过这样的方法我们就能够生成随机文本了。


2.3 更多关于python:代码重用

Python模块
(1)在一个文件中定义的变量和函数的集合称为python的一个模块。
(2)相关模块的集合称为一个包,而包的集合称为库。
(3)要注意的是文件命名最好不要重复,不然会被当前目录下的文件覆盖掉的。


2.4 词典资源

基本定义
(1)词典或者词典资源是一个词/短语以及一些相关信息(如词性和词意定义等)相关信息的集合。
(2)词典资源附属于文本,通常在文本的帮助下创建和丰富。
(3)一个词项包含词目(也叫做词条)以及其他附加信息(词性和词意定义)。
(4)如果两个词项拼写相同,也就是词条相同,但是附加信息不同,叫做同音异义词。

词汇列表语料库
(1)NLTK包含词汇语料库,需要导入nltk.corpus.words。
(2)使用词汇语料库可以实现文本过滤,过滤掉罕见或者具有拼写错误的词。
(3)NLTK也包含停用词语料库stopwords,停用词也就是那些特殊的高频词汇,如the,to等,可以通过停用词语料库将文本中的停用词过滤掉。
(4)NLTK也包含了名字语料库names。男性和女性的名字存储在单独的文件中,通过fileids可以获取相应的fileid。

发音词典
(1)NLTK中包含了美国英语的CMU发音词典cmudict,它是为语音合成器的使用而设计的。
(2)使用entries方法获取元组元素,元组中第一项为词,第二项为词的发音列表。
(3)对于每一个词,CMU发音词典提供词对应的语音代码,这些语音代码也叫做音素。
(4)CMU发音词典包含了一个词典数据结构,通过dict方法获得。使用这个词典数据结构我们可以使用[]操作符来获取相应词的发音代码。因为一个词可能对应多个发音代码,因此返回的值是列表的列表。当词典中没有某个词的发音代码时,可以通过赋值符号来添加。

词典资源备注
(1)我们可以用任何词典资源处理文本,如:过滤掉具有某些词典属性的词(如名词),或者是映射文本中每一个词。


2.5 WordNet

背景
(1)WordNet是面向语义的英语词典。
(2)NLTK库中包含了英语WordNet,里面共有155287个词以及117659个同义词集合。
(3)python中使用from nltk.corpus import wordnet as wn导入wordnet。

意义与同义词
(1)同义词(synonym):当两个词在句中相互替换后能保持句子含义不变的话,这两个词就是同义词。
(2)使用synsets方法可以获取某个词的所有同义词集合。因为一个词可能有多个意义,不同的意义对应不同的同义词集合,因此一个词可能含有多个同义词集合。
(3)使用synset方法获取某个同义词集合对象。这个对象包含很多方法用于描述该对象的一些属性。
(4)synset对象含有几个常用的方法:①definition方法,用于获取该同义词集合的定义描述;②examples方法,用于获取该同义词集合的例句。
(5)词条(lemma):同义词集中的词叫做词条。对于每一个同义词集对象都包含了很多方法来获取词条信息,例如:①lemmas方法获取所有词条,以列表形式返回;②lemma方法可以获取某个词条对象;③使用lemma对象的synset方法能够获取该词条所属的同义词集合;④使用lemma对象的name方法能够获取该词条的名字,也就是这个词的表达式。

WordNet的层次结构
(1)WordNet的同义词集对应于抽象概念,并不总是有对应的英语词汇,这些概念以层次结构的方式相互联系着。
(2)有一些同义词集对应的抽象概念是具有相当程度的一般性的,例如“实体“,”状态“,”事件“等概念对应的同义词集,它们涵盖的范围非常的广泛,这些同义词集被称为初始概念,或者叫做根同义词集(因为几乎所有的同义词集都能来源于这个同义词集)。
(3)通过这样的层次结构,WordNet能够非常方便地遍历相关的同义词集。
(4)下位词(hyponym):指概念上内涵更窄的主题词。也就是所指代的内容更加具体的同义词集。
(5)所有的synset对象都包含了一个hyponyms方法,用于获取在层次结构中与当前同义词集相关联的下一层的所有同义词集。这些同义词集指代的内容比当前的同义词集更加具体。
(6)上位词(hypernym):是指概念上外延更广的主题词。
(7)所有的synset对象都包含了一个hypernyms方法,用于获取层次结构中与当前同义词集相关联的上一层的所有同义词集。这些同义词集所涵盖的范围更广。
(8)synset对象包含了一个hypernym_paths方法,用户获取当前同义词集到根同义词集的所有路径。每一条路径以一个synset对象列表表示。
(9)synset对象也包含了一个root_hypernyms方法,用于获取当前同义词集的根同义词集。
(10)上位词,下位词更多的表现的是同义词集间的相互包含关系。

更多的词汇关系
(1)上位词和下位词是词汇关系的一种,表示的是同义词集间的关系。
(2)WordNet还能通过部件和整体的关系遍历相关的同义词集。
(3)synset对象包含了一个part_meronyms方法,用于获取在结构意义上构成当前同义词集的所有”部件“同义词集。
(4)synset对象也包含了一个substance_meronyms方法,用于获取在本质意义上构成当前同义词集的所有”材质“同义词集。
(5)synset对象包含了一个member_holonyms方法,用于获取组合意义上通过当前同义词集组成的”整体“同义词集。
(6)动词间具有蕴涵关系(entailment),相当于动作的拆解。
(7)synset对象包含一个entailments方法获取与动词的同义词集存在蕴涵关系的所有同义词集。
(8)除了同义词集外,词条lemma间也存在关系。获取词条的反义词使用lemma对象的antonyms方法,返回一个反义词列表。
(9)对于其它方法可以用dir函数来查看。

语义相似度
(1)语义相似度可以通过查找同义词集间的联系来实现。
(2)如果两个同义词集共用一个非常具体的上位词,而且这个上位词在层次结构中处于较低层的位置的话,那么我们说这两个同义词集一定有密切的联系。因为具有相同的上位词意味着它们从属于同一概念;而在层次结构中,层次越低,概念就越具体,所以这两个同义词集的定义就越相近。
(3)可以使用synset对象的lowest_common_hypernyms方法,把另一个对象作为参数传给这个方法就可以找出两个同义词集的最低共有上位词。
(4)可以使用synset对象的min_depth方法来测量对象一般性的程度,原理上其实在测量对象在层次结构所在的层次。
(5)使用synset对象的path_similarity方法可以测量两个同义词集间的路径长短,值得范围是0到1。路径越长,值越小;路径越短,值越大。当没有路径时返回-1,当于自身比较时返回1。

原创粉丝点击