浅谈分词算法(1)分词中的基本问题

前言

分词或说切词是天然语言处理中一个经典且基础的问题,在平时的工做中也反复的接触到分词问题,用到了不一样的模型,不一样的方法应用在各个领域中,因此想对分词问题作一个系统的梳理。大多数分词问题主要是针对相似汉语、韩语、日语等,词语之间并无自然的分割,而像英语等,句子中是带有自然的分割的。可是英语也会涉及到分词问题,好比实体识别、词性标注等内容。而本系列文章更多的是讨论汉语中的分词问题,首先咱们从分词问题的基本出发,以后从传统的词典分词到将分词转为序列标注问题的分词,以及最新的结合深度学习的分词,基本按照时间顺序对分词模型可能用到的算法模型进行一步步尝试与介绍,全部代码我会放在本身的github上:xlturinggit

目录

浅谈分词算法(1)分词中的基本问题
浅谈分词算法(2)基于词典的分词方法
浅谈分词算法(3)基于字的分词方法(HMM)
浅谈分词算法(4)基于字的分词方法(CRF)
浅谈分词算法(5)基于字的分词方法(LSTM)github

分词中的基本问题

简单的讲,汉语自动分词就是让计算机在汉语文本中的词与词之间自动加上空格或其余边界标记。分词中涉及到三个基本问题:分词规范、歧义切分和未登陆词的识别。算法

分词规范

咱们从小学习汉语开始,基本顺序就是汉字->词语->句子->段落->篇章,而其中词是什么,什么是词语,这个问题看似有些莫名其妙,可是如何界定一个词语倒是分词中一个很重要的话题。有关专家的调查代表,在母语为汉语的被试者之间,对汉语文本中出现的词语的认同率只有大约70%,从计算的严格意义上说,自动分词是一个没有明肯定义的问题[黄昌宁等,2003]。举个简单的例子:
“小明看到湖岸上的花草,一株不知名的小花引发了他的注意”网络

对于这句话中的“湖岸”、“花草”、“不知名”等,不一样的词语界定方式就会出现不同的分词结果,如咱们能够切分红如下几种形式:学习

  1. “小明/看到/湖岸/上/的/花草/,一株/不知名/的/小花/引发/了/他的/注意”
  2. “小明/看到/湖/岸/上/的/花/草,一株/不/知名/的/小花/引发了/他的/注意”
  3. “小明/看到/湖岸/上的/花/草,一株/不知名的/小花/引发了/他的/注意”

咱们能够看出不一样的词语界定方式,能够组合出不少种分词结果,因此说分词能够看作是找寻一个没有明肯定义问题的答案。因此当咱们在衡量一个分词模型的好坏时,咱们首先须要肯定一个统一的标准,即所谓Golden Data,你们全部的模型都在统一的数据集上进行训练和评测,这样比较才会具备可参考性。htm

歧义切分

歧义字段在汉语中是广泛存在的,而歧义字段是汉语切分的一个重要难点。梁南元最先对歧义字段进行了两种基本的定义:blog

  • 交集型切分歧义:汉字串AJB称做交集型切分歧义,若是知足AJ、JB同时为词(A、J、B分别为汉字串)。此时汉字串J称做交集串。如,大学生(大学/学生)、研究生物(研究生/生物)、结合成(结合/合成).
  • 组合型切分歧义:汉字串AB称做多义组合型切分歧义,若是知足A、B、AB同时为词。如,起身(他|站|起|身|来/明天|起身|去北京)、学生会(我在|学生会|帮忙/个人|
    学生|会来|帮忙)

咱们能够看出歧义字段给咱们的分词问题带来了极大的困扰,因此想要正确的作出切分判断,必定要结合上下文语境,甚至韵律、语气、重音、停顿等。get

未登陆词识别

未登陆词,一种是指已有的词表中没有收录的词,另外一种是指训练语料中不曾出现过的词。然后一种含义也能够被称做集外词,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和调整。

若有任何纰漏,欢迎你们指正。

参考文献

  1. 《统计天然语言处理 第2版》