解决中文分词歧义问题的最佳方法

释放双眼,带上耳机,听听看~!
本文介绍了解决中文分词歧义问题的最佳方法,包括最大匹配法和特殊规则法,并探讨了双向最大匹配法和全局评判标准。

中文分词中存在的歧义问题就是中文分词的歧义问题,他分为以下4种情况:

  • 如何清晰的界定中文词汇
  • 是先分词后理解,还是先理解后分词
  • 中文分词的歧义问题
  • 未登录词的识别问题

中文分词歧义看似是一个无解的问题,但是还是有一个巧妙的算法可以解决。

还是拿前面的例子说明下:

工作的和尚未工作的
工作/的/和/尚未/工作/的
工作/的/和尚/未/工作/的

这两个切分路径对于计算机来说都是一样的,【尚未】和【和尚】在词典里面都是词,计算机处理这种问题就很麻烦。而这种问题就是交集型歧义。

类似的例子还有很多:

  1. 严守一把手机关了
  2. 鞭炮声响彻夜空
  3. 大学生活动中心

最大匹配法

最大匹配法是最简单,也是最容易想到的一种解决方法,分为正向、逆向和双向,其原理大体是一样的。

  • 正向最大匹配法,是从左到右扫描切词的最大匹配
  • 逆向最大匹配法,是从右到左扫描切词的最大匹配
  • 双向最大匹配法,是通过对比正向和逆向的匹配结果,如果结果不同。则需要一个打分函数,来决定最优的切分路径。

下面以鞭炮声响彻夜空为例:

正向最大匹配法

解决中文分词歧义问题的最佳方法

从句子最左边开始扫描词典,匹配出最长词汇,鞭炮声,继续按照最大匹配原则进行扫描,然后会得到【响彻】和【夜空】,直到吧句子切分完成。

逆向最大匹配法

解决中文分词歧义问题的最佳方法

从句子最右边开始扫描词典,匹配出最长的词汇【夜空】,继续按照最大匹配原则进行扫描,然后就会得到【响彻】和【鞭炮声】,直到把句子切分完成。

最后这两种方法得到的切分结果都是一样的。都“鞭炮声/响彻/夜空”。是语义完全正确的。

研究表明,中文语言环境里面90%的句子,正向最大匹配法和逆向最大匹配法的结果完全重合并且正确,只有9%的句子两种方法的结果不一样,但是其中必然有一个是正确的,只有1%的句子,无论哪种方法结果都是错误的。

所以最大匹配法在中文分词工具里面得到了广泛的应用。

特殊规则法

最大匹配法无法切分正确那1%的句子应该如何处理呢?

先举这样一个例子:

北京大学生前来报道
正确的切分路径是:北京/大学生/前来/报道
最大匹配法切分路径是:北京大学/生前/来/报道

像这类的问题,有一些是很机械的,可以通过人工制定的规则来解决。效果也很不错:

规则1: 把一些字与字之间的搭配优先级事先定义好,比如:【会诊】后面如果出现了“断”、“疗”、“脉”、“治”时,那么要把【会】单独切出来。

规则2: 一个适用规则更加广泛,整理一份不能单独成词的字表。比如:“样”、“民”、“习”等等。这些字必须与其他字组合在一起成为词。一旦切分的过程中这些字被孤立出来。就需要重新考虑它与前面的字需要组词了。

比如:“为人民服务”,按照正向最大匹配法,结果是“为人/民/服务”。结果显然不对,如果应用了上述的规则,发现【民】被单独切分出来了。就需要重新调整切分路径。最后的结果就是:“为/人民/服务”。

整理这两类规则还是需要很多的人力成本,比较考验对于中文这一门语言的理解程度。不过确实是一种解决问题的方法。

在介绍最大匹配法的时候,我们还提到了一个概念,就是双向最大匹配法,需要引入一个打分函数,来确定最优的切分路径。下面我们就来研究一下这个打分依据。

从正向最大匹配和逆向最大匹配方法中,我们可以得知到,之前我们是按照句子从左到右的顺序逐一进行最大匹配的。那么我们是否可以把句子作为一个整体来考虑。从全局的视角去判断句子是否划分的合理。

有了这样的想法,接下来我们就要思考有什么样的全局评判标准呢?我们要怎么样判断一个句子划分的好不好呢?显而易见的是,很多人都会想到“分词后词总数变少”。词越少的划分,这个句子就越优秀。下面我们就按照这个思路去推导一下:

分词后词总数变少

为了实践我们的思路,需要先定义一个简单,可量化的计算方法。既然是想到词总数最少,那么计算方法就定义为每切出一个词,就罚一分,累计分数最少的就是词总数最小的。

以“公益权利和平等权利”为例子:

  • 按照正向最大匹配切分方法结果为:公众利益/和平/等/权利,词总数为4
  • 按照词总数最少切分结果为:公众利益/和/平等权利。词总数为3

说明有些情况下,词总数最少法比最大匹配法效果更好。

值得注意的是,最大匹配法是一种贪心算法,其很可能错过更优秀的切分路径。因为贪心算法在每一步的选择上都采取在当前情况下最好或者最优的选择。所以避免不了会陷入局部最优解的情况。

解决中文分词歧义问题的最佳方法

从A点到E点,找到一条最小值的路径,按照贪心算法,我们会得到这样一条路径A -> B -> E = 17 + 20 = 37,而更好的路径是A -> C -> D -> E = 18 + 10 + 5 = 33。

此时就下结论说,词总数最少法优于最大匹配法,还是不正确的,因为词总数最少法也有失手的时候。

举两个不同的类型的例子来说明一下:

  • “为人民办教育”,词总数最少法的切分结果是“为人 / 民办 / 教育”,但正确的结果则是“为 / 人民 / 办 / 教育”。
  • “为人民服务”,词总数最少法既可以切分出“为人 / 民 / 服务”,也可以切分出“为 / 人民 / 服务”,两个结果的词总数是相同的,并不能从中选出一个最佳答案。

我们为词总数最少法,添加上“不成词字表”的规则,每出现一个不成词的单字,就加罚一分。上面的例子就会得到如下的结果:

  • “为人 / 民 / 服务”的罚分:1 + 2 + 1 = 4
  • “为 / 人民 / 服务”的罚分:1 + 1 + 1 = 3

根据罚分最少的就是最好的切分路径原则,我们的结果是“为 / 人民 / 服务”,是我们想要的正确结果。 这样优化之后的算法,取得了出人意料的好效果。

小结:词总数最少法,切分路径结果里有多少词,就罚多少分,每出现一个不成词的单字,就加罚一分,罚分最少的就是最优的分词结果。

参考文献

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

PyTorch模型定义与保存

2023-12-14 11:03:14

AI教程

Stable Diffusion v1-5模型权重下载及使用教程

2023-12-14 11:14:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索