人工智能
直播中

郑啦啦

6年用户 237经验值
擅长:嵌入式技术
私信 关注
[讨论]

自然语言处理技术介绍

1.   前言

“自然语言处理”指用人类的自然语言与计算机系统进行通信、交互,是很多应用场景里不可缺少的技术,如:问答系统、信息检索、文本挖掘等。自然语言处理是综合学科,需要语言学、计算机科学、数学等专业知识。

本文主要介绍自然语言处理领域的一些常用技术。受限于本人在数据处理领域的实践经验,在示例的选择上,主要以个人的研发项目为主,包括自动应答系统、信息检索系统等。

1.1.  术语

l  

词是自然语言中最小的有意义的单元。

l  分词

这里不是指英语中的“过去分词”、“现在分词”,而是指将一句话切分成一个个词的组合序列。例如英文语句的分词是基于自然的分隔符“空格”对句子进行切分,除此之外,还需要解决其它问题,典型的如英文词干还原处理(cats,cat's,cats'等处理cat)、词性归并(如am,are,is处理成be),以及一些短语的处理(如"Los Angels'需要识别成一个词)。对于中文来说,语句中的词之间没有明显的自然分界符,因此需要一定的规则将字串切分为词串。

l  词袋模型

信息检索、自然语言处理领域经常用到的概念。指在表达一个文本时,忽略其词序、句法,而仅仅看做一组词的集合。文本中每个词的出现都是独立的,不依赖于其它词是否出现。在一些假设特征之间条件独立的算法(如朴素贝叶斯)中,通常采用词袋模型来表示文本。2.   自然语言处理技术

自然语言处理涉及很多方向,本文只试图介绍该领域常用的基础技术,包括:分词、词性标注、句法分析、命名实体识别,以及信息抽取领域的实体关系抽取等。

2.1.  分词

分词是自然语言处理技术的基础构成之一,并且是其它技术的基础。基于统计实现的词性标注、命名实体识别、句法分析等都需要依赖对句子进行正确的分词。中文和英文(或其它语种)都需要进行分词,但要解决的问题的侧重点不同,以下重点介绍中文分词技术。

  

2.1.1.   技术介绍2.1.1.1.            难点

   中文分词的难点主要包括“切分歧义”和“未登录词识别”:

一、切分歧义

    歧义是指同样的一个字串,可能有多种切分方法。歧义可以分为交叉歧义、组合歧义以及真歧义等。如下说明:

     1)交叉歧义 (字符串AJB,AJ和JB都是一个汉语词汇,会存在多种切分交叉在一起)

       示例:结婚的和尚未结婚的 。“和尚”和“尚未”的不同切分。

     2) 组合歧义(字符串AB是一个词汇,A和B同时也是词汇,会存在不同语义下切分不同)

      示例: 目前人手紧缺。“人/手”和"人手”的划分。

     3)真歧义(需要结合语用信息)

      示例:

           1)乒乓球拍卖完了

           2)你喜欢上一个人

  二、 未登录词

      当采用基于词典的匹配方法进行切词时,词典中没有登录过的人名、地名、机构名、新词、缩略语等,会引起切词困难。

示例:

       “司马小明住在龙泉村”,“ 不明觉厉”,“打酱油”等等。

2.1.1.2.            算法

     中文分词算法有很多种,目前工业界主流采用的分词算法可以分为两类:

一、机械分词算法

      是一种基于词典和人工规则的方法。是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功 (识别出一个词)。 匹配可以有多种策略,如按照扫描方向的不同,可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最 短)匹配等。

   优点:性能高(规则简单)、工程上使用方便(比如只要在词典里添加新词就可以支持新词的识别)。

   缺点:由于规则简单,所以消歧能力较弱;对于词典里的未登录词基本上无能为力。

   

