分词任务
- 中文分词
- 正向最大匹配
- 实现方式一
- 实现方式二
- 反向最大匹配
- 双向最大匹配
- jieba分词
- 上述分词方法的缺点总结
- 基于机器学习
- 总结
- 分词技术
- 经验总结
中文分词
正向最大匹配
分词的步骤
1.收集整理一个词表,类似于字典。如下图
2.对于待分词的句子,或者字符串,从前向后寻找最长,在词表中出现的词。
3.并循环执行1-2;直到字符串末尾
释义: 上述中,在句子中找到的最长匹配的词就是北京大学,切割后,继续寻找、依次类推
实现方式一
1.先
找出词表中最大词的长度
,上述中,最大为北京大学,为4
2.从字符串最左侧开始,按照最大词的长度
,即为4,设置一个窗口,检查第一个窗口中的词是否在词表中,即是否为最大词
3.如果在词表中,
则在词的边界,即右侧进行划分
,然后向右
移动,截取下一个窗口;
4.如果不在词表中,则右侧回退一个字符
,就是缩小一个窗口,看剩下的窗口内的字符是否为一个词,是的话,就截取;不是就继续缩小
。截取后,在截取的边界继续执行第3步
5.循环执行上述3-4步骤;完成整个句子的切割
实现方式二
特点 构建的词表有些特点
举例说明: 根据我们前面有词表:北京、北京大学、生前、报道
我们构建出词表如下:
释义:
上述构建的词表中,0代表前缀;1代表一个真正的词
我们想要构建的词表的每一个词都可以通过上述的构建方式表示出来
分词的逻辑
1.首先还是从字符串的左侧到右侧,从前往后走,并且每次只取一个字
2.取到第一个字,在词表中判断,是否为前缀或者是一个词,如果都不是,则直接在该处切分
3.如果是前缀或者是词,则往右侧多走一个字,用这两个字判断是否为前缀或者词,如果都不是,则切分;否则,循环第3步
4.循环2-3步;直接完成切分
如下图:
反向最大匹配
释义: 即和正向最大匹配的方向相反
,正向最大匹配是从左往右,从句子的前往后,反向最大匹配,就是从右往左,从句子后到前,进行匹配
;其他的匹配逻辑和方案都相同
如图所示:
双向最大匹配
释义: 同时进行正向最大切分、负向最大切分,之后比较两者的结果,最后决定一句话的切分,采用那种切分结果
比较的策略:
- 单字词:词表中可以有单字词,从分词的角度,我们会把他看成一个词;一般单字词少,切分效果相对好些
- 非字典词:未在词典出现过的词,一般会分为单字词;比如,文本中出现的英文、一串数字等
- 词总量,两种方法,在切割同一个句子时,可能获得的词量是不一样的,一般来说,词总量越少,分的相对会好些
jieba分词
介绍:jieba是一个python库,可以方便的做中文分词
分词逻辑:
1.在做这个任务前,就有一个分好词的语料,这个语料分的很好,并且,将其中的每个词的出现的频次统计出来,即
事先有一份词频的表
2.然后根据词表,将一句话,或者需要分词的语料中所有的切分方式,切分出来
3.统计每种方式的总词频数
,选取切分结果最高的作为分词结果
如图:
上述分词方法的缺点总结
- 对词表极为依赖,如果没有词表,则无法进行;如果词表中缺少需要的词,结果也不会正确
- 切分过程中,不会关注整个句子的意思,而是机械的切割一个个片段
- 文本中的错别字问题无法解决,会造成连锁的切分错误
- 对实体名无法枚举到词表中,比如:城市名、人名等;但是这些词却会造成切分的错误
基于机器学习
释义: 我们将上述分词的任务,转化为一个分词模型的训练任务,用模型去解决分词问题。
分词转化为分词模型的逻辑:
1.分词本质上是需要将一句话按照其内在的含义,将去拆分开,那么我们
用模型如何去表示和预测相关信息,可以表示去语义的拆分呢?
2.RNN模型
,是将一句话的每一个字按照顺序输入,并且每个字计算后都会有个输出结果,那么我们可以根据每个字的输出结果判断是否在该位置拆分
3.这样就转化为,用RNN模型去预测当前句子的每个字的位置是否拆分的问题,
4.对句子中的每一个词进行2分类判断的任务:即如下所示,1表示边界,0表示不是边界
总结
分词技术
- 对于中文分词的研究在逐渐减少
- 目前的分词在由大部分情况下,效果已经比较理想,优化空间不大
- 分词即使发生错误,下游任务不是一定发生错误,所以不值得花大量精力优化分词
- 随着神经网络和预训练模型的兴起,中文任务逐渐不再需要分词,甚至不做分词,效果更好
经验总结
- 相同的任务有不同的算法可以完成,其结果和效率各有优劣
- 空间换时间,是一种常用的提升性能思路
- 多种算法组合使用,可能会获得更好的结果