天天看点

jieba分词_从语言模型原理分析如何jieba更细粒度的分词

jieba分词是作中文分词常用的一种工具,之前也记录过源码及原理学习。但有的时候发现分词的结果并不是自己最想要的。比如分词“重庆邮电大学”,使用精确模式+HMM分词结果是["重庆","邮电大学"] 。有时候我们想要的是["重庆","邮电","大学"],这种更加细粒度的分词结果。总结收集了网上的方法,主要包括两种:

  • 调整词频,降低长词词频,或提高短词词频(有时候会失效,后面会从原理角度进行解释)
  • 修改jieba源码,在生成DAG的时候限制词的长度

目录

  • 方法一:调整词频

实验

原理分析

  • 方法二:修改源码
  • 总结

方法一:调整词频

实验

jieba分词_从语言模型原理分析如何jieba更细粒度的分词

如图一:三个词语都存在于词典中(HMM不起作用),其中“邮电大学”的词频是最低的。接下来尝试降低长词词频,将“邮电大学”词频从3改到1。

jieba分词_从语言模型原理分析如何jieba更细粒度的分词

图二

然而分词结果并未发生什么变化,接着尝试提高短词“邮电”,“大学”两个词的词频,修改到一个看起来比较大的值10000,再尝试分词。

jieba分词_从语言模型原理分析如何jieba更细粒度的分词

图三

结果还是没有分开,继续加到20000,尝试。

jieba分词_从语言模型原理分析如何jieba更细粒度的分词

图四

这次分开了,所以当短词的词频足够大的时候,有可能将它分开,接下来解释原理。

原理分析

简单的回顾下jieba的大致原理:根据词典构建所有分词可能的DAG(有向无环图),再用基于unigram的语言模型评估,选择最好的一种分词方式。即计算出使得

jieba分词_从语言模型原理分析如何jieba更细粒度的分词

最大的

jieba分词_从语言模型原理分析如何jieba更细粒度的分词

。其中

jieba分词_从语言模型原理分析如何jieba更细粒度的分词

,显然取值范围在0-1。对P(s)取对数后

jieba分词_从语言模型原理分析如何jieba更细粒度的分词

分词的粒度越细,参与P(s)乘法计算的项越多,而每一项的值都在0-1之间。因此该方法更倾向于得到分词数量少的结果。拿上面的例子来说:

P(重庆,邮电,大学) = P(重庆)*P(邮电)*P(大学)

P(重庆,邮电大学) = P(重庆)*P(邮电大学)

后者的概率是很容易大于前者的,即使"邮电大学"的词频很小。只有当"邮电","大学"的词频足够大时,后者才能小于前者。这就解释了有时候将短词的词频调的比较大,但是仍然不起作用。不同场景下,这个"足够大"的词频数值不同,可以肯定的是,你需要的粒度越细,对短词词频就要设置很大。

所以说,从调整词频的角度来看,想要得到”更长一点的分词结果“比得到”短一点的分词结果“容易得多。

调整词频方法总结

当你需要细粒度的分词时,调整词频:

  1. 将长词从词典去掉,或者设置词频为0。
  2. 增加短词词频到非常大(不建议使用,这样使得短词变得超级重要,影响词频分布)

方法二:修改jieba源码

这种方法和将长词词频设为0类似,限制分词长度,让长词不参与计算,只不过从代码角度实现。

原始构造DAG的函数如下:

def 
           

修改其中的循环条件为:

while 
           

其中num表示你要限制的最大分词长度,这样长度超过num的分词结果就不会考虑进DAG。

总结

  1. 当你需要让某些特定的长词细粒度划分时,把这个词的词频设置为0(删掉)。

2. 当你不知到具体需要细分的词语,又需要整体粒度更细的时候,尝试在源码中限制分词的长度。

3.探索更好的分词工具。

继续阅读