二、基于统计的分词方法

      基于统计的分词法的基本原理是根据字符串在语料库中出现的统计频率来决定其是否构成词。词是字的组合,相邻的字同时出现的次数越多, 就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映它们成为词的可信度。具体做法是根据语料训练分词模型,典型的算法有HMM、CRF等。其中CRF(条件随机场) 相比HMM有更弱的上下文无关性假设,因此理论上效果更好一些。

       优点:由于是基于统计算法进行切分,因此理论上只要训练的语料库够全面,可以有较好的消歧能力和未登录词识别能力。

       缺点:速度较慢,可能无法满足一些对性能要求较高的工程应用;由于一般算法不支持模型的增量训练,对于新增的专业领域的语料,需要进行全量重新训练,花费时间较长,工程应用上较为麻烦;相同的字串片段在不同的上下文中,可能有不同的切分结果,存在一些不一致性问题,在一些应用上(如检索)可能导致召回率问题。

2.1.2.   应用分析

    在开源领域有很多分词算法,其中基于词典的机械分词算法比较多,常用的有IK、Ansj、paoding、盘古分词、mmseg4j等。基于统计的算法有stanford nlp(基于crf+词典)等。

    以下针对客服工单例子,分别使用机械分词(IK)和统计分词算法( stanford nlp segmenter)进行演示,可以看到各自的优缺点:

输入语句:(为了保护隐私,以下对地址和人名进行了部分修改)

201456日施工人员在福建省泉州市新碶街道黑牛村黄小明家118号进行施工时,多名施工人员存在与客户争吵、对客户态度差等问题

1)IK分词输出结果:

   2014 5 6 施工人员 福建省 泉州市 街道 小明 118 进行 工时 多名 施工人员 存在 客户 争吵客户 态度 差等 问题

2)stanford nlp分词输出结果:

2014 5 6 施工 人员 福建省 泉州市 碶街道 黑牛 黄小明 118 进行 施工 多名 施工 人员 存在 客户争吵 客户 态度 差等 问题

通过实验,可以看出:

1)IK分词对于未登录词“XX街道、XX村、XX人名”无法识别,拆成单字,而stanford nlp可以较好地识别未登录词(虽然stanford nlp对“新碶街道”也没有正确识别)。

2)stanford nlp的分词结果也存在一定问题:如将“态度差等问题”切成“态度”和“差等”两个词;“新碶街道”也未成功识别 。中国地大物博,历史久远,有很多生僻的地名。同时上下文语境的不同,也可能导致不同的分词结果。例如同样对于“新碶街道”,在别的语境下可能就是指””的”碶街道”。对于不同的语句序列,也存在不同的分词结果,以“新碶街道”为例,如果前面没有“福建省泉州市”的上下文,如“施工人员在新碶街道新牛村黄小明家118号进行施工时”,分词结果是“施工 人员 在 新碶 街道 …这在学术研究上可能不是大问题,但在工程应用上,却带来了不小的麻烦。

     因此基于统计的算法理论上可以通过补充更完备的训练语料库来提高分词准确率,但现实中不可能完全覆盖所有的情况,因此其准确率达到一定的程度也无法继续提高。

3)IK分词可以正确切分"态度差等问题”,是由于IK词典里存在“态度差”这个词,并且不存在“差等”这一词,所以可以正确切分。一旦我们把“态度差”从词典里去掉,并且增加“差等”这一词,则IK也会出现同样错误。由此可以看出机械分词对词典的依赖性,同时也可以看出使用的便利性(只要修改词典就可以改变切词结果),当然这种便利性有一定的局限性,由于机械分词的规则简单,在规则冲突的情况下,即使修改词典也不能保证所有分词的正确性。

4)通过对较大规模(几千句)的输入进行分词测试,可以看出ik分词的性能要高出几倍。

总结:不管是哪一种分词算法,目前都无法做到完全准确的切词,因此在实际应用中应该结合业务的具体特点,通过一些工程手段来减轻分词的影响。比如对于检索应用,一些场景下可以结合基于词典的机械分词和一元分词组合使用,来提高准确率和召回率以及其它一些工程问题;通过对用户输入的检索条件、后端数据进行分析挖掘,提取用户热词和新词,来完善词典。

2.2.  词性标注2.2.1.   技术介绍

词性标注(Part-of-Speech tagging 或POS tagging),是指为句子中每个单词标注一个词性类别,这里的类别包括名词、动词、形容词、连词、副词、标点符号等。

