1、高级大数据人才培养丛书张雪萍 主编 唐万梅 副主编 景雪琴 副主编 BIG DATA刘 鹏 张 燕 总主编Python程序设计9.1Python常用自然语言处理工具9.2文本处理9.3词法分析9.5实战:搜索引擎9.4语法分析of562习题第九章自然语言处理9.1 Python常用自然语言处理工具第九章 自然语言处理of3139.1.1 Python自然语言处理工具包NLTK自然语言处理工具包NLTK是NLP领域最常使用的一个Python库。NLTK是由美国宾夕法尼亚大学的Steven Bird和Edward Loper开发的。NLTK包括图形演示和示例数据,其提供了WordNet这种方便处理
2、词汇资源的接口,以及分类、分词、词干提取、标注、语法分析、语义推理等类库。NLTK网站:http:/www.nltk.org/。安装NLTK的命令:sudo pip install-U nltk。安装NumPy的命令(可选):sudo pip install-U numpy。安装测试的命令:python then type import nltk。9.1 Python常用自然语言处理工具第九章 自然语言处理of3149.1.2 Python中文处理工具jiebajieba是一个用Python实现的分词库,对中文有很强大的分词能力。jieba网站:https:/ install jieba。ji
3、eba的优点如下:(1)支持3种分词模式:精确模式。试图将句子最精确地切开,适合文本分析。全模式。把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义。搜索引擎模式。在精确模式的基础上,对长词再次切分,提高召回率,适用于搜索引擎分词。(2)支持自定义词典。9.1 Python常用自然语言处理工具第九章 自然语言处理of3159.1.3 Python语法解析器PLYPLY是Lex和Yacc的Python实现,包含了它们的大部分特性。PLY采用惯例优于配置(Convention Over Configuration,COC)的方式实现各种配置的组织,例如,强制词法单元的类型列表的名字
4、为tokens,强制描述词法单元的规则的变量名为t_TOKENNAME等。PLY使用简单,经过短时间学习就可以实现一个简单的语法规则和翻译规则程序。PLY对研究编译器原理很有价值。PLY网站:http:/ install ply。9.1Python常用自然语言处理工具9.2文本处理9.3词法分析9.5实战:搜索引擎9.4语法分析of566高级大数据人才培养丛书习题第九章自然语言处理9.2 文本处理第九章 自然语言处理of3179.2.1 文本获取当今主流的自然语言处理研究使用机器学习或统计模型技术。隐马尔可夫模型(Hidden Markov Model,HMM)的使用,以及越来越多的基于统计模
5、型的研究,使得系统拥有了更强的对未知输入的处理能力。那么,一个首要问题是,如何获取大量的数据?无论是统计模型还是机器学习,其准确率都建立在样本好坏的基础上,样本空间是否足够大,样本分布是否足够均匀,这些也都将影响算法的最终结果。1.获取语料库一种方法是在网络上寻找一些第三方提供的语料库,如比较有名的开放语料库wiki。但在很多实际情况中,所研究或开发的系统往往应用于某种特定的领域,这些开放语料库无法满足需求。这时就需要使用另一种方法用爬虫主动获取想要的信息(详见第7章)。网络信息丰富多彩,爬虫获取的网页内容格式多种多样,如HTML、XML、Word等。这些内容包含大量垃圾数据,如声音、动画、图
6、片、广告、Web标签等,这些数据直接影响后期文本处理。如何对这些噪声数据进行过滤,只保存单纯的文本格式,是Web信息处理需要深入研究的课题。9.2 文本处理第九章 自然语言处理of3189.2.1 文本获取2.文本语料库分类文本语料库分为4类5:最简单的孤立的文本集合;按照文本等标签分类组成结构,如布朗语料库;分类不严格、会重叠的语料库,如路透社语料库;随时间/语言用法改变的语料库,如就职演说库。3.语料库的用法 以布朗语料库为例。因为这个语料库是研究文本间系统性差异的资源,所以可以用来比较不同文本中情态动词的用法,示例如右上:如果想操作自己的语料库,并且使用之前的方法,那么,需要用Plain
7、textCorpus-Reader函数来载入它们。这个函数有2个参数,第1个是根目录,第2个是子文件(可以使用正则表达式进行匹配),示例如右下:9.2 文本处理第九章 自然语言处理of3199.2.2 文本表示文本的表示及其特征词的选取是自然语言处理的一个基本问题。它通过对从文本中抽取的特征词进行量化来表示文本信息,将它们从一个无结构的原始文本转化为结构化的、计算机可以识别处理的信息,即对文本进行科学抽象,建立它的数学模型,用以描述和代替文本。由于文本是非结构化的数据,要想从大量的文本中提取有用的信息就必须首先将文本转化为可处理的结构化形式。通常先对词汇进行分离,也就是采用分词技术,然后实现文
8、本向量化表示。例如,文本 可以用向量表示为 ,其中,为文本 的单个词项及文本特征。当前,文本表示模型主要有3种,分别为布尔模型、概率模型和向量空间模型。9.2 文本处理第九章 自然语言处理of31109.2.2 文本表示向量空间模型结构框架易于拓展,是目前最流行的文本结构化表示方法。Python自然语言处理模块中文本的表示方法就采用了向量空间模型。9.2 文本处理第九章 自然语言处理of31119.2.3 文本特征词提取文本特征词提取主要是指将文本中最能表征文本主题的词汇提取出来,对信息相关度较低的词汇进行过滤,从而用最少的词项表征文本最重要的信息内容,这样能高效地降低向量空间的维度,简化后续
9、的处理操作。文本特征词提取算法分别基于统计和基于语义进行。文本特征词提取的过程如图9-1所示。9.2 文本处理第九章 自然语言处理of31129.2.3 文本特征词提取1.基于统计的文本特征词提取算法基于统计的文本特征词提取算法主要采用评估函数对特征项进行打分,然后选取分值较高的特征项构成特征向量空间。目前常用的基于统计的文本特征词提取算法有以下3种:1)TF-IDF加权法TF-IDF加权是词频与反文档频率的乘积,是反文档频率对词频的权值加权。TF-IDF加权认为在一篇文本中出现频率高但在其他文本中出现频率低的词对于文本之间的区分很重要,最能表征文本的特点。计算如式(9-3)所示。TF-IDF
10、计算如式(9-4)所示。TF-IDF加权法计算简单,对文本特征词提取效果良好,是一种应用广泛的提取方法。9.2 文本处理第九章 自然语言处理of31139.2.3 文本特征词提取2)互信息互信息的主要思路是衡量词项与文本类别的关系。当词项在某类别中出现的频次比较高,但是在另一类别中出现的频次比较低时,说明该词项在出现频率较高的文本类别中互信息贡献大,则该词项最能表征文本的特征性。互信息计算的是词项出现在某一类别中的文本个数与它出现在整个文本集中的文本个数之比。特征项 的互信息的计算如下:3)信息增益信息增益表征特征项对文本类别的影响程度,主要考量特征项出现之前与出现之后的信息熵的相差额度。假设
11、S为文本集合,D为文本集合中所有类别的集合,d为集合D 中的元素,表示文本集合的某一类别,那么对于特征项 f,其信息增益计算方法如下:9.2 文本处理第九章 自然语言处理of31149.2.3 文本特征词提取2.基于语义的文本特征词提取算法常用的基于语义的文本特征词提取算法可分为以下两种。1)基于本体论的文本特征词提取基于本体论的文本特征词提取方法主要通过构建词语网络结构,获取计算特征权值的公式,然后根据计算公式得到文本的主题特征项。该方法充分考虑了特征项所在的文档位置和特征项之间的关系。2)基于知网概念的文本特征词提取基于知网概念的文本特征词提取方法主要利用同义词和近义词匹配构成知识网络。通
12、过知网概念对文档进行部分语义分析,然后合并同义词,并对词语进行聚类,从而得到文本特征项。基于语义的文本特征词提取方法能够有效地降低特征向量的维度,与基于统计的文本特征词提取方法不同,其不仅可以有效地去除噪声或无用信息,还能充分考虑词项之间的语义关联性,解决同义词和多义词的问题。Jieba内置TF-IDF加权法和TextRank算法两种关键词(jieba中的文本特征词称为关键词)提取方法,使用时直接调用即可,见右上。因提取关键词的前提是分词(见9.3节),P:265-267的示例代码使用了jieba自带的前缀词典和IDF权重词典。9.1Python常用自然语言处理工具9.2文本处理9.3词法分析
13、9.5实战:搜索引擎9.4语法分析of5615高级大数据人才培养丛书习题第九章自然语言处理9.3 词法分析第九章 自然语言处理of31169.3.1 分词9.3.1 分词词是最小的能够独立活动的有意义的语言成分。分词的主要任务是将文本中连续的字符序列转换成分隔正确的单词序列。简单的英文分词不需要任何工具,通过空格和标点符号就可以完成。中文分词和复杂的英文分词需要使用现有的工具。由于英文和中文在文化上存在巨大的差异,因此,Python处理英文和中文需要使用不同的模块。对于中文分词,推荐用jieba,而英文分词则推荐使用NLTK。1.NLTK分词NLTK中的分词是句子级,因此要先分句,再逐句分词,
14、否则效果不好。1)分句(Sentences Segment)假如有一段文本,希望把它分成一个一个的句子,此时可以使用NLTK中的punkt 句子分割器,示例代码及输出结果如右上:9.3 词法分析第九章 自然语言处理of31179.3.1 分词1.NLTK分词2)分词(Tokenize Sentences)接下来要把每句话再切割成逐个单词。最简单的方法是使用NLTK中的WordPunct Tokenizer,示例代码如右下:除了WordPunctTokenizer,NLTK还提供了另外3个分词方法,TreebankWordTokenizer、PunktWordTokenizer和Whitespa
15、ceTokenizer,而且它们的用法与WordPunctTokenizer类似。对于比较复杂的词型,WordPunctTokenizer往往并不胜任,我们需要借助正则表达式的强大功能 来 完 成 分 词 任 务,此 时 可 使 用 函 数regexp_tokenize()。9.3 词法分析第九章 自然语言处理of31189.3.1 分词1.NLTK分词2)分词(Tokenize Sentences)使用NLTK进行分词时一般可配合使用函数,对文本按照句子进行分割时使用nltk.sent_tokenize(text);对句子进 行 分 词 时 使 用 n l t k.w o r d _ tok
16、enize(sent)。9.3 词法分析第九章 自然语言处理of31199.3.1 分词2.jieba分词jieba提供了如下3种分词模式:(1)精确模式:cut_all=True,试图将句子最精确地切开。(2)全模式:cut_all=False,把句子中所有可以成词的词语都扫描出来。(3)搜索引擎模式:jieba.cut_for_search(),在精确模式的基础上,对长词再次切分。例如,使用jieba.cut()函数并传入待分词的文本字符串,使用cut_all参数控制选择使用全模式还是精确模式,默认为精确模式。如果需 要 使 用 搜 索 引 擎 模 式,使 用jieba.cut_for_s
17、earch()函数即可。运行以下代码之后,jieba首先会加载自带的前缀词典,然后完成相应的分词任务。9.3 词法分析第九章 自然语言处理of31209.3.2 词性标注词性标注又称词类标注或简称为标注,是指为分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词或其他词性的过程。词性也称为词类或词汇范畴。用于特定任务的标记的集合称为一个标记集。词性标注是文本处理的基础,通过词性标注,任一单词都能被归入至少一类词汇集(set of lexical)或词性条目(part-of-speech categories)中,如名词、动词、形容词和冠词等。词性标签用符号来代表词汇
18、条目NN(名词)、VB(动词)、JJ(形容词)和AT(冠词)。Brown Corpus 是最悠久,也是最常用的标记集之一。1.NLTK词性标注NLTK进行词性标注时用到的函数是nltk.pos_tag(tokens),其中,tokens是句子分词后的结果,同样是句子级的标注。例如:9.3 词法分析第九章 自然语言处理of31219.3.2 词性标注2.jieba 词性标注 jieba在进行中文分词的同时,还可以完成词性标注任务。它根据分词结果中每个词的词性,可以初步实现命名实体识别,即将标注为nr的词视为人名,将标注为ns的词视为地名等。所有标点符号都会被标注为x,所以可以根据这个去除分词结果
19、中的标点符号。例如:在汉语中,词性标注比较简单,因为汉语词汇词性多变的情况比较少见,大多词语只有一个词性,或者出现频次最高的词性远远高于第二位的词性。据统计,只须选取最高频词性,即可实现准确率为80%的中文词性标注程序。利用HMM即可实现更高准确率的词性标注。9.3 词法分析第九章 自然语言处理of31229.3.3 命名实体识别命名实体识别又称“专名识别”,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。命名实体识别的任务是识别句子中的人名、地名和机构名等命名实体。每一个命名实体都是由一个或多个词语构成的。命名实体识别包括两个步骤:实体边界识别;确定实体类别(人名、
20、地名、机构名或其他)。命名实体识别是信息提取、问答系统、句法分析、机器翻译、面向Semantic Web的元数据标注等应用领域的重要基础工具,主要有如下三种方法:(1)基于规则和词典的方法。该方法需要专家制订规则,准确率较高,但依赖于特征领域,可移植性差。(2)基于统计的方法。其主要采用HMM、MEMM、CRF,难点在于特征的选择。该方法能获得好的健壮性和灵活性,不需要太多的人工干预,没有太多领域限制,但需要大量的标记集。(3)混合方法。其指将规则与统计相结合、多种统计方法相结合等,是目前主流的方法。NLTK进行命名实体识别的函数是nltk.ne_chunk(tags),其中,tags是句子词
21、性标注后的结果,同样是句子级的。例如:9.3 词法分析第九章 自然语言处理of31239.3.4 去停用词有些文本中存在很多出现频率高但是实际意义不大的词,如“他”“了”“it”“you”等,称之为停用词。去停用词的主要思想是分词过后,遍历一下停用词表,去掉停用词。删除停用词会提高文本特征分析的效果和效率。1.NLTK去停用词NLTK提供了一份英文停用词数据,总计179个停用词。9.3 词法分析第九章 自然语言处理of31249.3.4 去停用词1.NLTK去停用词例如:对英文句子进行分词分词之后去除停用词:以右上可以看出,停用词被过滤了,但标点符号还在,为此,我们首先定义一个标点符号列表,然
22、后过滤这些标点符号。9.3 词法分析第九章 自然语言处理of31259.3.4 去停用词1.2.jieba去停用词例如:jieba_text_output.txt文件的内容如下:李小福/是/创新办/主任/也/是/云计算/方面/的/专家/;/什么/是/八一双鹿/,/例如/我/输入/一个/带/“/韩玉赏鉴/”/的/标题/,/在/自定义词/库中/也/增加/了/此/词为/N/类/,/正确/应该/不会/被/切开/。/mac/上/可/分出/石墨/烯/;/此时/又/可以/分出/来/凯特琳/了/。/源文件jieba_text.txt的内容如下:李小福是创新办主任也是云计算方面的专家;什么是八一双鹿,例如我输入
23、一个带“韩玉赏鉴”的标题,在自定义词库中也增加了此词为N类,台中正确应该不会被切开。mac上可分出石墨烯;此时又可以分出来凯特琳了。9.3 词法分析第九章 自然语言处理of31269.3.5 中文分词实战使用jieba进行中文分词的实战代码详见P:275-277源字符串如下:jieba在进行中文分词的同时,还可以完成词性标注任务。根据分词结果中每个词的词性,可以初步实现命名实体识别,即将标注为nr的词视为人名,将标注为ns的词视为地名等。所有标点符号都会被标注为x,所以可以根据这个去除分词结果中的标点符号。停用词(部分)如下:部分输出结果如下:9.1Python常用自然语言处理工具9.2文本处
24、理9.3词法分析9.5实战:搜索引擎9.4语法分析of5627高级大数据人才培养丛书习题第九章自然语言处理9.4 语法分析第九章 自然语言处理of31289.4.1 语法分析简介语法分析是将单词之间的线性次序变换成一个显示单词如何与其他单词相关联的结构,以确定语句是否合乎语法,即语法分析是通过语法树或其他算法来分析主语、谓语、宾语、定语、状语、补语等句子元素。语法分析有两个主要内容,其一是句子语法在计算机中的表达与存储方法,以及语料数据集;其二是语法分析的算法。9.4 语法分析第九章 自然语言处理of31299.4.2 语法树我们可以用树状结构图来表示句子的语法树,如图9-2所示。其中,S表示
25、句子;NP、VP、PP分别表示名词、动词和介词短语(短语级别);N、V、P分别表示名词、动词、介词。实际存储时图9-2的语法树可以表示为(S(NP(N Boeing)(VP(V is)(VP(V located)(PP(P in)(NP(N Seattle)。互联网上已经有成熟的、手工标注的语料数据集,如Penn Tr e e b a n k I I C o n s t i t u e n t Ta g s(http:/www.surdeanu.info/mihai/teaching/i s t a 5 5 5-f a l l 1 3/r e a d i n g s/PennTreebankC
26、onstituents.html)。9.4 语法分析第九章 自然语言处理of31309.4.3 语法分析算法1.上下文无关语法上下文无关语法(Context-Free Grammer,CFG):为了生成句子的语法树,我们可以定义如下一套上下文无关语法。(1)N表示一组非叶子节点的标注,如S、NP、VP、N。(2)表示一组叶子结点的标注,如boeing、is。(3)R表示一组规则,每条规则都可以表示为X-Y1Y2Yn、XN、Yi(N)。(4)S表示语法树开始的标注。举例来说,语法的一个语法子集可以用图9-3来表示。当给定一个句子时,我们便可以按照从左到右的顺序来解析语法。例如,句子the man
27、 sleeps就可以表示为(S(NP(DT the)(NN man)(VP sleeps)。9.4 语法分析第九章 自然语言处理of31319.4.3 语法分析算法1.上下文无关语法上述这种上下文无关语法可以很容易地推导出一个句子的语法结构,但其缺点是推导出的结构可能存在二义性。例如,图9-4和图9-5中的语法树都可以表示同一个句子。常见的二义性问题有:单词的不同词性,如can一般表示“可以”这个情态动词,有时则表示罐子;介词短语的作用范围,如VP PP PP这样的结构,第二个介词短语可能形容VP,也可能形容第一个PP;连续的名字,如NN NN NN。9.4 语法分析第九章 自然语言处理of3
28、1329.4.3 语法分析算法1.上下文无关语法1)自定义文法示例代码如下:2)开发文法下面程序展示了如何利用简单的过滤器来寻找带句子补语的动词。9.4 语法分析第九章 自然语言处理of31339.4.3 语法分析算法2.概率分布的上下文无关语法由于语法的解析存在二义性,就需要找到一种方法从多种可能的语法树中找出最可能的一棵树。一种常见的方法是概率分布的上下文无关语法(Probabilistic Context-Free Grammar,PCFG)。如图9-6所示,除了常规的语法规则,我们还对每一条规则赋予了一个概率。对于每一棵生成的语法树,我们将其中所有规则的概率的乘积作为这棵语法树的出现概
29、率。综上所述,当我们获得多棵语法树时,可以分别计算每棵语法树的概率p(t),出现概率最大的那棵语法树就是我们希望得到的结果。9.4 语法分析第九章 自然语言处理of31349.4.4 语法分析实例下面是一个四则运算的语法结构用PLY实现四则运算的语法分析:9.4 语法分析第九章 自然语言处理of31359.4.4 语法分析实例与词法分析一样,语法分析的命名方式也是固定的,即p_成分名_动作。函数一开始必须是一个声明字符串,格式是“成分名:成分名成分名”。其中,成分名可以是词法分析中的ID,如PLUS、NUMBER等。冒号右边的是这个函数结果的成分名。语法分析通过组合各个ID得到结构化的结果。成
30、分相同的结构可以合并,如同时定义加法和减法:从上面例子可以看到,增加的一种结构用“|”换行分隔。注意这个字符串的格式是固定的,不过PLUS和MINUS的顺序没有规定,哪个在上面都可以。9.1Python常用自然语言处理工具9.2文本处理9.3词法分析9.5实战:搜索引擎9.4语法分析of5636高级大数据人才培养习题第九章自然语言处理9.5 实战:搜索引擎第九章 自然语言处理of3137搜索引擎是“对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集、信息整理和用户查询三部分”。图9-7是搜索引擎的一般结构,首先信息搜集模块将网络信息采集到网络信息库中(一般使用爬虫);然后信息整理
31、模块对采集的信息进行分词、去停用词、赋权重等操作后建立索引表(一般是倒排索引)构成索引库;最后用户查询模块就可以识别用户的检索需求并提供检索服务。搜索引擎可以用Nutch等工具来配置,也可以自己写代码实现。本节作为一个Python学习案例,我们用Python代码来实现一个简单的中文搜索引擎。搜其索范围限定在某个新闻网站内部。另外,需要安装jieba和BeautifulSoup库。9.5 实战:搜索引擎第九章 自然语言处理of31381.问题分析从图9-7可知,一个完整的搜索引擎结构从互联网搜集信息开始,要达成目标,主要有如下4个步骤:(1)爬取网站,得到所有网页链接。(2)得到网页的源代码,解
32、析剥离出想要的内容。(3)把内容做成词条索引,保存起来。(4)搜索时,根据搜索词在词条索引里查询,按顺序返回相关的搜索结果。2.爬虫设计我们主要搜集以下内容:目标网页的标题、目标网页的主要文字内容、目标网页指向其他页面的URL地址。爬虫使用BFS算法,用到的数据结构为队列(deque)和集合(set)。队列存储当前准备访问的URL,集合存储所有走过的URL。代码如右:9.5 实战:搜索引擎第九章 自然语言处理of31393.正则表达式正则表达式可以检测一个字符串是不是符合某个格式,或者把一个字符串里特定格式的部分提取出来。正则表达式用于匹配HTML代码中的特定内容。正则表达式的python代码
33、如下。4.sqlite sqlite是Python和数据库的基础知识,其Python代码如右。9.5 实战:搜索引擎第九章 自然语言处理of31405.建立词表数据库爬取的网站为。前述4个步骤中的步骤13存储在search_ engine_build.py中。建立两个table,一个是doc表,用于存储网页链接;另一个是word表,即倒排表,用于存储词语和其对应的doc序号的列表。如果一个词在某个网页里出现多次,那么列表里这个网页的序号也出现多次。列表转换成一个字符串存进数据库。例如,某个词出现在1号、2号、3号doc中,它的列表应为1,2,3,转换成字符串“1 2 3”存储在数据库中。相关代
34、码详见P:284-288。代码运行一次后,搜索引擎所需的数据库就建好了。运行结果如右:数据库数据结果如图:9.5 实战:搜索引擎第九章 自然语言处理of31416.执行搜索需要搜索时,执行search_engine_use.py即可,相关代码详见P:288-290。运行结果如下:9.1Python常用自然语言处理工具9.2文本处理9.3词法分析9.5实战:搜索引擎9.4语法分析of5642高级大数据人才培养习题第九章自然语言处理习题:1简述自然语言处理的定义及意义。2简述文本表示的3种模型并比较其优缺点。3简述文本的提取过程及文本特征词提取的方法。4简述分词的定义及分词的作用和意义。5简述词性标注的定义及意义。6简述命名实体识别的定义及作用。7什么叫停用词?为何要去停用词?8简述语法分析及其功能。9简述上下文无关语法和概率分布的上下文无关语法。感谢聆听