目录
一、自然与语言与编程语言
二、自然语言处理的层次
三、 自然语言处理的流派
五、语料库
六、开源工具
七 总结
自然语言处理(NLP)是一门融合了计算机科学、人工智能以及语言学的交叉学科。
一、自然与语言与编程语言
1.词向量
自然语言中的词汇量比编程语言中的关键词丰富。再自然语言中,我们可以使用的词汇量是无穷无尽的,几乎没有意义完全相同的词语。我们国家语言文字工作委员会发布的《现代汉语常用词表(草案)》一共收录56 008个词条。除此之外,我们还可以随时创造各种类型的新词,而不仅限于名词。
2.结构化
自然语言是非结构化的,而编程语言是结构化的。所谓的结构化,是指信息具有明确的结构关系,比如编程语言中的类于成员,数据库中的表于字段,都可以通过明确的机制来读写。人类语言是线性字符串,给定一句话“苹果的创始人是乔布斯,它的logo是苹果”,计算机需要分信息如下结论:
- 这句汉语转换为单词序列后,应该是“苹果 的 创始人 是 乔布斯 , 它 的logo是 苹果”;
- 第一个“苹果”指的是苹果公司,而第二个“苹果”指的是带缺口的苹果logo;
- “乔布斯”是一个人名;
- “它”指的是苹果公司
- 苹果公司与乔布斯之间的关系是“的创始人”,与带缺口的苹果logo之间的关系是“的logo是”
这些结论的得出分别涉及中文分词、命名实体识别、指代消除和关系抽取等自然语言处理任务。这些任务目前的准确率都达不到人类水平。可见,人类觉得很简单的一句话,要让计算机理解起来并不简单。
3.歧义性
自然语言含有大量歧义,这些歧义根据语境的不同而表现为特定的义项。比如汉语中的多义词,只有在特定的上下文中才能确定其含义,甚至存在故意利用无法定义的歧义营造幽默效果的用法。除了上文“苹果”有两种意思之外,“意思”这个词也有多种意义。
但在编程语言中,则不存在歧义性。如果程序员无意中写了有歧义的代码,比如两个函数的签名一样,则会触发编译错误。
4.容错性
书刊中的语言即使经过编辑的多次校对,也任然无法避免错误。而互联网上的文本更加随性,错别字或病句、不规范的标点符号等随处可见。但是人们还是能猜出他的意思。而在编译语言中,程序员必须保证拼写绝对正确、语法绝对规范、否则要么得到编译器无情的警告、要么造成潜在的bug。
5 易变性
任何语言都是不断发展变化的,不同的是,编程语言的变化要缓慢温和得多,而自然语言则相对迅速嘈杂一些。
6 简略性
由于说话速度和听话的速度、书写速度和阅读速度的限制,人类语言往往简洁、干练。我们常常省略大量的背景知识或常识,比如我们对朋友说“老地方见”,而不必指出“老地方”在哪里。这些省略,是交流双方共有而计算机不一定拥有的,这也给自然语言处理带来了障碍。
二、自然语言处理的层次
按照处理对象的颗粒度,自然语言处理大致可以分为如图所示的几个层次。
1 语音、图像、文本
自然语言处理系统的输入源一共有3个,即语音、图像与文本。其中,语音和图像虽然正引起越来越大的关注,但受制于存储容量和传输速度,他们的信息总量还没有文本多。另外,这两种形式一般经过识别后转化为文本,再进行接下来的处理,分别称为语音识别(Speech Recognition)和光学字符识别(Optical Character Recognition)。一旦转化为文本,就可以进行后续的NLP任务。所以,文本处理是重中之重。
2 中文分词、词性标注和命名实体识别
这3个任务都是围绕词语进行的分析,所以统称词法分析。词法分析的主要任务是将文本分隔为有意义的词语(中文分词),确定每个词语的类别和浅层的歧义消除(词性标注),并且识别出一些较长的专有名词(命名实体识别)。对中文而言
3 信息抽取
词法分析之后,文本已经呈现出部分结构化的趋势。至少,计算机看到的不再是一个超长的字符串,而是有意义的单词列表,并且每个单词还附有自己的词性以及其他标签。
根据这些单词和标签,我们可以抽取去一部分有用的信息,从简单的高频词到高级算法提取出的关键词,从公司名称到专业术语,其中词语级别的信息已经可以抽取不少。我们还可以根据词语之间的统计学信息抽取关键短语乃至句子,更大颗粒度的文本对用户更加友好。
值得一提的是,这些信息提取算法用到的统计量可以复用到其他任务中,会在相应章节中详细介绍。
4 文本分类与文本聚类
将文本拆分为一系列词语之后,我们还可以在文章级别做一系列分析。
有时我们想知道一段话是褒义还是贬义的,判断一封邮件是否是垃圾邮件,想把许多文档分门别类地整理一下,此时的NLP任务作为文本分类。
另一些时候,我们只想把相似的文本归档到一起,或者排除重复的文档,而不关心具体类别,此时进行的任务作为文本聚类。
这两类任务看上去挺相似,其实上分属两种截然不同的算法流派。
5 句法分析
词法分析只能得到零散的词汇信息,计算机不知道词语之间的关系。在一些问答系统中需要得到句子的主谓宾结构。比如“查询刘医生主治的内科病人”这句话,用户真正想要查询的不是“刘医生”,也不是“内科”,而是“病人”。虽然这三个词语都是名词,甚至“刘医生”离表示意图的动词“查询”最近,但只有“病人”才是“查询”的宾语。通过句法分析,可以得到如图信息:
我们发现有根长长的箭头将“查询”与“病人”联系起来,并且注明了他们之间的关系。后续章节会详细介绍上面这种树形结构,以及据法分析器的实现方法。
不仅是问答系统和搜索引擎,句法分析还经常应用于基于短语的机器翻译,给译文的词语重新排列。两者词序不同,但是句法结构一致。
6 语义分析与篇章分析
想较与句法分析,语义分析侧重语义而非语法。它包括词义消歧(确定一个词在语境中的含义,而不是简单的词性) 、语义角色标注(标注句子中的谓语与其他成分的关系)仍至语义依存(分析句子中词语之间的语义关系)
随着任务的递进,它们的难度也逐步上升,属于较为高级的课题。即便是最前沿的研究,也尚未达到能够实用的精度程度。另外,相应的研究资源比较稀缺,大众难以获取,所以本书不会涉及。
7 其他高级任务
除了上述“工具类”的任务之外,还有许多综合性的任务,与终端应用级产品联系更密切。比如:
- 自动问答,根据知识库或文本中的信息直接回答一个问题,比如微软Cortana和苹果的Siri;
- 自动摘要,为一片长文档自动生成的摘要;
- 机器翻译,将一句话从一种语言翻译到另一种语言。
注意,一般认为信息检索(Information Retrieve,IR)是区别于自然语言处理的独立学科。虽然两者有着密切的联系,但IR的目标是查询信息,而NLP的目标是理解语言。此外,IR检索的未必是语言,还可以是以图搜图,听曲搜曲,商品搜索乃至任何信息的搜索。现实中还存在大量不需要理解语言即可完成检索任务的场景,比如SQL中的LIKE。
三、 自然语言处理的流派
上一节比较了自然语言与人工语言的异同,展示了自然语言处理的困难所在,介绍了一些常见的NLP任务。这一节简要介绍进行自然语言处理的几种不同手法。
1 基于规则的专家系统
规则,是指由专家手工指定的确定性流程。小到程序日常使用的正则表达式,大到飞机的自动驾驶仪,都是固定的规则系统。
在自然语言处理的语境下,比较成功的案例有波特词干算法(Porter stemming algorithm),它有马丁—·波特在1980年提出,广泛用于英文词干提取。该算法由多条规则构成,每个规则都是一系列固定的if then条件分支。当词语满足条件则执行固定的工序,输出固定的结果。摘录其中一部分规则为例。
他的最大的缺点是难以拓展。
2 基于统计的学习方法
为了降低对专家的依赖,自适应灵活的语言问题,人们使用统计方法让计算机自动学习语言。所谓“统计”,指的是在语料库上进行的统计。所谓语料库,指的是人工标注结构化文本。
统计学习方法其实就是机器学习的别称,而机器学习则是当代实现人工智能的主流途径。机器学习在自然语言处理中的重要性非常大,可以说自然语言处理只是机器学习的一种应用。此处我们仅仅用“举例学习”来简单理解,后续章节将浓墨重彩地系统学习。
3 历史
4 规则与统计
纯粹的规则系统已经日渐式微,除了一些简单的任务外,专家系统已经落伍了。本书尊重工程实践,以统计为主,规则为辅的方式介绍实用性NLP系统的搭建。
5 传统方法与深度学习
虽然深度学习在机器视觉领域取得了耀眼的成绩,但在自然语言处理领域中的基础任务上发力并不大。这个结论或许有点意外,作为数据数据科学从业者,用数据说明问题最合适。下表收录了《华尔街日报》语料库上的词性标注任务的前沿标准。
截止 2015年,除了Bi-LSTM-CRF以外,其他系统都是传统模型,最高准确率为97.36%,而
Bi-LSTM-CRF深度学习模型为97.55%,仅仅提高了0.19%。2016年,传统系统NLP4通过使用额外数据与动态特征提取算法,准确率可以达到97.64%。
类似的情形也在句法分析任务上重演,以斯坦福标准下宾州树库的准确率为例,如表:
深度学习涉及大量的矩阵运算,需要特殊硬件(GPU、TPU等)的加速。目前,一台入门级塔式服务器的价格在3000元左右,一台虚拟服务器每月仅需50元左右,但又一块入门级显卡就需5000元 。从性价比来看,反而传统的机器学习方法更适合中小型企业。
此外,从传统方法到深度学习的迁移不能一蹴而就。两者是基础和进阶的关系,许多基础知识和基本概念用传统方法讲解会更简单、易懂,它们也会在深度学习中反复用到(比如CRF与神经网络的结合)。无论是传统模型还是神经网络,它们都属于机器学习的范畴。掌握传统方法,不仅可以解决计算资源受限时的工程问题,还可以为将来挑战深度学习打下坚实的基础。
四、机器学习
前面的小节当中,我们邂逅了一些机器学习的术语。按照递归学习的思路,现在我们来递归了解一下机器学习的基本概念。
机器学习是自然语言处理的基石,一些基本概念依然需要预先掌握。熟练掌握这些术语,还方便我们与其他人流畅交流。
1 什么是机器学习
人工智能领域的先驱Arthur Samuel在1059年给出机器学习定义是:不直接编程却能赋予计算机提高能力的方法。
美国工程院士Tom Mitchel给过一个更明确的定义,机器学习指的是计算机通过某项任务的经验数据提高了在在该任务上的能力。
简而言之,机器学习是让机器学会算法的算法。这个说法有些绕口,不如拿我们熟悉的数据库做类比:数据库中的“元数据”指的是描述数据的数据(表名、字段等)、而其中的一行则是普通数据。类比过来,机器学习算法则可以称作“元算法”,它指导机器学习自动学习出另一个算法,这个算法被用来解决实际问题。为了避免混淆,人们通常称被学习的算法为模型。
2 模型
模型是对现实问题的数学抽象,由一个假设函数以及一系列参数构成。举个简单的例子,我们要预测中国人名对应的性别。假设中国人名由函数f(x)输出的符号确定,负表示女性,非负表示男性。
我们选取的的定义如下:
其中,w和b是函数的参数,而x是函数的自变量。那么,模型指的就是包括参数在内的整个函数。不过模型并不过包括具体的自变量x,因为自变量是由用户输入的。自变量x是一个特征向量,用来表示一个对象的特征。
3 特征
特征指的是事物的特点转化的数值,比如牛的特征是4条腿、0双翅膀,而鸟的特征是2条腿、1双翅膀。那么在性别识别问题当中,中国人名的特征是什么呢?
计算机不知道哪部分是性,哪部分是名。姓属于无用的特征,不应被提取。另外,有一些特殊的字(壮、健、强)是男女通用的,而另一些(丽、燕、雪)则是女性常用的,还有一些则是男女通用的。如果有人叫“沈雁冰”怎么办?“雁”听上去像男性,而“冰”听上去像女性,而这个名字是男性用的。看来,每个字与男女相关程度都是不一样的。这个可以通过“优先级”解决,不过这种机械的工作交给机器好了。在机器学习中,“优先级”可以看做权重或模型参数。我们只需要定义一系列特征,让算法根据数据自动决定他们的权重就行了。为了方便计算机处理,我们将他们表示为数值类型的特征,这个过程称为特征提取。以“沈雁冰”的特征提取为例,如下表:
模型参数的权重向量也是四维的。人名的常用的字数非常多,类似地,我们可以将特征拓展到所有常用汉字。
工程上,我们不需要逐个字地写特征,而是定义一套模板来提取特征。比如姓名为name的话,则定义特征模板为name[1] + name[2]之类,只要我们遍历一些姓名,则name[1] + name[2]可能组合而成的特征就基本覆盖了。这种自动提取特征模型称作特征模板。
如何挑选特征,如何设计特征模板,这就称作特征工程。特征越多,参数就越多;参数越多,模型就越复杂。模型的复杂程度应当与数据集匹配,按照递归学习的思路,数据集的概念将在下一节中介绍。
4 数据集
如何让机器自动学习,以得到模型参数呢?首先得有一本习题集。有许多问题无法直接编写算法(规则)解决(比如人名性别识别,我们说不清楚什么样的名字是男性),所以我们准备了大量例子(人名 x 及其对应的性别 y)作为习题集,希望机器自动从习题集中学习中国人名的规律。其中,“例子”一般称作样本。
这本习题集在机器学习领域称作数据集,在自然语言处理领域称作语料库,会在 1.5 节详细介绍。数据集的种类非常多,根据任务的不同而不同。表 1-6 收录了一些常用的数据集。
在使用数据集时,我们不光要考虑它的规模、标注质量,还必须考虑它的授权。大部分数据集都不可商用,许多冷门领域的数据集也比较匮乏,此时我们可以考虑自行标注。
5 监督学习
如果这本习题集附带标准答案 y ,则此时的学习算法称作监督学习。监督学习算法让机器先做一遍题,然后与标准答案作比较,最后根据误差纠正模型的错误。大多数情况下,学习一遍误差还不够小,需要反复学习、反复调整。此时的算法是一种迭代式的算法,每一遍学习都称作一次迭代。监督学习在日语中被称作“教師あり学習”,意思是“有老师的学习”。通过提供标准答案,人类指出了模型的错误,充当了老师的角色。
这种在有标签的数据集上迭代学习的过程称为训练,训练用到的数据集称作训练集。训练的结果是一系列参数(特征权重)或模型。利用模型,我们可以为任意一个姓名计算一个值,如果非负则给出男性的结论,否则给出女性的结论。这个过程称为预测。
总结一下,监督学习的流程如图 :
在性别识别的例子中:
非结构化数据是许多个类似“沈雁冰”“丁玲”的人名;
经过人工标注后得到含有许多个类似“沈雁冰=男”“丁玲=女”样本的标注数据集;
然后通过训练算法得到一个模型;
最后利用这个模型,我们可以预测任何名字(如“陆雪琪”)的性别。
待预测的名字不一定出现在数据集中,但只要样本数量充足且男女均衡、特征模板设计得当、算法实现正确,我们依然可以预期一个较高的准确率。
另外,图 1-5 中的标注数据其实也是结构化数据。但由于它含有人工标注的成本,有时被称作“黄金数据”(gold data),与模型预测的、有一定误差的结果还是有很大区别的。
本书将从第 3 章开始详细介绍一些 NLP 中实用的监督学习方法。
6 无监督学习
如果我们只给机器做题,却不告诉它参考答案,机器仍然可以学到知识吗?
可以,此时的学习称作无监督学习,而不含标准答案的习题集被称作无标注(unlabeled)的数据集。无监督学习在日语中被称作“教師なし学習”,意为“没有老师的学习”。没有老师的指导,机器只能说发现样本之间的联系,而无法学习样本与答案之间的关联。
无监督学习一般用于聚类和降维,两者都不需要标注数据。
聚类已经在 1.2 节中介绍过了,我们不再赘述。在性别识别的例子中,如果我们选择将一系列人名聚成 2 个簇的话,“周树人”“周立人”很可能在一个簇里面,“陆雪琪”和“曹雪芹” 在另一个簇里面。这是由样本之间的相似性和簇的颗粒度决定的,但我们并不知道哪个簇代表男性哪个簇代表女性,它们也未必能通过肉眼区分。
降维指的是将样本点从高维空间变换到低维空间的过程。机器学习中的高维数据比比皆是,比如在性别识别的例子中,以常用汉字为特征的话,特征数量轻易就突破了 2000。如果样本具有 n 个特征,则样本对应着 n +1 维空间中的一个点,多出来的维度是给假设函数的因变量用的。如果我们想要让这些样本点可视化,则必须将其降维到二维或三维空间。有一些降维算法的中心思想是,降维后尽量不损失信息,或者说让样本在低维空间中每个维度上的方差都尽量大。试想一下这样的极端案例:平地上竖直地插着一些等长的钢管,将这些钢管的顶端降维到二维平面上,就是拔掉钢管后留下来的孔洞。垂直维度上钢管长度都是一样的,没有有用信息,于是被舍弃掉了。
有一些无监督方法也可以用来驱动中文分词、词性标注、句法分析等任务。由于互联网上存储了丰富的非结构化数据,所以无监督学习十分诱人。然而无监督学习时,模型与用户之间没有发生任何信息交换,这种缺乏监督信号的学习导致模型无法捕捉用户的标准,最终预测的结果往往与用户心目中的理想答案相去甚远。目前,无监督学习的 NLP 任务的准确率总比监督学习低十几个到几十个百分点,无法达到生产要求。
本书将在第 10 章详细介绍聚类算法的原理和实现。
7 其他机器学习类算法
如果我们训练多个模型,然后对同一个实例执行预测,会得到多个结果。如果这些结果多数一致,则可以将该实例和结果放到一起作为新的训练样本,用来扩充训练集。这样的算法被称为半监督学习。由于半监督学习可以综合利用标注数据和丰富的未标注数据,所以正在成为热门的研究课题。
现实世界中的事物之间往往有很长的因果链:我们要正确地执行一系列彼此关联的决策,才能得到最终的成果。这类问题往往需要一边预测,一边根据环境的反馈规划下次决策。这类算法被称为强化学习。强化学习在一些涉及人机交互的问题上成果斐然,比如自动驾驶、电子竞技和问答系统。
本书作为入门读物,不会深入这些前沿课题。但了解这些分支的存在,有助于构建完整的知识体系。
五、语料库
语料库作为自然语言处理领域中的数据集,是我们教机器理解语言不可或缺的习题集。在这一节中,我们来了解一下中文处理中的常见语料库,以及语料库建设的话题。
1 中文分词语料库
中文分词语料库指的是,由人工正确切分后的句子集合。
以著名的 1998 年《人民日报》语料库为例,该语料库由北京大学计算语言学研究所联合富士通研究开发中心有限公司,在人民日报社新闻信息中心的许可下,从 1999 年 4 月起到 2002年 4 月底,共同标注完成。语料规模达到 2600 万汉字,市售为 1998 年上半年的语料部分(约1300 万字=约 730 万词)。
在 2005 年的第二届国际中文分词比赛中,曾经公开过约 1 个月份的语料。其中的一句样例为:
先有通货膨胀干扰,后有通货紧缩叫板。
从这句简单的标注语料中,无须语言学知识,我们也能发现一个问题:为何“通货膨胀”是一个词,而“通货 紧缩”却分为两个词呢?这涉及语料标注规范和标注员内部一致性的问题。我们将在后续章节中详细介绍这些话题,现在只需留个印象:语料规范很难制定,规范很难执行。
事实上,中文分词语料库虽然总量不多,但派别却不少。我们将在第 3 章中了解这些语料的授权、下载与使用。
2 词性标注语料库
它指的是切分并为每个词语指定一个词性的语料。总之,我们要教机器干什么,我们就得给机器示范什么。依然以《人民日报》语料库为例,1998 年的《人民日报》一共含有 43 种词性,这个集合称作词性标注集。这份语料库中的一句样例为:
迈向/v 充满/v 希望/n 的/u 新/a 世纪/n ——/w 一九九八年/t 新年/t 讲话/n (/w 附/v 图片/n 1/m 张/q )/w这里每个单词后面用斜杠隔开的就是词性标签,关于每种词性的意思将会在第 7 章详细介绍。这句话中值得注意的是,“希望”的词性是“名词”(n)。在另一些句子中,“希望”还可以作为动词。
3 命名实体识别语料库
这种语料库人工标注了文本内部制作者关心的实体名词以及实体类别。比如《人民日报》语料库中一共含有人名、地名和机构名 3 种命名实体:
萨哈夫/nr 说/v ,/w 伊拉克/ns 将/d 同/p [联合国/nt 销毁/v 伊拉克/ns 大规模/b 杀伤性/n 武器/n 特别/a 委员会/n] /nt 继续/v 保持/v 合作/v 。/w这个句子中的加粗词语分别是人名、地名和机构名。中括号括起来的是复合词,我们可以观察到:有时候机构名和地名复合起来会构成更长的机构名,这种构词法上的嵌套现象增加了命名实体识别的难度。
命名实体类型有什么取决于语料库制作者关心什么。在本书第 8 章中,我们将演示如何标注一份语料库用来实现对战斗机名称的识别。
4 句法分析语料库
汉语中常用的句法分析语料库有 CTB(Chinese Treebank,中文树库),这份语料库的建设工作始于 1998 年,历经宾夕法尼亚大学、科罗拉多大学和布兰迪斯大学的贡献,一直在发布多个改进版本。以 CTB 8.0 版为例,一共含有来自新闻、广播和互联网的 3007 篇文章,共计 71 369个句子、1 620 561 个单词和 2 589 848 个字符。每个句子都经过了分词、词性标注和句法标注。其中一个句子可视化后如图 1-6 所示。
图 1-6 中,中文单词上面的英文标签表示词性,而箭头表示有语法联系的两个单词,具体是何种联系由箭头上的标签表示。关于句法分析语料库的可视化和利用,将会在第 12 章中介绍。
5 文本分类语料库
它指的是人工标注了所属分类的文章构成的语料库。相较于上面介绍的 4 种语料库,文本分类语料库的数据量明显要大很多。以著名的搜狗文本分类语料库为例,一共包含汽车、财经、 IT、健康、体育、旅游、教育、招聘、文化、军事 10 个类别,每个类别下含有 8000 篇新闻,每篇新闻大约数百字。
另外,一些新闻网站上的栏目经过了编辑的手工整理,相互之间的区分度较高,也可作为文本分类语料库使用。情感分类语料库则是文本分类语料库的一个子集,无非是类别限定为 “正面”“负面”等而已。
如果这些语料库中的类目、规模不满足实际需求,我们还可以按需自行标注。标注的过程实际上就是把许多文档整理后放到不同的文件夹中。
6 语料库建设
语料库建设指的是构建一份语料库的过程,分为规范制定、人员培训与人工标注这 3 个阶段。
规范制定指的是由语言学专家分析并制定一套标注规范,这份规范包括标注集定义、样例和实施方法。在中文分词和词性标注领域,比较著名的规范有北京大学计算语言学研究所发布的《现代汉语语料库加工规范——词语切分与词性标注》和中国国家标准化管理委员会发布的《信息处理用现代汉语词类标记规范》。
人员培训指的是对标注员的培训。由于人力资源的限制,制定规范与执行规范的未必是同一批人。大型语料库往往需要多人协同标注,这些标注员对规范的理解必须达到一致,否则会导致标注员内部冲突,影响语料库的质量。
针对不同类型的任务,人们开发出许多标注软件,其中比较成熟的一款是 brat(brat rapid annotation tool) ①,它支持词性标注、命名实体识别和句法分析等任务。brat 是典型的 B/S 架构,服务端用 Python 编写,客户端运行于浏览器。相较于其他标注软件,brat 最大的亮点是多人协同标注功能。此外,拖曳式的操作体验也为 brat 增色不少。
六、开源工具
目前开源界贡献了许多优秀的 NLP 工具,它们为我们提供了多种选择,比如教学常用的NLTK(Natural Language Toolkit)、斯坦福大学开发的 CoreNLP,以及国内哈工大开发的 LTP (Language Technology Platform)、我开发的 HanLP(Han Language Processing)
1 主流NLP工具比较
选择一个工具包,我们需要考虑的问题有:功能、精度、运行效率、内存效率、可拓展性、商业授权和社区活跃程度。表 比较了 4 款主流的开源 NLP 工具包。
关于这些开源工具的发展速度,根据 GitHub 上 Star 数量的趋势,HanLP 是发展最迅猛的,如图 所示。
① 关于 HanLP 与 LTP 的具体性能对比,请参考 @zongwu233 的第三方开源评测:https://github.com/zongwu233/ HanLPvsLTP。关于 HanLP 与包括结巴、IK、Stanford、Ansj、word 在内的其他 Java 开源分词器的性能对比,可参考阿里巴巴架构师杨尚川的第三方开源评测:https://github.com/ysc/cws_evaluation。我不保证第三方开源评测的准确与公正,更不采信任何闭源评测。本书将在相关章节中详细介绍如何规范地评估常见 NLP 任务的精度。另外,我也研究过其他开源项目的原理,借鉴了其中优秀的设计。但毕竟还是自己写的代码讲得最清楚,所以综合以上各种考虑,最后选取了 HanLP 作为本书的实现。
2 python 接口
得益于 Python 简洁的设计,使用这门动态语言调用 HanLP 会省下不少时间。无论用户是否常用 Python,都推荐一试。
HanLP 的 Python 接口由 pyhanlp 包提供,其安装只需一句命令:
$ pip install pyhanlp这个包依赖 Java 和 JPype。Windows 用户如果遇到如下错误:
building '_jpype' extensionerror: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft VisualC++ Build Tools": http://visualstudio.microsoft.com/visual-cpp-build-tools/既可以按提示安装 Visual C++,也可以安装更轻量级的 Miniconda。Miniconda 是 Python 语言的开源发行版,提供更方便的包管理。安装时请勾选如图 所示的两个复选框。
然后执行如下命令:
$ conda install -c conda-forge jpype1$ pip install pyhanlp如果遇到 Java 相关的问题:
jpype._jvmfinder.JVMNotFoundException: No JVM shared library file (jvm.dll) found. Try setting up the JAVA_HOME environment variable properly.七 总结
本章给出了人工智能、机器学习与自然语言处理的宏观缩略图与发展时间线。机器学习是人工智能的子集,而自然语言处理则是人工智能与语言学、计算机科学的交集。这个交集虽然小,它的难度却很大。为了实现理解自然语言这个宏伟目标,人们尝试了规则系统,并最终发展到基于大规模语料库的统计学习系统。
在接下来的章节中,就让我们按照这种由易到难的发展规律去解决第一个 NLP 问题——中文分词。我们将先从规则系统入手,介绍一些快而不准的算法,然后逐步进化到更加准确的统计模型。
来源:《自然语言处理入门》素材来源于网络,若有侵权联系删除! |