词性标注是语言识别、句法分析、信息抽取技术的基础技术之一,也可以直接应用在一些系统里,如问答系统等。

类似于中文分词技术,词性标注也可以看成是标注问题,因此可以应用最大熵、HMM或CRF等算法进行模型的训练。

2.2.2.   应用分析

由于词性标注需要依赖分词的结果,因此这里以上文的统计分词结果作为输入:

2014 5 6 施工 人员 福建省 泉州市 碶街道 黑牛 黄小明 118 进行 施工 多名 施工人员 存在 客户 争吵 客户 态度 差等 问题”。

词性标注结果:

2014/NT 5/NT 6/NT 施工/NN 人员/NN /P 福建省/NR 泉州市/NR /JJ 碶街道/NN 黑牛/NN/NN 黄小明/NR /NN 118/NT 进行/VV 施工/NN /LC /PU 多名/AD 施工/NN 人员/NN 存在/VV/P 客户/NN 争吵/VV /PU /P 客户/NN 态度/NN 差等/NN 问题/NN

2.2.2.1.            标注结果说明

以上标注集采用Penn TreeBank的词性标注的TagSet。这里做一下简单介绍:

Penn TreeBank为中文定义了一系列“标准”的词性及其简拼,包括动词、名词、定位词、代词、数字词、量词、副词、介词、连词、分词等类别,以及其子类别。

下面对示例输出结果里出现的词性进行简单说明:

NT表示时间名词,NN表示其它名词,P表示介词,NR表示专有名词,JJ定中关系的修饰词(示例中表示“新”的碶街道),AD表示副词,VV表示其它动词,LC表示定位词(之前、之后、为止、时、开始等)。

2.2.2.2.     分析

如果分词结果是错误的,那么会直接影响到词性标注的结果,如本例“差等”的标注。加上序列标注预测本身的错误率,因此词性标注的结果也不能保证完全正确。

词性标注可以认为一定程度上表达了浅层语义,除了作为更进一步的语义挖掘的基础外,有时候在生产环境中基于性能考虑,直接在检索、自动问答等系统中应用词性标注:

l  在自动问答系统里,为了提高用户问题匹配后端知识库时的召回率,我们对一些非关键词性的词进行了过滤,包括连词、副词、介词、定位词等。

l  对于全文检索系统,理论上也可以通过对用户输入的查询条件根据词性进行过滤,以屏蔽非关键词对搜索结果的影响。但由于全文检索是基于词袋模型的机械匹配,并且其通常采用IDF(逆文档频率)作为特征值之一,这类机制通常也能够降低常用的副词、连词等的权重的影响,因此直接应用词性标注进行过滤产生的效果可能并不明显。

2.3.  句法分析2.3.1.   技术介绍

句法分析目的是确定句子的句法结构,例如“主谓宾”、“动宾”、“定中”、“动补”等关系。

句法分析需要依赖某种预定的语法体系,目前比较常见的是采用依存语法表达,即通过语法树表达各个词之间的依存关系。目前广泛接受的依存语法定义有4条公理:

1) 一个句子只有一个成分是独立的

2) 句子中的其它成分直接从属于某一成分

3) 任何一个成分都不能从属于两个或两个以上的成分

4) 如果成分A直接从属于成分B,而成分C在句子中位于A和B之间,那么,成分C或者从属于A,或者从属于B,或者从属于A和B之间的某一成分

句法分析是进行进一步语义分析的基础。

           

2.3.2.   应用分析

句法分析的基础是分词与词性标注,因此句法分析也无法保证完全正确。

句法树表达了浅层语义,因此可以基于一定的规则从句法分析中分析出用户表达的真实语义。例如“我请你吃饭”和“你请我吃饭”,如果单纯地基于词袋模型表达,无法进行区分。而通过句法分析,可以有效地识别出主语和宾语的不同。

2.3.2.1.            示例1

在问答系统中,句法分析对于业务规则的处理很重要。以机器客服问答系统中的典型业务“我想查询我的电费”为例,进行句法分析。

