[TOC]
前言
分词或说切词是自然语言处理中一个经典且基础的问题,在平时的工作中也反复的接触到分词问题,用到了不同的模型,不同的方法应用在各个领域中,所以想对分词问题做一个系统的梳理。大多数分词问题主要是针对类似汉语、韩语、日语等,词语之间并没有天然的分割,而像英语等,句子中是带有天然的分割的。但是英语也会涉及到分词问题,比如实体识别、词性标注等内容。而本系列文章更多的是讨论汉语中的分词问题,首先我们从分词问题的基本出发,之后从传统的词典分词到将分词转为序列标注问题的分词,以及最新的结合深度学习的分词,基本按照时间顺序对分词模型可能用到的算法模型进行一步步尝试与介绍,所有代码我会放在自己的github上:xlturing。
目录
浅谈分词算法(1)分词中的基本问题
浅谈分词算法(2)基于词典的分词方法
浅谈分词算法(3)基于字的分词方法(HMM)
浅谈分词算法(4)基于字的分词方法(CRF)
浅谈分词算法(5)基于字的分词方法(LSTM)
分词中的基本问题
简单的讲,汉语自动分词就是让计算机在汉语文本中的词与词之间自动加上空格或其他边界标记。分词中涉及到三个基本问题:分词规范、歧义切分和未登录词的识别。
分词规范
我们从小学习汉语开始,基本顺序就是汉字->词语->句子->段落->篇章,而其中词是什么,什么是词语,这个问题看似有些莫名其妙,但是如何界定一个词语却是分词中一个很重要的话题。有关专家的调查表明,在母语为汉语的被试者之间,对汉语文本中出现的词语的认同率只有大约70%,从计算的严格意义上说,自动分词是一个没有明确定义的问题[黄昌宁等,2003]。举个简单的例子:
“小明看到湖岸上的花草,一株不知名的小花引起了他的注意”
对于这句话中的“湖岸”、“花草”、“不知名”等,不同的词语界定方式就会出现不一样的分词结果,如我们可以切分成以下几种形式:
- “小明/看到/湖岸/上/的/花草/,一株/不知名/的/小花/引起/了/他的/注意”
- “小明/看到/湖/岸/上/的/花/草,一株/不/知名/的/小花/引起了/他的/注意”
- “小明/看到/湖岸/上的/花/草,一株/不知名的/小花/引起了/他的/注意”
我们可以看出不同的词语界定方式,可以组合出很多种分词结果,所以说分词可以看做是找寻一个没有明确定义问题的答案。所以当我们在衡量一个分词模型的好坏时,我们首先需要确定一个统一的标准,即所谓Golden Data,大家所有的模型都在统一的数据集上进行训练和评测,这样比较才会具有可参考性。
歧义切分
歧义字段在汉语中是普遍存在的,而歧义字段是汉语切分的一个重要难点。梁南元最早对歧义字段进行了两种基本的定义:
- 交集型切分歧义:汉字串AJB称作交集型切分歧义,如果满足AJ、JB同时为词(A、J、B分别为汉字串)。此时汉字串J称作交集串。如,大学生(大学/学生)、研究生物(研究生/生物)、结合成(结合/合成).
- 组合型切分歧义:汉字串AB称作多义组合型切分歧义,如果满足A、B、AB同时为词。如,起身(他|站|起|身|来/明天|起身|去北京)、学生会(我在|学生会|帮忙/我的|
学生|会来|帮忙)
我们可以看出歧义字段给我们的分词问题带来了极大的困扰,所以想要正确的做出切分判断,一定要结合上下文语境,甚至韵律、语气、重音、停顿等。
未登录词识别
未登录词,一种是指已有的词表中没有收录的词,另一种是指训练语料中未曾出现过的词。而后一种含义也可以被称作集外词,OOV(out of vocabulary),即训练集以外的词。通常情况下未登录词和OOV是一回事,我们这里不加以区分。
未登录词大体可以分为如下几个类型:
- 新出现的普通词汇,如网络用语当中层出不穷的新词,这在我们的分词系统这种也是一大挑战,一般对于大规模数据的分词系统,会专门集成一个新词发现模块,用于对新词进行挖掘发现,经过验证后加入到词典当中。
- 专有名词,在分词系统中我们有一个专门的模块,命名体识别(NER name entity recognize),用于对人名、地名以及组织机构名等单独进行识别。
- 专业名词和研究领域名称,这个在通用分词领域出现的情况比较少,如果出现特殊的新领域,专业,就会随之产生一批新的词汇。
- 其他专用名词,包含其他新产生的产品名、电影、书籍等等。
经过统计汉语分词出现问题更多是由于未登录词造成的,那么分词模型对于未登录词的处理将是衡量一个系统好坏的重要指标。
常用的汉语分词方法
基于词典的分词方法
基于词典的方法是经典的传统分词方法,这种方式很直观,我们从大规模的训练语料中提取分词词库,并同时将词语的词频统计出来,我们可以通过逆向最大匹配、N-最短路径以及N-Gram模型等分词方法对句子进行切分。基于词典的分词方法非常直观,我们可以很容易的通过增减词典来调整最终的分词效果,比如当我们发现某个新出现的名词无法被正确切分的时候,我们可以直接在词典当中进行添加,以达到正确切分的目的;同样的过于依赖于词典也导致这种方法对于未登录词的处理不是很好,并且当词典当中的词出现公共子串的时候,就会出现歧义切分的问题,这需要语料库足够的丰富,从而能够对每个词的频率有一个很好的设置。
基于字的分词方法
不同于基于词典的分词方法,需要依赖于一个事先编制好的词典,通过查词典的方式作出最后的切分决策;基于字的分词方法将分词过程看作是字的分类问题,其认为每个字在构造一个特定词语时都占据着一个确定的构词位置(词位)[1]。这种方法最早由薛念文等人于2002年提出,并在各种分词大赛上取得了不错的成绩,尤其是对未登录词问题的处理,召回率一直很高。
一般情况下,我们认为每个字的词位有4种情况:B(Begin)、E(End)、M(Middle)、S(Single),那么我们对于一个句子的切分就可以转为对句子中每个字打标签的过程,举个例子:
- 自然语言处理/可以/应用/在/诸多/领域。
- 自B 然M 语M 言M 处M 理E 可B 以E 应B 用E 在S 诸B 多E 领B 域E。
我们对句子中的每个字赋予了一个词位,即BEMS中的一个标签,这样我们就完成了分词的目的。
基于字的方法将传统的语言学问题转换为了一个更加容易建模的序列标注问题,我们可以用最大熵模型为每个字进行标签分类;也可以利用HMM将其看作一个解码问题;或者考虑句子间的时序关系,利用判别模型CRF来建模;同样时下火热的深度学习中的LSTM也可以用在这里进行建模。
总结
本篇博文我们先简单介绍分词问题本身,其重点和难点是什么,已经大的方向上用到了哪些方法和模型,后续我们会选取常用的分词模型进行一一介绍和实现。这里需要特别说明下的是,本系列文章在介绍的时候是分开单个模型进行介绍的,在实际生产环境中,我们往往会融合多种方法来提高准确率和召回率,比如在github中经常被提及的结巴分词就融合了n-gram词典分词和HMM字分词,大家具体用到的时候要根据实际环境进行选择和搭配,必要的时候要对模型进行重train和调整。
如有任何纰漏,欢迎大家指正。
参考文献
- 《统计自然语言处理 第2版》