前段时间仔细看了52nlp的关于隐马尔科夫模型(HMM)的介绍,深入浅出,真的是非常好的教材,再次感谢一下52nlp的辛勤劳作。这里,本人打算写一下个人运用HMM做分词的过程,目的有两个,一个是对之前工作的一个总结,梳理下自己的思路,另一个是和大家做一个交流。

如果对HMM不熟悉的话,推荐先看一看52nlp的系列文章《HMM学习最佳范例》,本文假设读者已经对HMM有所了解,很多地方会直接提出相关概念。理解前向算法,维特比算法是关键,关于无监督学习HMM的Baum-Welch算法在本文中没有使用,至少了解它的作用即可。

总所周知,在汉语中,词与词之间不存在分隔符(英文中,词与词之间用空格分隔,这是天然的分词标记),词本身也缺乏明显的形态标记,因此,中文信息处理的特有问题就是如何将汉语的字串分割为合理的词语序。例如,英文句子:you should go to kindergarten now 天然的空格已然将词分好,只需要去除其中的介词“to”即可;而“你现在应该去幼儿园了”这句表达同样意思的话没有明显的分隔符,中文分词的目的是,得到“你/现在/应该/去/幼儿园/了”。那么如何进行分词呢?主流的方法有三种:第1类是基于语言学知识的规则方法,如:各种形态的最大匹配、最少切分方法;第2类是基于大规模语料库的机器学习方法,这是目前应用比较广泛、效果较好的解决方案.用到的统计模型有N元语言模型、信道---噪声模型、最大期望、HMM等。第3类也是实际的分词系统中用到的,即规则与统计等多类方法的综合。

我计划在 本系列文章中完成以下工作,首先在52nlp的工作基础上对HMM模型做一些补充,然后制作一个HMM的分词器,之后分析其缺点,最后制作一个混合分词器。如果有任何不足的地方,欢迎大家拍砖!

作者 itenyh

《Itenyh版-用HMM做中文分词一:序》有5条评论
  1. 您好,刚接触HMM时间不长,在这向您请教一个HMM的问题,我现在用连续HMM,输出概率使用高斯加权输出,sum(w(i)*N(i)),其中求N的时候总是溢出(因为连乘,导致N太小,计算机无法表示而置为0),这个问题在实际中应该经常遇到,该怎么解决呢?非常感谢

    [回复]

    itenyh 回复:

    在不影响计算结果的前提下,考虑一下使用f(x)=ln(x),这是一个增函数,那么argmax p(x1)*p(x2)*p(x3)..... = argmin -lnP(x1) - lnP(x2)-lnP(x3).....,这样可以避免连乘导致的溢出。我也用到了这个技巧,不知道能不能解决你的问题。

    [回复]

    Garfield 回复:

    这样做确实可以防止溢出,但我只要这样用,最后估计得高斯参数中:某一个状态下,各个高斯分量的均值基本上都相等了,加权就变得没意义了,不知道怎么解决

    [回复]

    itenyh 回复:

    这个我就不清楚了,希望其他人能帮你解决吧

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注