找回密码
 立即注册
搜索

没想到,自然语言处理能这么有趣 // 自然语言处理入门



来自freepik
计算机处理或“理解”自然语言的学科被称为自然语言处理(Natural Language Processing,NLP),是目前人工智能领域非常火热的分支。
语言,就是我们每个正常人类每天说的话、写的字、以及其他各种以语言形式记录的内容等等,理解这些,对于我们人类似乎是自然而然的,甚至不费吹灰之力。然而,对于目前 “万能”的计算机系统来说却是个老大难问题。

我们太熟悉自己的语言,就像水对鱼来讲是透明的一样,所以我们可能很难体会到语言的复杂程度。下面我们拿自然语言与人工语言做一番比较,看看计算机理解我们的语言到底有多么困难。
自然语言与编程(人工)语言

1. 词汇量

自然语言中的词汇比编程语言中的关键词丰富。在我们熟悉的编程语言中,能使用的关键词数量是有限且确定的。比如,C 语言一共有 32 个关键字,Java 语言则有 50 个。虽然我们可以自由地取变量名、函数名和类名,但这些名称在编译器看来只是区别符号,不含语义信息,也不影响程序的运行结果。但在自然语言中,我们可以使用的词汇量是无穷无尽的,几乎没有意义完全相同的词语。以汉语为例,由国家语言文字工作委员会发布的《现代汉语常用词表(草案)》一共收录了 56 008 个词条。除此之外,我们还可以随时创造各种类型的新词,而不仅限于名词。

2.结构化

自然语言是非结构化的,而编程语言是结构化的。所谓结构化,指的是信息具有明确的结构关系,比如编程语言中的类与成员、数据库中的表与字段,都可以通过明确的机制来读写。举个例子,我们来看看两种语言对同一事实的表述,一些面向对象的编程语言可以如此书写:
class Company(object): def __init__(self, founder, logo) -> None: self.founder = founder  self.logo = logoapple = Company(founder='乔布斯', logo='apple')
于是,程序员可以通过 apple.founder和 apple.logo来获取苹果公司的创始人和标志。像这样,程序语言通过 class Company这个结构为信息提供了层次化的模板,而在自然语言中则不存在这样的显式结构。人类语言是线性的字符串,给定一句话“苹果的创始人是乔布斯,它的 logo 是苹果”,计算机需要分析出如下结论:
    这句汉语转换为单词序列后,应该是“苹果 的 创始人 是 乔布斯 , 它 的 logo 是 苹果”;第一个“苹果”指的是苹果公司,而第二个“苹果”指的是带缺口的苹果 logo ;“乔布斯”是一个人名;它”指代的是苹果公司;苹果公司与乔布斯之间的关系是“的创始人是”,与带缺口的苹果 logo 之间的关系为“的logo 是”。

这些结论的得出分别涉及中文分词、命名实体识别、指代消解和关系抽取等自然语言处理任务。这些任务目前的准确率都达不到人类水平。可见,人类觉得很简单的一句话,要让计算机理解起来并不简单。

3.歧义性

自然语言含有大量歧义,这些歧义根据语境的不同而表现为特定的义项。比如汉语中的多义词,只有在特定的上下文中才能确定其含义,甚至存在故意利用无法确定的歧义营造幽默效果的用法。除了上文“苹果”的两种意思之外,“意思”这个词也有多种意义。比如,下面这则经典的笑话。
他说:“她这个人真有意思(funny)。”她说:“他这个人怪有意思的(funny)。”于是人们以为他们有了意思(wish),并让他向她意思意思(express)。他火了:“我根本没有那个意思(thought)!”她也生气了:“你们这么说是什么意思(intention)?”事后有人说:“真有意思(funny)。”也有人说:“真没意思(nonsense)。”(原文见《生活报》1994.11.13. 第六版)[吴尉天,1999]①
这个例子中特地用英文注解“意思”的不同义项,从侧面体现了处理中文比处理英文更难。

但在编程语言中,则不存在歧义性②。如果程序员无意中写了有歧义的代码,比如两个函数的签名一样,则会触发编译错误。
① 摘自宗成庆《统计自然语言处理》。② 编程语言被特意设计为无歧义的确定上下文无关文法,并且能在 O(n) 时间内分析完毕,其中 n 为文本长度。
4.容错性