句法解析树

1.jpg

依存关系结构

nsubj(-2, -1)

root(ROOT-0, -2)

ccomp(-2, 查询-3)

assmod(电费-6, -4)

case(-4, -5)

dobj(查询-3, 电费-6)

分析

从“dobj(查询-3, 电费-6)”(直接宾语结构)可以看到“查询”的“直接对象”是“电费”,而不是“我的”。

”assmod(电费-6, -4)”关联修饰)可以看到要查的是“电费”是属于“我 的”。



2.3.2.2.            示例2
对客服工单进行情感分析,如用户评价“你们的服务态度不错”,进行句法分析。

句法解析树
依存关系分析:
assmod(客服-3, 你们-1)case(你们-1, -2)assmod(真的-7, 客服-3)case(客服-3, -4)nn(真的-7, 服务-5)nn(真的-7, 态度-6)nsubj(很差-8, 真的-7)root(ROOT-0, 很差-8)
可以看到分析出来的最终基本语义是:“态度”“很差”。


2.3.2.3.            总结
由于通过句法分析可以获取用户表达的浅层语义,因此在问答系统、信息检索等领域都有重要的作用。以问答系统为例,可以通过句法分析提取用户提问的语义,与后端业务规则库的语义进行匹配,通过置信度等指标来匹配用户的问题。

句法分析提供了一种理解用户语义的可能性,但要在生产中有效地利用,还需要解决规则抽象、性能、准确性等带来的工程问题,这些都具有较大的挑战性。


2.4. 命名实体识别
2.4.1.   技术介绍
命名实体识别的目标是定位句子中出现的人名、地名、机构名、专有名词等。命名实体属于信息抽取领域的基本技术,通常用于挖掘文本中的实体并进行分析。命名实体识别是进一步进行实体关系识别的基础。

命名实体识别也可以看做是标注问题,因此可以采用HMMCRF等进行模型的训练。

基于统计的命名实体识别需要基于分词、词性标注等技术。

命名实体可以有多种分类方法,ACE08评测计划里定义了五大类实体类型:

设施(FAC)、地理政治实体(GPE)、位置(LOC)、组织(ORG)、人物(PER)。并定义了31种子类型。




2.4.2.   应用分析
命名实体不局限于以上类别,实际上可以根据自己的业务需求,自己定义实体类别,并进行模型的训练。例如可以定义“武器系统”的实体类别,用于对文本中出现的武器进行识别。

在问答系统中,通过对业务数据进行命名实体抽取,来辅助构建本体数据。也可以进一步对业务数据进行统计分析。比如在客服工单里,统计最经常出现抢修的地点(如村子)。

   以上面分词章节里的客服数据为例,进行命名实体识别。

输入

2014 5 6 施工 人员 福建省 泉州市 碶街道 黑牛 黄小明 118 进行 施工 多名 施工 人员 存在 客户 争吵 客户 态度 差等 问题

命名实体识别结果

         2014/MISC 5/MISC 6/MISC 施工/O 人员/O /O 福建省/GPE 泉州市/GPE /O 碶街道/O 黑牛/O /O 黄小明/PERSON /O 118/O 进行/O 施工/O /O /O 多名/O 施工/O 人员/O 存在/O /O 客户/O 争吵/O /O /O 客户/O 态度/O 差等/O 问题/O

用颜色标注的命名实体识别结果:
以上示例采用的模型只支持五个类别:LOC  PERSONORGGPEMISC(除前面四个外的其它类别都归为MISC)。O表示Others,其实就是代表不是预定义的实体类别,因此O可以忽略,我们可以看到识别出了“福建省”和“泉州市”两个地名实体,以及“黄小明”这个人物实体。

由于所采用的识别模型只支持几个大类,因此本例看起来没有什么实际用途。实际应用中可以根据业务数据的特点,自己定义更细粒度的实体类别,并人工标注语料来训练符合业务要求的模型。


2.5. 实体关系抽取
2.5.1.   技术介绍
实体关系抽取的目的是自动识别非结构化文档中两个实体之间的关联关系,属于信息抽取领域的基础技术之一,是进一步进行数据处理和数据挖掘的的前提。

