4.7 N元分词方法
在介绍N元模型之前,让我们先来做个香农游戏(Shannon Game)。我们给定一个词,然后猜测下一个词是什么。当我说"NBA"这个词时,你想到下一个词是什么呢?我想大家有可能会想到"篮球",基本上不会有人想到"足球"吧。
切分出来的词序列越通顺,越有可能是正确的切分方案。N元模型主要用来衡量词序列搭配的合理性。N元模型指句子中在n个单词序列后出现的单词w的概率。
![]() |
但是这种方法存在两个致命缺陷:一个缺陷是参数空间过大,不可能实用化;另外一个缺陷是数据稀疏严重。为了解决这两个问题,我们引入了马尔科夫假设:一个词的出现仅仅依赖于它前面出现的有限的一个或者几个词。
如果简化成一个词的出现仅仅依赖于它前面出现的一个词,那么就称为二元模型(Bigram),即:
![]() |
如果简化成一个词的出现仅仅依赖于它前面出现的两个词,就称为三元模型(Trigram)。
在实践中用得最多的就是二元模型和三元模型了,而且效果很不错。高于四元的模型用得很少,因为训练它需要更庞大的语料,而且数据稀疏严重,时间复杂度高,精度却提高得不多。
二元模型考虑一个单词后出现另外一个单词的概率,是N元模型中的一种。例如:一般来说,"中国"之后出现"北京"的概率大于"中国"之后出现"北海"的概率,也就是:
![]() |
- 中国@北京:100
- 中国@北海:1
可以把二元词表看成是基本词表的常用搭配。分词初始化时,先加载基本词表,对每个词编号,然后加载二元词表,只存储词的编号。
对于拼音转换等歧义较多的情况也可以采用三元模型(Trigram),例如:
![]() |
因为有些词作为开始词的可能性比较大,例如"在那遥远的地方"、"在很久以前",这两个短语都以"在"这个词作为开始词。因此,在实际的N元分词过程中,增加虚拟的开始节点(Start)和结束节点(End),分词过程中考虑P(在|Start)。如果把"有意见分歧"当成一个完整的输入,分词结果实际是:"Start/ 有/ 意见/ 分歧/ End"。