书刊中的语言即使经过编辑的多次校对,也仍然无法完全避免错误。而互联网上的文本则更加随性,错别字或病句、不规范的标点符号等随处可见。不过,哪怕一句话错得再离谱,人们还是可以猜出它想表达的意思。而在编程语言中,程序员必须保证拼写绝对正确、语法绝对规范,否则要么得到编译器无情的警告,要么造成潜在的 bug。

事实上,区别于规范的新闻领域,如何处理不规范的社交媒体文本也成为了一个新的课题。

5.易变性

任何语言都是不断发展变化的,不同的是,编程语言的变化要缓慢温和得多,而自然语言则相对迅速嘈杂一些。

编程语言由某个个人或组织发明并且负责维护。以 C++ 为例,它的发明者是 Bjarne Stroustrup,它现在由 C++ 标准委员会维护。从 C++ 98 到 C++ 03,再到 C++ 11 和 C++ 14,语言标准的变化是以年为单位的迁越过程,且新版本大致做到了对旧版本的前向兼容,只有少数废弃掉的特性。

而自然语言不是由某个个人或组织发明或制定标准的。或者说,任何一门自然语言都是由全人类共同约定俗成的。虽然存在普通话、简体字等规范,但我们每个人都可以自由创造和传播新词汇和新用法,也在不停地赋予旧词汇以新含义,导致古代汉语和现代汉语相差巨大。此外,汉语不断吸收英语和日语等外语中的词汇,并且也在输出 niubility 等中式英语。这些变化是连续的,每时每刻都在进行,给自然语言处理带来了不小的挑战。这也是自然语言明明是人类发明的,却还要称作“自然”的原因。

6.简略性

由于说话速度和听话速度、书写速度和阅读速度的限制,人类语言往往简洁、干练。我们经常省略大量背景知识或常识,比如我们会对朋友说“老地方见”,而不必指出“老地方”在哪里。对于机构名称,我们经常使用简称,比如“工行”“地税局”,假定对方熟悉该简称。如果上文提出一个对象作为话题,则下文经常使用代词。在连续的新闻报道或者一本书的某一页中,并不需要重复前面的事实,而假定读者已经熟知。这些省略掉的常识,是交流双方共有而计算机不一定拥有的,这也给自然语言处理带来了障碍。

比尔·盖茨有句话“自然语言理解是人工智能皇冠上的明珠”,广为人知。实际上,说“皇冠上的明珠”可能略微有些抽象,咱们随便举几个例子你就知道自然语言处理“妥妥”地无处不在了。

例子一

你有个问题,要去某搜索引擎搜答案。你在搜索框中输入问题,搜索框可不是你的人类朋友,瞬间 Get 你的意思——搜索引擎要在暗地里疯狂分析你想表达什么意思,这期间就会用到 NLP 的各种技术:中文分词、命名实体识别、实体链接、指代消解、知识图谱等。

例子二

大家买东西或者寄快递的时候经常会把自己的“姓名手机号地址”一股脑粘贴到一个方框里,系统就会自动分开,用的也是 NLP。

例子三

你是个英语或日语渣渣,看学术文章(ba gua xin wen)的时候你得找机器帮你翻译,这活儿也得靠 NLP。

例子四

目前给你提供服务的各种人工智能客服,虽然经常被你调戏,但是你得承认,人家基本任务完成得不错。

......

实现上面这些,自然语言处理有很多任务,下面我们逐一介绍一些常见的自然语言处理任务,了解下自然语言处理的整个宏观图景。

自然语言处理的层次

按照处理对象的颗粒度,自然语言处理大致可以分为图 1-2 所示的几个层次。



图1- 2 自然语言处理的层次

1.语音、图像和文本

自然语言处理系统的输入源一共有 3 个,即语音、图像与文本。其中,语音和图像虽然正引起越来越大的关注,但受制于存储容量和传输速度,它们的信息总量还是没有文本多。另外,这两种形式一般经过识别后转化为文本,再进行接下来的处理,分别称为语音识别(Speech Recognition)和光学字符识别(Optical Character Recognition)。一旦转化为文本,就可以进行后续的 NLP 任务。所以,文本处理是重中之重。

