“自然语言处理”指用人类的自然语言与计算机系统进行通信、交互,是很多应用场景里不可缺少的技术,如:问答系统、信息检索、文本挖掘等。自然语言处理是综合学科,需要语言学、计算机科学、数学等专业知识。
本文主要介绍自然语言处理领域的一些常用技术。受限于本人在数据处理领域的实践经验,在示例的选择上,主要以个人的研发项目为主,包括自动应答系统、信息检索系统等。
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)进行演示,可以看到各自的优缺点:
输入语句:(为了保护隐私,以下对地址和人名进行了部分修改)
2014年5月6日施工人员在福建省泉州市新碶街道黑牛村黄小明家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在问答系统中,句法分析对于业务规则的处理很重要。以机器客服问答系统中的典型业务“我想查询我的电费”为例,进行句法分析。
句法解析树:
依存关系结构:
更多回帖