作者:(印)雅兰·萨纳卡(Jalaj Thanaki),张金超,刘舒曼(译)
出版社:机械工业出版社
格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT
Python自然语言处理试读:
前言
本书的名字会给你带来广阔的联想。作为读者,你会从头学习关于自然语言处理的方方面面。本书用了非常简单的语言来具体阐述NLP中的概念,许多真实有趣的实用样例会加深你对该领域的理解。通过实现这些样例,能提升你的NLP技能。
现在,我来回答一些经常会被问起的NLP领域的问题。这些问题启发了我来写这样一本书。对我来说,让所有读者能够理解我写这本书的初衷,是一件非常重要的事情。
第一个经常被问起的问题是:什么是自然语言处理?第二个是:为什么在开发自然语言处理程序时主要会用Python呢?最后一个重要的问题是:在学习自然语言处理的时候,有哪些资源可用?现在,让我们来看一下答案!
第一个问题的答案是,自然语言,简单来说,就是你所说的、写的、读的或理解的人类自然的语言,同时是交流的媒介。我们使用计算机算法、数学概念、统计技术来处理这些语言,使得机器能够像人一样理解。
现在来回答第二个问题。最简单和直接的原因是Python有大量的库,这些库在你开发自然语言处理应用程序的时候,会让事情变得简单。第二个原因是,如果你有C或是C++的编程经验,你不用再担心会遇到内存泄漏的问题。Python的解释器会为你解决这个问题,你要做的仅仅是关注主要的编程过程。除此之外,Python是一个程序员友好的语言,与其他面向对象的语言比起来,你只需要写少量的代码就可以做更多的事情。因此,所有的这些事实都驱动着人们使用Python来开发自然语言处理应用程序以及其他数据科学相关的应用,以进行更快的建模。
最后一个问题对我来说很重要,因为我经常向朋友解释上面的答案,他们听完后会想学Python,但是有哪些可用的资源呢?我通常会推荐一些书籍、博客、YouTube上的视频,还有Udacity、Coursera等教育平台。但是几天以后,他们还会来问我有没有一个单一的学习资源——书籍或博客。不幸的是,答案是否定的。在那个时刻,我意识到兼顾所有这些资源对他们来说是比较困难的事情。这种痛苦的领悟成了我写作这本书的动力。
所以在这本书里,我尝试着覆盖大多数自然语言处理中的必要知识,这些对每个人来说都是有用的。一个好消息是我提供了很多实用的Python样例,这样读者便既能从理论角度,也能从应用角度出发理解这些概念。阅读、理解、编码是这本书的三个主要部分,会帮助读者轻松学习。
本书内容
第1章提供了对自然语言处理和自然语言处理领域其他分支的介绍。我们会看到构建自然语言处理应用程序的各个阶段,并讨论nltk安装的问题。
第2章展示了语料分析的各个方面。我们将会看到不同类型的语料和语料中展现的数据属性,会接触到各种语料格式,像CSV、JSON、XML、LibSVM等。还会看到关于网页爬取的样例。
第3章会帮助你理解自然语言里面最基本的东西,也就是语言学。我们会看到词法分析、句法分析、语义分析、消歧等诸多概念。也会使用nltk来实际地理解这些概念。
第4章会帮助你弄懂各种不同类型的预处理技术以及该怎样定制它们。我们将会看到预处理的各个阶段,像数据准备、数据处理、数据转换。除了这些,你还会从实际应用的角度来理解预处理。
第5章是自然语言处理应用程序里最核心的部分。我们会看到不同的算法和工具是怎样用于生成机器学习算法的输入的,它们会被用来开发自然语言处理应用程序。我们也会理解特征工程里的统计概念,然后会对这些工具和算法进行定制化开发。
第6章会让你理解处理语义问题时遇到的自然语言处理概念。我们会看到word2vec、doc2vec、GloVe等,以及从《权力的游戏》数据集中获得向量的一些word2vec的实际应用。
第7章会给出很多构建一个规则式系统的细节,以及开发类似自然语言处理系统时,需要牢记的方方面面。我们会看到制定规则的过程和编码规则的过程,也会看到怎样开发一个基于模板的聊天机器人。
第8章会提供给你一些新的机器学习技术。我们会看到用于开发自然语言处理应用程序的各种机器学习算法,也会使用机器学习方法实现一些强大的自然语言处理应用程序。
第9章会介绍人工智能的很多方面。我们将会看到人工神经网络的基本概念,以及如何才能构建一个人工神经网络。我们将会理解深度学习的核心,研究深度学习的数学原理,并看一下深度学习是怎样用来做自然语言理解和自然语言生成的。你可以在这里看到很多有意思的实践样例。
第10章会简单介绍一些框架,像Apache Hadoop、Apache Spark和Apache Flink。
第11章会介绍怎样提高NLP技能。
第12章会介绍针对必要程序的安装指导。
预备知识
下面来说一下阅读这本书的预备知识。不用紧张,这里不涉及数学或统计学知识,仅仅是Python的基本编程语法。除了这些之外,你需要在计算机上安装Python 2.7.X或Python 3.5.X。推荐你使用任意的Linux系统。
Python的一些依赖列表可以在如下链接找到:https://github.com/jalajthanaki/NLPython/blob/master/pip-requirements.txt.
现在来看一下所需的硬件条件。有4GB内存和双核CPU的电脑足够执行普通代码,但是对于机器学习和深度学习样例,你可能需要更多的内存(8GB或16GB)和GPU计算资源。
本书的读者对象
本书面向想应用NLP技术来使他们的应用程序更智能的Python开发者,可作为入门NLP领域的资料。
下载样例源码
本书的代码在GitHub网站上可找到:https://github.com/PacktPublishing/Python-Natural-Language-Processing。另外还有一些拓展资源和视频可以在如下地址找到:https://github.com/PacktPublishing/。
另外,读者还可在华章公司官网http://www.hzbook.com/上搜索本书,下载源代码。
代码文件下载完以后,确保你的解压工具是可用的:
●WinRAR/7-Zip在Windows系统下
●Zipeg/iZip/UnRar在Mac系统下
●7-Zip/PeaZip在Linux系统下第1象引言
本章简要介绍自然语言处理(Natural Language Processing,NLP)任务及其相关概念在实际人工智能应用中的使用。我们将重点关注用于开发NLP应用的Python编程范式,并在之后为读者提供一个提示。如果你有兴趣了解NLP的各种编程范式的比较,以及为什么Python是最好的编程范式,那么应该阅读本书的前言。作为专业人士,我曾尝试过大部分的NLP编程范式,也使用Java、R和Python编写过NLP应用。因此相信我,在开发NLP应用程序时,Python相当简单和高效。
本章将涵盖如下内容:
●自然语言处理
●基础应用
●高级应用
●NLP和Python相结合的优势
●nltk环境搭建
●读者提示1.1 自然语言处理
在近几年中,人工智能(AI)的分支科学引起了很多轰动,包括数据科学、数据分析、预测性分析、NLP等。
正如本书前言中提到的,我们关注的是Python和自然语言处理。考虑以下几个问题——你真的知道什么是自然语言吗?什么是自然语言处理?使用自然语言处理中的各种概念构建专家系统还涉及哪些分支科学?如何使用自然语言处理概念构建智能系统?
什么是自然语言?
●人类通过语言表达自身的想法或感受。
●人类听、说、读或写的内容几乎都以自然语言的形式呈现和表达。
●如:
■本书的内容是自然语言;
■日常生活中听、说和写的内容都以自然语言的形式存在;
■电影对白是自然语言;
■WhatsApp聊天也是自然语言的一种表现形式。
什么是自然语言处理(NLP)?
●NLP是AI的分支科学。举一个例子,假设你要制造一台使用自然语言和人交互的机器,这种智能系统需要使用计算技术和计算语言学理论来构建,系统像人类一样处理自然语言。
●可以将上述的NLP概念和来自世界顶级科技公司的NLP产品关联起来,比如谷歌的谷歌语音助手、苹果的Siri等。
●NLP的定义如下:
■自然语言处理使用计算技术和(或)计算语言学处理人类自然语言;
■自然语言处理是计算机科学、人工智能和计算语言学的相关领域,它涉及计算机和人类自然语言的交互;
■自然语言处理可定义为对人类自然语言的自动(或半自动)处理。
图1.1展示了使用各种NLP概念构造专家系统时涉及的其他分支科学。图1.1 自然语言处理相关概念
图1.2和1.3给出了图1.1中的各个分支科学涉及的全部子主题。图1.2 NLP概念相关的子分支(一)图1.3 NLP概念相关的子分支(二)
如何基于自然语言处理概念构造智能系统?图1.4展示了构建一个自然语言处理专家系统的基本开发生命周期。
现在,来解释自然语言处理系统生命周期中的一些细节:
1)要解决一个NLP问题,首先要理解问题陈述。
2)调研解决问题所需的数据或语料库。数据收集是解决问题的基本。
3)分析数据。语料的质量和数量怎样?根据数据质量和问题陈述进行数据预处理。
4)特征工程处理。特征工程是NLP和数据科学相关应用中重要的部分。我们将在第5章和第6章中讨论特征工程的更多细节。
5)决定使用哪种计算技术来解决问题,比如是采用机器学习方法还是基于规则的方法?
6)根据你所选用的技术准备好用作算法输入的特征文件。
7)执行流程,并生成输出。图1.4 开发生命周期
8)测试并评估系统的输出。
9)优化调参,不断持续这一过程直到你得到一个满意的结果。
这一章将快速地介绍大量内容,如果你觉得有些内容当前看来并没有太大意义,请暂时忍耐。我们将从下一章开始探索所有细节和例子,本章会帮助你建立起它们之间的联系。1.2 基础应用
NLP是AI的子分支。NLP的相关概念可以用于以下的专家系统中:
●语音识别系统
●问答系统
●机器翻译
●文本摘要
●情感分析
●基于模板的聊天机器人
●文本分类
●主题分割
将在接下来的几章学习绝大多数用于上述应用的NLP概念。1.3 高级应用
高级应用包括下列例子:
●理解自然语言指令并通过自然语言同人类交互的类人机器人。
●构建一个通用机器翻译系统是NLP领域的长期目标之一。因为你可以轻松地构建两个特定语种之间的机器翻译系统,但这个系统并不能用来翻译这两个语种之外的其他语言。在深度学习的帮助下,我们可以构建一个通用的机器翻译系统,谷歌最近声称已经非常接近这一目标了。在第9章中,我们将尝试使用深度学习方法构建机器翻译系统。
●为指定文档生成逻辑标题的NLP系统是高级应用之一。在深度学习的帮助下,我们可以为文档生成标题和摘要。第9章也会介绍此类应用。
●为某个主题或图像生成文本是一种高级NLP应用。
●为人类生成个性化文本并忽略手写错误的高级机器人也是我们努力的目标之一。
图1.5展现了更多的NLP应用。图1.5 NLP领域相关应用1.4 NLP和Python相结合的优势
下面的几个因素决定了Python是构建自然语言处理专家系统的最佳选择之一:
●使用Python为基于NLP的专家系统开发原型相当快速和便捷。
●有大量的开源NLP库可供Python程序员使用。
●社区支持非常强力。
●易于使用,对初学者而言不复杂。
●快速开发:测试和评估都很简单。
●许多新框架,如Apache Spark、Apache Flink、TensorFlow等,都提供Python接口。
●相比其他编程范式,使用Python构建的基于NLP的系统的最优化更为简单。1.5 nltk环境搭建
建议本书的所有读者都从GitHub上获取NLPython项目的分支,项目地址是https://github.com/jalajthanaki/NLPython。
本书使用Linux(Ubuntu)作为操作系统。如果对Linux不太熟悉,最好试着习惯使用它,因为大部分的高级框架,如Apache Hadoop、Apache Spark、Apache Flink、Google TensorFlow等,都需要Linux系统环境。
GitHub项目中包含了如何安装Linux,以及本书将要用到的基础Linux命令的教学。如果你对Git不太了解,同样可以在项目中找到基础的GitHub操作命令,链接是https://github.com/jalajthanaki/NLPython/tree/master/ch1/documentation。
本章所需环境的安装指南见地址https://github.com/jalajthanaki/NLPython/tree/master/ch1/installation_guide。
安装nltk的步骤如下(也可以参考链接https://github.com/jalajthanaki/NLPython/blob/master/ch1/installation_guide/NLTK%2BSetup.md):
1)手动安装Python2.7.x。在Linux Ubuntu14.04系统下,Python已经被预安装好了。你可以使用python-v命令检查Python版本。
2)配置pip来安装Python库(https://github.com/jalajthanaki/NLPython/blob/master/ch1/installation_guide/NLTK%2BSetup.md)。
3)打开终端,执行下面的命令:
4)打开终端,执行python命令。
5)在Python脚本中,执行import nltk指令。
如果nltk模块已经成功安装,执行这条指令将不会抛出任何异常。
6)在Python脚本中,执行nltk.download()指令。
7)这将打开一个新的对话框,你可以在对话框中指定要下载的库。在本例中,点击All packages,并选择这些库的存放路径,等待下载完成。这一过程可能会花费很长时间,下载完成后,你可以在存放路径下看到一个叫作nltk_data的文件夹。图1.6所示的截屏展示了nltk下载器的对话框。图1.6 nltk下载器
GitHub项目包含了安装指南、代码和wiki页面等。如果读者有任何问题,可以把它们发在Gitter小组上。Gitter小组的网址是https://gitter.im/NLPython/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link。1.6 读者提示
本书是一本实用指南。作为专业人士,我强烈建议读者复现GitHub上的代码,并完成书中的练习,这有助于理解NLP概念。不经练习而想彻底了解NLP几乎是不可能的,我保证这些代码很有趣。
接下来的章节内容如下:
●NLP概念解释
●相关应用
●NLP概念的必要性
●实现概念的可行方法(代码都在GitHub上)
●面临的挑战
●克服挑战的方法
●练习1.7 总结
本章介绍了自然语言处理相关的分支科学,构建一个自然语言处理专家系统的各个阶段,以及nltk环境的搭建。所有的安装指南和代码都可以在GitHub上获取。
在下一章中,我们将了解NLP相关应用所使用的语料以及分析语料的方法,并对不同种类的文件格式和数据集进行处理。第2象实践理解语料库和数据集
本章将探索自然语言处理的第一个部分,涵盖以下内容:
●语料库
●语料库的作用
●语料分析
●数据属性的类型
●不同文件格式的语料
●免费语料库资源
●为NLP应用准备数据集
●开发网页爬虫应用程序2.1 语料库
自然语言处理相关的应用是使用大量的数据进行构建的,可以称大规模的数据为语料库(corpus)。从更正式和更技术性的角度,语料库定义如下:
语料库是存储在计算机上,用于研究语言是如何使用的书面或口头的自然语言材料集合。更准确地说,语料库是用于语言分析和语料分析的系统化和计算机化的真实语言集合。
为了开发NLP应用,我们需要书面或口头的自然语言材料作为语料库。这些材料或数据被用作输入并帮助我们开发NLP应用。有时NLP应用使用单语料库作为输入,但有时它们也会使用多语料库。
使用语料库开发NLP应用的原因很多,下面列举了其中的一部分原因:
●我们可以通过语料库进行一些统计分析,如频率分布、词语的共现关系等。本章会介绍对于语料的一些基本统计分析。
●我们可以为各类NLP应用定义和验证语言学规则。如果你正准备构建一个语法纠错系统,你可以使用文本语料库并从中找出语法错误的实例,并定义用于纠正这些实例的语法规则。
●我们可以根据语言的使用方法定义一些特定的语言规则。借助基于规则的系统,你可以定义语言规则并通过语料库验证它们。
在语料库中,大规模的数据可能以如下的格式呈现:
●文本数据,即书面材料
●语音数据,即口语材料
首先,我们需要了解文本数据以及获取文本数据的方法。文本数据以书面信息的集合呈现。很多资源,如新闻文章、书籍、数字图书馆、电子邮件、网页、个人博客等,都可以用来获取书面信息。我们生活在一个数字化的世界里,因此文本信息的数量正快速增长,我们可以使用上述的所有资源获取文本数据,并建立自己的语料库。例如,如果你想要构建一个用来总结新闻文章的系统,你需要获取网络上出现的各类新闻文章,然后构建一个新闻文章的集合,这就是你的文本数据集。你可以使用网络爬虫从原始HTML页面中获取数据。在这一章里,我们会学习开发一个爬虫。
现在,再来看语音数据。一个语音数据库通常包含两部分:音频文件以及对应的文本。一般来说,我们可以从录音中获取语音数据,它们可能包含人们的交谈内容。比如在印度,当你给银行客户服务部门打电话时,如果稍作留心,你会发现所有的通话都被录音了,这就是获取语音数据的一个途径。在本书中,我们只研究文本数据。
语料库有时也会被称作数据集。
它有三种类型:
●单语语料库(monolingual corpus):这种语料库只包含一种语言。
●双语语料库(bilingual corpus):这种语料库包含两种语言。
●多语言语料库(multilingual corpus):这种语料库包含一种以上的语言。
一些可用的语料库列举如下:
●Google Books Ngram语料库
●Brown语料库
●American National语料库2.2 语料库的作用
在NLP应用中,需要使用数据或语料库进行开发。语料库是NLP相关的应用中最关键和最基本的部分,它提供了用于构建应用的定量数据。我们也可以使用其中的部分数据来验证和尝试我们关于语言的想法和直觉性的思考。语料库在NLP应用中扮演了重要角色。构建语料库面临一些挑战:
●决定解决问题所需的数据类型
●数据获取
●数据的质量
●数据数量的充足性
你可能已经开始好奇上述问题的细节,我将举一个例子帮助你进行理解。假设你想要开发一个NLP工具用来了解某些病人的医疗状况,并在适当的医疗分析之后辅助医疗诊断。
从一个概括的、语料的层面考察这一问题陈述,一个NLP学习者应该参考下面的流程:
●需要什么类型的数据解决这个问题?
■临床记录或病史记录。
■医生和病患的对话录音。
●你是否掌握了所需的语料库?
■如果有,那太棒了!你可以直接跳到下一个问题了。
■如果没有,也没关系。处理这件事有些困难,但也很有趣。
●是否存在可用的开放语料库资源?
■如果有,下载资源。
■如果没有,思考如何获取数据并构建语料库。你可以考虑使用网络爬虫和相关技术,不过必须兼顾道德和法律。
●语料库的质量如何?
■浏览语料库,回答下面的问题:
◆如果你完全不能理解数据集,要如何做?
○在数据集上花费更多时间。
○像机器一样思考,如果以这种数据集作为你的输入你需要处理哪些事情。
○找到一件你觉得可以入手的事情。
○假设NLP工具已经诊断出了一个病人的疾病,如果你是医生的机器,思考你会问病人什么问题。在这些步骤后,你将能够理解你的数据集并考虑预处理的部分了。
◆下面要做些什么?
○你是否需要使用数据集里的所有内容来构建NLP系统?
□如果是的,跳到下一步,这将在第5章中进行介绍。
□如果不是,下一步的内容会在第4章中被介绍。
●数据量是否足够解决问题,或至少能够进行基础的概念验证(Proof Of Concept,POC)?
■根据我的经验,一个小规模的概念验证至少该有500MB到1GB的数据。
■对初创企业,收集500MB到1GB的数据也会有些困难,原因如下:
◆初创企业是商业新手。
◆这些企业具有很高的创新性,找不到现成可用的数据集。
◆即使它们设法进行了概念验证,在现实生活中验证它们的产品依然面临挑战。
图2.1对上述过程进行了描述。图2.1 流程描述2.3 语料分析
本节首先会介绍语料分析和语音分析,之后,我们将学习如何为不同的NLP应用进行文本语料分析。在最后,我们会进行一些实用的文本语料分析。
语料分析可以被定义为一种以真实上下文和交际语境为基础的,深入研究语言概念的方法。本节讨论的是数字化存储的,可以通过计算机获取、检索和分析的语料库。
对语音数据的语料分析需要对每个数据实例的语音理解进行分析。除了语音分析,还需要进行对话分析,这能够让我们了解某种语言的日常社会交流是如何发生的。假设,你正在分析日常英语对话,那你大概可以发现在对话中,类似“What’s up,dude?”的句子比“How are you,sir(or madam)?”的使用频率要高得多。
对文本数据的语料分析包括对数据集的统计调查、操作和泛化。对文本数据集,我们通常进行类似语料库中出现了多少不同的单词,这些词的频率分别是多少的分析。如果语料库中存在噪声,需要移除它们。几乎每一个NLP应用开发都需要进行一些基础的语料分析来帮助我们更好地理解语料库。nltk为我们提供了一些内建语料库,我们可以用它们进行语料分析的一些尝试。在此之前,我们有必要先了解一下nltk提供的语料类型。
nltk包含了以下四种语料库:
●孤立语料库(isolate corpus):这种类型的语料库是自然语言的文本集合,以gutenberg,webtext为例。
●分类语料库(categorized corpus):这种类型的语料库中的文本被分成了不同的种类。其中的一个例子是brown语料库,它包含了新闻,爱好,幽默等不同类型的语料数据。
●重叠语料库(overlapping corpus):这种类型的语料库中的文本是分类的,但不同的类别之间存在着重叠,reuters语料库是其中之一,它包含有分类但类别间存在重叠的语料数据。
以reuters语料库为例,不同类型的椰子是一个分类,椰子油也是一个分类,这两个分类中的部分语料样例存在重叠,因为它们同时涉及了两个类别。同样的,棉花油也是如此。
●时序语料库(temporal corpus):这种类型的语料库包含了一段时间之内的自然语言的应用集合。
inaugural address语料库是一种时序语料库。假设你记录了一种语言在1950年的印度的某个城市的使用状况,然后在1980年的同一个城市,你进行了同样的考察,然后是2017年。你将根据人们对于这种语言的使用得到不同的数据分布,并发现在过去的一段时间内发生了怎样的变化。
现在,理论知识已经足够了,让我们来到实践阶段。本章代码可以通过下面的链接获取:https://github.com/jalajthanaki/NLPython/tree/master/ch2。
参照这个地址的Python代码:https://nbviewer.jupyter.org/github/jalajthanaki/NLPython/blob/master/ch2/2_1_Basic_corpus_analysis.html。
这份代码包含了使用nltk接口获取语料的基本指令。我们将使用brown和gutenberg语料库,并讨论相关的基本接口。
基本的接口属性描述如下表所示。
代码已实现了使用nltk加载个人语料库,并为开放语料库和个人语料库进行了频率分布的统计。注意:FreqDist类被用来进行频率分布统计,它将记录一个语料库中每个词出现的次数。
nltk的所有语料包含的噪声都很少,只需对它们进行基本的预处理即可生成特征。使用nltk的基本语料加载API能够识别出最糟糕的垃圾数据。假设你有一份生物化学语料库,那么其中将包含非常多的现有句法分析器无法准确解析的公式和复杂的化学名称。你可以根据问题陈述决定是在预处理阶段就将它们从语料中删除掉,还是在词性标注(Part-Of-Speech tagging,POS)阶段对它们做一些特殊处理。
在现实应用中,语料库通常包含非常多的脏数据。通过FreqDist类可以大致了解单词的分布,以及需要考虑的因素。在预处理阶段,你需要检查很多复杂的特征,如句法分析、词性标注、分句等的结果是否合适。我们将在第4章和第5章中详细地介绍这些内容。提示:要注意的是语料分析指的是技术层面的内容,我们并不关注语料库的语言学分析,不要混淆这两者。
如果你想了解更多有关语料库的语言学分析,可以参考这个网址:https://en.wikipedia.org/wiki/Corpus_linguistics。
如果你想要探究更多nltk API的相关内容,请访问这个地址http://www.nltk.org/。
练习
1.计算brown语料库中fileID为fileidcc12的文件的单词的数量。
2.建立你自己的语料库文件,使用nltk加载,然后考察这个语料库的频率分布。2.4 数据属性的类型
现在让我们关注语料库中出现的数据属性。图2.2详细列举了不同类型的数据属性:图2.2 数据属性的类型
我会对不同类型的语料分别举例,以便帮助读者理解。2.4.1 分类或定性数据属性
分类或定性数据属性如下:
●这种数据属性更偏重于描述性
●以nltk提供的书面语料为例,这是一个记录不同类型的狗的血统的语料库,包含柯利犬、牧羊犬和小猎狗等
分类数据属性有两个子类:
●序数数据
■这种数据属性用于衡量非数值概念,如满意程度、幸福水平、不适水平等。
■考虑下面的问题,你需要从给出的选项中选一个作为回答。
◆问题1:你今天感觉如何?
◆问题1的选项:
○非常差
○差
○不错
○开心
○非常开心
◆你可以选择任何一个给出的选项,比如“不错”,但没人能把今天感觉如何转换成为具体数值。
■上述的所有选项都是非数值概念。因此,它们被分为分类数据属性中的序数类型。
◆问题2:你如何评价我们旅馆的服务?
◆问题2的选项:
○差
○一般
○中等偏上
○好
○非常棒
■上个问题中的所有选项都用于衡量人的满意程度,同时,由于每个人的指标不同,你很难把它转化成数值。
■即使一个顾客给出了“好”而另一个顾客给出了“中等偏上”的评价,也可能存在着他们对于旅馆服务有同样的感受但给出了不同答案的情况。简单地说,不同人的不同答案之间的差别是未知的。所以对于这一类数据,你无法精确地给出数值。
●名义数据:
■这种数据属性用来记录不相互覆盖的数据。
■比如:你的性别是什么?答案要么是男要么是女,不会发生覆盖。
■一个例子是:你眼睛的颜色是什么?答案可能是黑色、咖啡色、蓝色或灰色。(这里我们并不考虑镜片等因素)
在NLP相关的应用中,主要处理的是分类数据属性。从语料库中提取合适的包含分类数据属性的数据是特征工程的一部分。我们将在第5章详细讨论这些内容。
有些语料库包含了分类数据属性的两种子类型。2.4.2 数值或定量数据属性
数值或定量数据属性如下。
●这种数据属性是数值化的,表示一个可以测量的量。
●如:金融数据、城市人口、人的体重等。
数值数据属性有两种子类。
●连续数据:
■这种数据属性是连续的。
■一些例子:比如你正在记录10~12岁的学生的体重,你所收集的体重数据是连续的数据;鸢尾花语料库也是这种数据属性的语料库。
●离散数据:
■离散数据只能取指定的数值。
■比如你正在掷两个骰子,结果的数值只可能是2、3、4、5、6、7、8、9、10、11和12中的一个,而永远不会得到1或1.5。
■另一个例子是,在抛一枚硬币的时候,只可能得到正面或反面,不存在第三种答案。
这种数据属性是分析应用程序中的主要构成。2.5 不同文件格式的语料
语料有不同的格式。在实践中,我们可以使用下面的文件格式。所有的这些文件格式一般都用来存储特征,并在之后用作机器学习算法的输入。处理这些文件格式的实践内容将在第4章中讨论。这些文件格式如下。
●.txt:这种格式仅提供一个原始数据集。gutenberg数据集就是这种语料库的实例之一。一些实际的应用包含了对平行语料库的使用。例如,如果想要开发类似Grammarly的语法校正软件,就需要使用平行语料库。
●.csv:在参加编程马拉松或Kaggle比赛时,通常会提供这种文件格式的语料。我们使用这种文件格式存储从原始文本中提取的特征,而包含特征的.csv文件将用来训练NLP应用的算法。
●.tsv:当你需要构建一个在句子中添加逗号的NLP应用时,.csv文件无法用来存储相关的特征,因为特征本身包含了逗号,这将影响我们对于特征文件的处理。这时,你可以使用任何自定义的分隔符,如\t、||或其他符号,以便于后续的处理。
●.xml:一些著名的NLP分析器和工具提供.xml格式的结果。如Stanford的CoreNLP工具提供了.xml格式的句法分析结果。这种文件格式主要用于存储NLP应用的结果。
●.json:Stanford CoreNLP工具也提供.json格式的结果。这种文件格式主要用于存储NLP应用的结果,同时,它十分便于显示,也易于同网页应用相整合。
●LibSVM:这是一种特殊的文件格式,如图2.3所示。图2.3 LibSVM文件格式示例
●LibSVM支持稀疏训练数据,这种格式的训练数据中仅包含非零值。其中的索引代表原有格式中一条实例数据的一个数值所在的列(也可理解为特征编号)。如果要从传统数据集转化为LibSVM格式,只需要遍历原有格式数据,如果原数据集构成的稀疏矩阵中X(i,j)的数值非零,在LibSVM格式数据中输出j+1:X(i,j)即可。
●X(i,j)即原稀疏矩阵:
■如果X(i,j)的数值非零,那么这个值应该被记录在LibSVM格式文件里。
◆LibSVM的j+1索引后对应的是原X(i,j)的值,由于矩阵的列索引是从0开始的,所以这里我们为每一个j加1。
■否则,这个值无须记录在文件中。
●举例如下:
■15:17:114:119:1
◆1代表该实例的类别,或者说标签。
◆在5:1中,5是键值,1则是数值,即5:1是一对键值对。
◆其中,5是这一实例向量的列序号,也可以理解为数据的属性编号;由于这里我们只考虑稀疏矩阵中的非零值,因此5所对应的值是1。
◆这个实例变量的1,2,3,4,6列,以及其他没有提到的列对应的数值都是0,因此在对应的LibSVM格式中这些列数不被记录在内。
●Apache Spark使用这种数据类型进行训练,在第5章中介绍了将文本数据转化成LibSVM格式的方法。
●自定义格式:你还可以使用自定义的文件格式构造特征文件。(参考CoNLL数据集)这是一种自定义的文件格式。由于CoNLL是一个合作任务,因此有许多不同的格式。图2.4显示了其中的一个例子。图2.4 CoNLL格式的数据实例2.6 免费语料库资源
获取语料是一个富有挑战性的工作,本节提供了一些可以免费获取的用于NLP应用的语料资源链接。
nltk库包含了一些内建语料库。执行下面的指令将输出所有语料库的名字:
在图2.5中,你可以看到上述代码的输出结果,高亮部分表示对应的语料库已安装。图2.5 nltk中所有可获取的语料库列表提示:如果你想要使用IDE来开发一个基于Python的NLP应用,可以使用PyCharm社区版。你可以按照这个网址的步骤进行安装:https://github.com/jalajthanaki/NLPython/blob/master/ch2/Pycharm_installation_gu ide.md
如果你希望获得更多的语料库资源,可以参考Bernard Marr的文章:《Big Data:33 Brilliant and Free Data Sources for 2016》(https://www.forbes.com/sites/bernardmarr/2016/02/12/big-data-35-brilliant-and-free-data-sources-for-2016/#53369cd5b54d)。
目前为止,本章已讲述了很多基础内容。下一节将告诉你如何为一个基于机器学习的自然语言处理应用进行数据集的准备。2.7 为NLP应用准备数据集
本节将讲述为NLP或其他数据科学应用准备数据集的基本步骤。三个基本步骤如下:
●挑选数据
●预处理数据
●转换数据2.7.1 挑选数据
如果你正同世界科技巨头,如谷歌、苹果、脸书等合作,那么你可以轻易地获取大量数据。但如果你没有有力的合作伙伴,而是进行独立研究或学习,那么要如何、从哪里获取数据集?首先,根据你想要开发的NLP应用,决定所需数据集的种类。此外,你还需要确定应用的最终输出。如果你想要制作一个健康领域的聊天机器人,就不能选用银行客户服务数据集。因此,你需要彻底地理解应用和问题陈述。注意:你可以使用下面的链接下载免费数据集:
https://github.com/caesar0301/awesome-public-datasets
https://www.kaggle.com/datasets
https://www.reddit.com/r/datasets/
你也可以使用谷歌的高级搜索功能,或者使用Python网络爬虫库,如beautifulsoup或scrapy来获取数据。2.7.2 预处理数据集
这一步将进行一些基础的数据分析,例如数据集中有哪些属性等。它包含了三个子阶段,在第4章中,将给出这一阶段的更多细节。
1.格式化
在本阶段,生成最便于你的工作的数据集格式。如果你的数据集是JSON格式的,但CSV将更便捷,那么就将它从JSON转化为CSV格式。
2.清洗
本阶段我们将对数据进行清洗。如果数据集存在缺失值,可以考虑删除这条记录,或者使用合适的近似值来填充。如果数据集中存在不必要的数据属性,也可以将它移除。假设你正在构建一个语法校正系统,那么可以从数据集中移除数学公式,因为应用中无须使用公式。
3.采样
这一阶段中,我们实际上在尝试理清数据集中可以获得和导出的数据属性,并根据应用辨别哪些属性更重要。假如我们正构建一个聊天机器人,那么,需要将句子切分成词,然后辨别其中的关键词,因此,需要从中导出词级别的信息。对这个应用而言,词级别和句子级别的信息都很重要,所以除了垃圾数据以外,不对数据进行删除。通过采样,我们可以抽取出能够最好地表达整个数据集的数据属性。
4.转换数据
在这一阶段,我们应用一些特征工程技术,将文本数据转化成为数值数据,以便机器理解和找出其中的规律。所以本阶段实质上是数据处理阶段。在NLP领域,可以通过一些编码和向量化技术进行这样的转换。第5章和第6章中将详细地描述数据处理和特征抽取技术。2.8 网页爬取
我们将使用beautifulsoup和scrapy等库开发网络爬虫工具,并学习相应的基本代码。
图2.6中的代码使用了beautifulsoup开发一个基础的网络爬虫。图2.6 使用beautifulsoup的基础网络爬虫
代码输出如图2.7所示。图2.7 使用beautifulsoup的基础网络爬虫的输出
下面的链接包含了beautifulsoup和scrapy的安装指南:https://github.com/jalajthanaki/NLPython/blob/master/ch2/Chapter_2_Installation_Commands.txt。
代码示例在GitHub中给出:https://github.com/jalajthanaki/NLPython/blob/master/ch2/2_2_Basic_webscraping_byusing_beautifulsuop.py。
如果在运行脚本的过程中产生了警报,不用担心。
现在,再尝试使用scrapy库进行网页爬取。首先,需要创建一个新的scrapy项目。
在终端执行下面的命令建立一个scrapy项目:
我使用的scrapy项目名称是web_scraping_test,命令如下:
执行了上面的命令后,可以看到如图2.8的输出结果。图2.8 创建一个新scrapy项目时的输出
之后,执行下列步骤:
1)编辑items.py文件,这个文件在创建项目时已经建立了。
2)在spiders目录下新建WebScrapingTestspider文件。图2.9 用于定义爬取内容的items.py文件
3)前往想要爬取的网页,并选取需要的元素的xpath。你可以在这个网址了解更多有关xpath选取的内容:https://doc.scrapy.org/en/1.0/topics/selectors.html。
图2.9中给出了items.py的示例代码。项目代码可以在下面的GitHub地址获取到:https://github.com/jalajthanaki/NLPython/tree/master/web_scraping_test。
图2.10展示了使用scrapy构建一个基本的网络爬虫的代码。图2.10 含有实际代码的Spider文件
图2.11展示了CSV文件格式的输出结果。图2.11 爬虫的输出结果被重定向为一个CSV文件
如果产生了任何SSL相关的警告,你可以在这个链接找到答案:https://stackoverf low.com/questions/29134512/insecureplatformwarning-a-true-sslcontext-object-is-not-available-this-prevent。
你也可以开发一个绕过AJAX和脚本的网络爬虫,但需要非常小心,遵守道德。本书将不介绍此种方法。出于好奇,你也可以上网搜索他人是如何做到的。你可以通过Selenium库进行自动点击来模拟网络事件。2.9 总结
在本章中,我们认识到语料库是NLP应用的基础部分,学习了不同类型的语料库和它们的数据属性,进行了实践分析,并使用nltk接口简化了语料分析过程。
下一章将使用词性、词项、词条等语言学概念探讨自然语言的基础和有效性等方面,这将进一步帮助我们进行预处理和特征工程的工作。第3象理解句子的结构
在本章中,我们将会探索NLP的一些基本概念。本章会帮助你夯实基础,所以是最重要的一章。
为了加强你对NLP基本概念的理解并帮助你理解下一章,我们将会涉及如下概念:
●理解NLP的组成
●上下文无关文法
●形态分析
●词法分析
●句法分析
●语义分析
●消歧
●篇章整合
●语用分析3.1 理解NLP的组成
NLP由两个基本任务构成。我们会对这两个基本任务进行理解。3.1.1 自然语言理解
下面来学习一下自然语言理解这个任务:
●自然语言理解(Natural Language Understanding,NLU)被认为是NLP的第一个任务。
●自然语言理解被认为是人工智能难(AI-Hard)问题或者人工智能完全(AI-Complete)问题。
●NLU被认为是AI-Hard问题的原因是我们想让一台计算机具有和人类一样的智能。
●尽管NLU是一个困难的问题,但是现在很多科技巨头和研究社区致力于使用很多传统的机器学习算法和多种多样的深度神经网络来达到这个目标(使得计算机具有处理自然语言的智能)。
●NLU任务被定义为利用计算语言学工具把自然语言输入转换成合理的表示。
●NLU需要下列的分析来把自然语言转换成合理的表示:
■形态分析
■词法分析
■句法分析
■语义分析
■消歧
■篇章整合
■语用分析
在本书中,我们会重点关注NLU任务,并开发一个使用NLU表示的NLP系统。3.1.2 自然语言生成
我们来学习一下自然语言生成(Natural Language Generation,NLG)任务:
●NLG被认为是NLP的第二个任务。
●NLG被定义为使用计算机来生成自然语言的过程。
●机器的输出应当有合理的风格、意义,也就是说机器生成的自然语言应当是逻辑合理的。
●为了达到生成逻辑合理的输出的目的,很多NLG系统利用基本的事实或是基于知识的表示(knowledge-based representation)。
●举个例子,你有一个能根据具体话题来写文章的系统。如果我来指导系统生成100个关于奶牛的词,那么系统的输出一定要是正式的句子,同时所有的句子应当是逻辑正确、上下文合理的。
试读结束[说明:试读内容隐藏了图片]