2.中文分词、词性标注和命名实体识别

这 3 个任务都是围绕词语进行的分析,所以统称词法分析。词法分析的主要任务是将文本分隔为有意义的词语(中文分词),确定每个词语的类别和浅层的歧义消除(词性标注),并且识别出一些较长的专有名词(命名实体识别)。对中文而言,词法分析常常是后续高级任务的基础。在流水线式① 的系统中,如果词法分析出错,则会波及后续任务。所幸的是,中文词法分析已经比较成熟,基本达到了工业使用的水准。
① 指的是前一个系统的输出是后一个系统的输入,并且前一个系统不依赖于后续系统。

词法分析不仅是自然语言处理的基础任务,学会它会成为我们构建NLP知识体系的基础。推荐阅读HanLP 作者何晗《自然语言处理入门》这本书,内容很务实。

3.信息抽取

词法分析之后,文本已经呈现出部分结构化的趋势。至少,计算机看到的不再是一个超长的字符串,而是有意义的单词列表,并且每个单词还附有自己的词性以及其他标签。

根据这些单词与标签,我们可以抽取出一部分有用的信息,从简单的高频词到高级算法提取出的关键词,从公司名称到专业术语,其中词语级别的信息已经可以抽取不少。我们还可以根据词语之间的统计学信息抽取出关键短语乃至句子,更大颗粒度的文本对用户更加友好。

值得一提的是,一些信息抽取算法用到的统计量可以复用到其他任务中,会在相应章节中详细介绍。

4.文本分类与文本聚类

将文本拆分为一系列词语之后,我们还可以在文章级别做一系列分析。

有时我们想知道一段话是褒义还是贬义的,判断一封邮件是否是垃圾邮件,想把许多文档分门别类地整理一下,此时的 NLP 任务称作文本分类。

另一些时候,我们只想把相似的文本归档到一起,或者排除重复的文档,而不关心具体类别,此时进行的任务称作文本聚类。

这两类任务看上去挺相似,实际上分属两种截然不同的算法流派,后面我们会分别讲解。

5.句法分析

词法分析只能得到零散的词汇信息,计算机不知道词语之间的关系。在一些问答系统中,需要得到句子的主谓宾结构。比如“查询刘医生主治的内科病人”这句话,用户真正想要查询的不是“刘医生”,也不是“内科”,而是“病人”。虽然这三个词语都是名词,甚至“刘医生” 离表示意图的动词“查询”最近,但只有“病人”才是“查询”的宾语。通过句法分析,可以得到如图 1-3 所示的语法信息。



图1- 3 句法分析结果

我们发现图 1-3 中果然有根长长的箭头将“查询”与“病人”联系起来,并且注明了它们之间的动宾关系。上面提到何晗那书中有详细介绍上面这种树形结构,以及句法分析器的实现方法。

不仅是问答系统或搜索引擎,句法分析还经常应用于基于短语的机器翻译,给译文的词语重新排序。比如,中文“我吃苹果”翻译为日文后则是“私は(我)林檎を(苹果)食べる(吃)”,两者词序不同,但句法结构一致。

6.语义分析与篇章分析

相较于句法分析,语义分析侧重语义而非语法。它包括词义消歧(确定一个词在语境中的含义,而不是简单的词性)、语义角色标注(标注句子中的谓语与其他成分的关系)乃至语义依存分析(分析句子中词语之间的语义关系)。

随着任务的递进,它们的难度也逐步上升,属于较为高级的课题。即便是最前沿的研究,也尚未达到能够实用的精确程度。

7.其他高级任务

除了上述“工具类”的任务外,还有许多综合性的任务,与终端应用级产品联系更紧密。比如:

● 自动问答,根据知识库或文本中的信息直接回答一个问题,比如微软的Cortana和苹果的Siri;

● 自动摘要,为一篇长文档生成简短的摘要;

● 机器翻译,将一句话从一种语言翻译到另一种语言。

