分词,难在哪里?| 科普 + 解决方案!
作者:CQITer小编 时间:2018-09-10 16:30

一、前言
分词,我想是大多数大前端开发人员,都不会接触到的一个概念。这个不影响我们了解它,毕竟我们要多方向发展。今天就来简单介绍一些分词,我尽量用简介的语言来描述这个概念,并且最后再提供一个解决方案,希望对你有帮助。
分词简单来讲就是把一句话,按照词义,切分成一个个单独的词。这么说可能没什么感觉,先看看它适用的场景,分词是文本挖掘的基础,通常会用于自然语言处理、分词搜索、推荐等等领域。
二、分词的原理和算法
2.1 什么是分词
先理解一下分词的概念。
分词就是将连续的字序列,按照一定的规范重新组合成词序列的过程。在英文中,单词之间会以空格作为分割符,将词与词之间进行分割,但是对于中文,没有一个显式的分割符。
正是因为缺乏这种显式的分割符,导致我们对中文中的词,进行分割的时候会出现很多的偏差。
2.2 分词的算法
中文分词有难度,不过也有成熟的解决方案。现有的分词算法,大概可分为三类:
基于字符串匹配的分词算法
基于理解的分词算法
基于统计的分词算法
1. 基于字符串匹配的分词算法
这种分词方法,又叫机械分词算法,它会提前维护一个大的字典,然后将句子和字典中的词进行匹配,若匹配成功,则可以进行分词处理。
当然,它实际上会更复杂一些,因为当字典足够大的时候,就又涉及到不同的匹配算法,这里就不展开讲了。通常会基于 Trie 树结构,来实现高效的词图扫描。
2. 基于理解的分词算法
这种分词方法,通过让计算机,模拟人对句子的理解,达到识别词组的效果。其基本思想是在分词的同时进行句法、语义的分析,利用句法和语义信息来处理歧义现象。
它通常会包含三部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息,来对分词歧义进行判断,即它模拟了人对句子的理解过程。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
3. 基于统计的分词算法
这种方法会给出大量已经分词的文本,利用统计机器学习模型,学习词语切分的规律(称为训练),从而实现对未知文本的切分。
随着大规模语料库的建立,统计机器学习方法的研究和发展,基于统计的中文分词方法渐渐成为了主流方法。
2.3 分词的诉求
虽然分词的算法,讲解起来很简单,但是从现有的经验来看,几乎是不存在通用且效果非常好的分词系统。
每个领域,都有其独特的词汇,这很难通过有限的训练数据,捕捉到所有的语言特征。例如:通过人民日报训练的分词系统,在网络玄幻小说上,分词的效果就不会好。
这是必然的,在分词系统中,没有银弹。
不同的场景,对分词的要求也差异很大,通常可以从两个维度进行区分:分词速度、分词准确性。
例如分词搜索,对速度要求就高于准确性的要求。而一些问答系统中,则需要对文本实现较深的理解,要求准确性高于速度要求。
不同的领域,不同的使用场景,对分词的要求是不同的,所以我们不能片面的去理解分词的准确率。并且随着新词的增加,训练数据的变化,分词的准确率也是在波动的。这也就是,现在吹嘘分词准确率的公司越来越少的原因。
2.4 分词的解决方案
分词是可以解决实际问题的功能,经过这么长时间的反复迭代更新,市面上一家产生了一批有特色的分词系统。例如:IK、Jieba、Ansj、Hanlp、Stanford分词 等等。
有兴趣可以一个个了解,接下来就其中的一个开源库 Jieba,进行讲解。
三、jieba
3.1 jieba 的优点
jieba 是开源的,号称是 Python 中,最好的中文分词组件。并且是基于 MIT 的协议,使用起来无后顾之忧。
jieba 使用起来也非常的简单,几行代码就可以实现分词调用和词性标注,而且速度还不错。
它内部维护了一个词典,是根据人民日报分析获得,在超出词典之外的新词,会基于 HMM 模型进行识别。