实体关系抽取在信息检索、问答系统等领域有重要的意义。例如近年搜索领域流行的知识图谱技术,就是构建在实体关系抽取的基础上。

实体关系抽取是建立在命名实体识别的基础之上,基本任务就是寻找实体之间存在的特定关系。实体关系抽取有多种方式,包括规则匹配、有监督学习、无监督(或半监督)学习。其中有监督学习需要预先定义实体关系类别,并通常将问题建模为分类问题。有监督学习需要预先人工标注语料库,工作量大,因此在一些开放性数据集上,一些无监督(或半监督)算法也得到广泛应用。

一些常见的实体关系如下:从属关系(小明是杜克大学的教授)、组织结构(研发一部是研发中心的下属部门)、人物关系(小明是小红的爸爸)、地理位置关系(鼓浪屿位于厦门的南边)等。


2.5.2.   应用分析
实体关系抽取我们还没有实际开展应用,理解有限,因此以知识图谱为例介绍业界的实践。



知识图谱可以从语义层面上对知识进行组织,因此在信息检索、问答系统里有很重要的地位:

l 在信息检索领域,通过知识图谱可以从语义层面上进行搜索,改善检索结果和用户体验。例如在百度里搜索“岳飞是哪里人”,可以直接给出结果“相州汤阴县(今河南安阳汤阴县)”,而不是一堆关键字机械匹配的结果。

l 同样地,在问答系统里,基于知识图谱,可以有效地回答What的问题。



因此在行业应用中,我们可以通过实体关系抽取等技术构建行业特有的知识图谱,从而提高检索和问答系统的智能。


3.   应用总结
涉及自然语言处理的应用如信息检索等,一般都涉及较专业的背景知识,因此对程序员来说,仅仅是会进行API的组合调用,实现一些简单功能没有问题,但在一些较复杂的场景下,则不仅需要知其然,更需要知其所以然。以我所了解过的一个项目作为例子:

一个基于lucene的全文检索应用,负责开发的程序员一开始完全不知道中文分词,只是使用默认的一元分词,结果抱怨说查询不准。后来知道了中文分词这回事,恍然大悟后,就对一元分词深恶痛疾,完全排斥。结果又碰到了召回率、分词增量更新等问题,一头雾水无法解决。

上例是一个典型的不知所以然的反例,以常规MIS系统的经验设计、实现一些相对对专业背景知识要求较高的系统。因此对于在技术上有所抱负的程序员,我们有必要对一些专业技术进行更深入的理解和掌握。


3.1. 工程应用
自然语言处理技术为我们解决了语义的形式化表达的问题,但要进行生产应用,在工程上要考虑更多的因素


3.1.1.   准确性
基于统计机器自学习的自然语言处理的各个层次(分词、词性标注、句法分析、命名实体识别等),目前技术上都不能达到100%的准确,而如果准确率低于85%,在生产级别的应用中效果就会大打折扣,甚至不如不用。因此除了统计方法外,通常还需要辅以其它手段,如结合人工建设的各类词库,人工经验构建的各类规则等,或者其它工程手段,以提高技术的可用性。


3.1.2.   性能
基于统计模型的结果计算相对性能较弱(例如统计分词相对于基于Trie树进行匹配的词典分词,性能会差一个数量级),在生产应用中,除了准确率外,还要考虑性能的影响。以问答系统为例,对于系统的在线部分,为了提高响应性能,我们仅仅采用分词+词性标注对输入进行处理。而对于后端数据的离线处理,则考虑使用更深层次的语义分析等技术。


3.1.3.   模型的可用性
基于有监督学习的算法,需要使用者自行准备训练语料,并对语料进行人工标注,工作量往往很大。因此业界特别是开源社区经常会提供一些训练好的模型以方便使用者使用,所谓的拎包入住”。对于中文处理来说,一个常用的语料来源是北京大学计算语言学研究所 基于人民日报加工的语料。基于新闻语料训练出来的模型覆盖的广度较大,但对于行业应用来说,通常精度不够。在实际应用中,为了提高准确率和召回率,需要选择行业领域相关的数据进行语料加工及模型训练。而数据及语料的加工往往工作量较大(或很大),因此需要在应用中进行权衡。