注意,一般认为信息检索(Information Retrieve,IR)是区别于自然语言处理的独立学科。虽然两者具有密切的联系,但 IR 的目标是查询信息,而 NLP 的目标是理解语言。此外,IR 检索的未必是语言,还可以是以图搜图、听曲搜曲、商品搜索乃至任何信息的搜索。现实中还存在大量不需要理解语言即可完成检索任务的场景,比如 SQL 中的 LIKE。

作为入门知识,我们不会讨论这些高级任务,但了解自然语言处理的整个宏观图景有助于我们开拓视野,找准定位与方向。

上面我们比较了自然语言与人工语言的异同,展示了自然语言处理的困难所在,介绍了一些常见的 NLP 任务。下面我们简要介绍下进行自然语言处理的几种不同手法。

自然语言处理的流派

1.基于规则的专家系统

规则,指的是由专家手工制定的确定性流程。小到程序员日常使用的正则表达式,大到飞机的自动驾驶仪①,都是固定的规则系统。
① 区别于汽车的无人驾驶技术,飞机的自动驾驶系统只能处理预定情况,在异常情况下会报警或切换到手动驾驶。
在自然语言处理的语境下,比较成功的案例有波特词干算法(Porter stemming algorithm),它由马丁•波特在 1980 年提出,广泛用于英文词干提取。该算法由多条规则构成,每个规则都是一系列固定的 if then条件分支。当词语满足条件则执行固定的工序,输出固定的结果。摘录其中一部分规则为例,收录于表 1-1 中。



表1-1 波特词干算法规则集(部分)
② 下面的例子中,feed 为特殊情况,不是过去式,不执行替换。bled 是 bleed 的过去式,不应执行“去 ed”。sing 不是现在进行时,不应执行“去 ing”。
专家系统要求设计者对所处理的问题具备深入的理解,并且尽量以人力全面考虑所有可能的情况。它最大的弱点是难以拓展。当规则数量增加或者多个专家维护同一个系统时,就容易出现冲突。比如表 1-1 这个仅有 3 条规则的简单系统,规则 1 和规则 2 其实有冲突,类似 feed这样的单词会同时满足这两个规则的条件,从而引起矛盾。此时,专家系统通常依靠规则的优先级来解决。比如定义规则 1 优先于规则 2,当满足规则 1 的条件时,则忽略其他规则。几十条规则尚可接受,随着规则数量与团队人数的增加,需要考虑的兼容问题也越来越多、越来越复杂,系统维护成本也越来越高,无法拓展。

大多数语言现象比英文词干复杂得多,我们已经在上文了解了不少。这些语言现象没有必然遵循的规则,也在时刻变化,使得规则系统显得僵硬、死板与不稳定。

2.基于统计的学习方法

为了降低对专家的依赖,自适应灵活的语言问题,人们使用统计方法让计算机自动学习语言。所谓“统计”,指的是在语料库上进行的统计。所谓语料库,指的是人工标注的结构化文本,我们会在接下来的小节中详细阐述。

由于自然语言灵活多变,即便是语言学专家,也无法总结出完整的规则。哪怕真的存在完美的规则集,也难以随着语言的不停发展而逐步升级。由于无法用程序语言描述自然语言,所以聪明的人们决定以举例子的方式让机器自动学习这些规律。然后机器将这些规律应用到新的、未知的例子上去。在自然语言处理的语境下,“举例子”就是“制作语料库”。

统计学习方法其实是机器学习的别称,而机器学习则是当代实现人工智能的主流途径。机器学习在自然语言处理中的重要性非常之大,可以说自然语言处理只是机器学习的一种应用。此处我们仅仅用“举例学习”来简单理解下。

3.历史

既然自然语言处理是机器学习的应用层,那么如同人工智能的历史一样,自然语言处理也经历了从逻辑规则到统计模型的发展之路。图 1-4 列出了历史上几个重要的时间段。



图1- 4 自然语言处理的历史

20 世纪 50 年代是人工智能与自然语言处理的萌芽期,出现了许多奠基性的工作。其中最具代表性的是数学家阿兰•图灵在论文 Computing Machinery and Intelligence 提出的人工智能的充分条件——图灵测试,以及语言学家乔姆斯基的《句法结构》——认为句子是按某种与语境无关的普遍语法规则生成的。有趣的是,先驱们的早期估计或理论都过于乐观。图灵曾预言在2014 年一台 1 GB 内存的计算机就能以 70% 的概率在 5 分钟内不被识破机器的身份,然而这个乐观的预言截至今日也没有实现。而乔姆斯基的“普遍语法”则因为对语义的忽视而备受争议,并在后续理论中做了相应修正。无论是人工智能还是自然语言处理,都是任重道远的课题。

20 世纪 80 年代之前的主流方法都是规则系统,由专家手工编写领域相关的规则集。那时候计算机和计算机语言刚刚发明,从事编程的都是精英学者。他们雄心勃勃,认为只要通过编程就能赋予计算机智能。代表性工作有 MIT AI 实验室的 BASEBALL 以及 Sun 公司(2009 年被甲骨文公司收购)的 LUNAR,分别专门回答北美棒球赛事的问题和阿波罗探月带回来的岩石样本问题。这一时期还有很多类似的问答系统,都是主要依赖手写规则的专家系统。以BASEBALL 为例,其中的词性标注模块是这样判断 score 的词性的:“如果句子中不含其他动词,则 score 是一个动词,否则是名词。”接着该系统依靠词性上的规则合并名词短语、介词短语以及副词短语。语法模块则根据“若最后一个动词是主要动词并位于 to be 之后”之类的规则判断被动句、主语和谓语。然后该系统利用词典上的规则来将这些信息转化为“属性名 = 属性值”或“属性名 = ?”的键值对,用来表示知识库中的文档以及问句。最后利用类似“若除了问号之外所有属性名都匹配,则输出该文档中问句所求的属性”的规则匹配问句与答案。如此僵硬严格的规则导致该系统只能处理固定的问句,无法处理与或非逻辑、比较级与时间段。于是,这些规则系统被称为“玩具”。为了方便表述这样的规则逻辑,1972 年人们还特意发明了 Prolog(Programming in Logic)语言来构建知识库以及专家系统。

20 世纪 80 年代之后,统计模型给人工智能和自然语言处理领域带来了革命性的进展——人们开始标注语料库用于开发和测试 NLP 模块:1988 年隐马尔可夫模型被用于词性标注,1990年 IBM 公布了第一个统计机器翻译系统,1995 年出现第一个健壮的句法分析器(基于统计)。为了追求更高的准确率,人们继续标注更大的语料库(TREC 问答语料库、CoNLL 命名实体识别、语义角色标注与依存句法语料库)。而更大的语料库与硬件的发展又吸引人们应用更复杂的模型。到了 2000 年,大量机器学习模型被广泛使用,比如感知机和条件随机场。人们不再依赖死板的规则系统,而是期望机器自动学习语言规律。要提高系统的准确率,要么换用更高级的模型,要么多标注一些语料。从此 NLP 系统可以健壮地拓展,而不再依赖专家们手写的规则。但专家们依然有用武之地,根据语言学知识为统计模型设计特征模板(将语料表示为方便计算机理解的形式)成为立竿见影的方法,这道工序被称为“特征工程”。2010 年基于 SVM 的Turbo 依存句法分析器在英语宾州树库(Penn Treebank)上取得了 92.3% 的准确率①,是当时最先进的系统。统计模型及实现,它们并非高不可攀的技术,完全可以实现,且在普通的硬件资源下运行起来。
① 准确来讲,是斯坦福标准下忽略标点符号的 Unlabeled Attachment Score。
2010 年之后语料库规模、硬件计算力都得到了很大提升,为神经网络的复兴创造了条件。但随着标注数据的增加,传统模型的准确率提升越来越不明显,人们需要更复杂的模型,于是深层的神经网络重新回归研究者的视野。神经网络依然是统计模型的一种,其理论奠基于 20世纪 50 年代左右。 1951 年,Marvin Lee Minsky 设计了首台模拟神经网络的机器。1958 年, Rosenblatt 首次提出能够模拟人类感知能力的神经网络模型——著名的感知机。1989 年,Yann LeCun 在贝尔实验室利用美国邮政数据集训练了首个深度卷积神经网络,用于识别手写数字。只不过限于计算力和数据量,神经网络一直到 2010 年前后才被广泛应用,并被冠以“深度学习”的新术语,以区别于之前的浅层模型。深度学习的魅力在于,它不再依赖专家制定特征模板,而能够自动学习原始数据的抽象表示,所以它主要用于表示学习。