3.1.4.   算法应用
期刊或者论文经常可以为我们提供很好的经验分享及实践思路。但应用在生产项目中时,需要注意取舍。根据经验,有不少文章是偏学术的,其往往存在适用范围、性能等的局限性,工程应用中需要考虑更多的因素,而不仅仅是做个DEMO,出一些对比指标。


3.2. 算法
基于统计的自然语言处理技术里有不少可以建模为序列标注问题(也包括其它问题,如实体关系抽取可以看做是分类问题),因此HMMCRF之类算法的应用占有较高的比例。掌握相关算法有助于自己加工语料及训练模型。以下以HMM为例进行标注算法的介绍(CRF模型采用比HMM更宽松的条件设定,但应用过程是类似的):

注:要把算法介绍清楚,专业性较强,涉及概率统计(极大似然估计)、动态规划算法(前向后向算法、维特比算法)等,需要较长的篇幅,不符合本文的定位,况且我自己也没有把握能在有限的时间里把细节都讲清楚。因此下文介绍的目标只是试图给大家一个较直观的印象。同时借用了一些外部的说明。具体算法细节可以参考专门的文章或者书籍。


3.2.1.   什么是标注问题
标注问题可以认为是分类问题的推广,其输入是一个观测序列,输出是一个状态序列。标注问题的主要任务之一是学习一个模型,使它能够基于观测序列预测状态序列。

举一个经典的以动作行为预测天气的例子:小明是你的朋友,住在纽约,由于互联网创业发了财,于是提前退休(很羡慕吧)。于是他每天无所事事,就是根据天气{下雨,天晴} 决定当天的活动{散步,购物,打游戏}(假定每天只能选择一种活动),而且他还喜欢在微信上报告自己的活动。于是你每天可以看到他要么是在公园散步,要么就是去梅西购物,要么在家里打VR游戏。在这个例子中,观测状态就是小明每天的活动,而隐藏状态就是纽约的天气。你可以根据他连续几天的活动内容,推断出这些天纽约的天气。


3.2.2.   HMM介绍
HMM(隐马尔可夫模型)是关于时序的概率模型,描述由一个隐藏的马尔科夫链随机生成不可观测的状态的随机序列,再由各个状态生成一个观测随机序列的过程。隐藏的马尔可夫链随机生成的状态的序列,称为状态序列(state sequence);每个状态生成一个观测,而由此产生的观测的随机序列,称为观测序列(observation sequence)。隐马尔可夫模型的参数包括初始概率分布、状态转移概率分布以及观测概率分布。

隐马模型有3个基本问题:

1)概率计算问题。给定模型Lamda(AB,pi)和观测序列O(o1o2,,oT),计算在模型下观测序列O出现的概率P(O| Lamda)

2)学习问题。已知观测序列O(o1o2,,oT),估计模型=(AB,pi)参数,使得在该模型下观测序列概率P(O|Lamda)最大。即用极大似然估计的方法估计参数。

3)预测问题,也称为解码(decoding)问题。已知模型=(AB, pi)和观测序列O(o1o2,,oT),求对给定观测序列条件概率P(I|O)最大的状态序列I(i1i2,,iT)。即给定观测序列,求最有可能的对应的状态序列


3.2.3.   应用示例
在分词、词性标注等任务里,要处理的就是学习问题和预测问题。以词性标注为例,句子可以看做是基于词的观测序列,句子里每个词的词性的集合看做是状态序列。分为模型学习和预测两个步骤:

模型学习:

首先通过加工过的语料集(已经标注了词性的句子),反向学习模型的各个参数: 初始概率分布、状态转移概率分布以及观测概率分布。这是模型训练过程。

    预测:

利用上一步骤训练好的模型,预测输入的句子里各个词的词性。这其实是求概率最大路径的问题,在这里维特比是一种常用的动态规划算法。

更多回帖

发帖
×
20
完善资料,
赚取积分