4.规则与统计

纯粹的规则系统已经日渐式微,除了一些简单的任务外,专家系统已经落伍了。20 世纪 70年代,美国工程院院士贾里尼克在 IBM 实验室开发语音识别系统时,曾经评论道:“我每开除一名语言学家,我的语音识别系统的准确率就提高一点。”① 这句广为流传的快人快语未免有些刻薄,但公正地讲,随着机器学习的日渐成熟,领域专家的作用越来越小了。
① 原话是“Every time I fire a linguist, the performance of the speech recognizer goes up”。
实际工程中,语言学知识的作用有两方面:一是帮助我们设计更简洁、高效的特征模板,二是在语料库建设中发挥作用。事实上,实际运行的系统在预处理和后处理的部分依然会用到一些手写规则。当然,也存在一些特殊案例更方便用规则特殊处理。

5.传统方法与深度学习

虽然深度学习在计算机视觉领域取得了耀眼的成绩,但在自然语言处理领域中的基础任务上发力并不大。这个结论或许有点意外,作为数据科学从业者,用数据说明问题最合适。表 1-2收录了《华尔街日报》语料库上的词性标注任务的前沿准确率。



表1- 2 词性标注准确率排行榜
② “作者姓 ( 年份 )”是一种常见的论文引用格式,可通过该信息(必要时加入主题关键词)搜索到论文。
截止 2015 年,除了 Bi-LSTM-CRF 以外,其他系统都是传统模型,最高准确率为 97.36%,而 Bi-LSTM-CRF 深度学习模型为 97.55%,仅仅提高了 0.19%。2016 年,传统系统 NLP4J 通过使用额外数据与动态特征提取算法,准确率可以达到 97.64%。

类似的情形也在句法分析任务上重演,以斯坦福标准下宾州树库的准确率为例,如表 1-3所示。



表1- 3 句法分析准确率排行榜

2014 年首个神经网络驱动的句法分析器还不如传统系统 TurboParser 准确,经过几年的发展准确率终于达到 95.7%,比传统算法提高 3.4%。这个成绩在学术界是非常显著的,但在实际使用中并不明显。

另一方面,深度学习涉及大量矩阵运算,需要特殊计算硬件(GPU、TPU 等)的加速。目前,一台入门级塔式服务器的价格在 3000 元左右,一台虚拟服务器每月仅需 50 元左右,但仅一块入门级计算显卡就需要 5000 元。从性价比来看,反而是传统的机器学习方法更适合中小企业。

此外,从传统方法到深度学习的迁移不可能一蹴而就。两者是基础和进阶的关系,许多基础知识和基本概念用传统方法讲解会更简单、易懂,它们也会在深度学习中反复用到(比如 CRF与神经网络的结合)。无论是传统模型还是神经网络,它们都属于机器学习的范畴。掌握传统方法,不仅可以解决计算资源受限时的工程问题,还可以为将来挑战深度学习打下坚实的基础。

——本文改编自《自然语言处理入门》



目录

第1章 新手上路

第2章 词典分词

第3章 二元语法与中文分词

第4章 隐马尔可夫模型与序列标注

第5章 感知机分类与序列标注

第6章 条件随机场与序列标注

第7章 词性标注

第8章 命名实体识别

第9章 信息抽取

第10章 文本聚类

第11章 文本分类

第12章 依存句法分析

第13章 深度学习与自然语言处理

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评6

fytvop 2023-12-14 21:42:53 显示全部楼层
写得清晰明了!
回复

使用道具 举报

ZTER 2023-12-14 21:43:18 显示全部楼层
转发了
回复

使用道具 举报

2490418687 2023-12-14 21:43:36 显示全部楼层
转发了
回复

使用道具 举报

没钱的老男人 2023-12-15 07:19:07 来自手机 显示全部楼层
楼主呀,,,您太有才了。。。
回复

使用道具 举报

ChineCivilize 2023-12-15 12:53:04 来自手机 显示全部楼层
求沙发
回复

使用道具 举报

srx102 2023-12-15 18:34:35 显示全部楼层
学习下
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies