一、语言模型
1、什么是语言模型
条件概率语言模型就是计算条件概率的模型。
其中w1,w2,…,wn−1是句子中的前n−1个词(或字),wn是第n个词(或字)。
2、如何计算语言模型
即如何计算这个条件概率呢?
1、统计+平滑(工具实现:kenlm)
2、最大熵语言模型
3、CRF语言模型
4、神经网络模型
神经网络模型的大概思路是:p(wn|w1,w2,…,wn−1)是关于w1,w2,…,wnw1,w2,…,wn的一个函数,但是这个函数的具体形式我不知道,所以利用神经网络去拟合它,为了更好地拟合,并且减少模型参数,还把词语“嵌入”到实数空间中(one-hot的方式参数太多又稀疏所以用嵌入式表示为短向量),用短向量来表示词语,跟语言模型一起训练。从这个角度看,词向量只是语言模型的副产品。
二、基于字的语言模型进行分词
1、分词-最优切分路径-最大路径概率
分词的过程就是寻找最优切分路径的过程,路径概率最大的切分方式就是最优分词结果。
路径概率
一个长度为l的字符串s1,s2,…,sl,一种分词结果为w1,w2,…,wm,那么这种切分方式的路径概率计算为:概率乘积p(w1)p(w2)…p(wm)。
最大路径概率对应最优切分路径,对应最优分词。
2、如何计算路径概率?
我们既然要找到路径概率最大的切分方式,那路径概率p(w1)p(w2)…p(wm)怎么算呢?
贝叶斯展开求解最优路径,转化为语言模型即条件概率。
假如字符串s1,s2,s3…,sl,
A、如果不进行切分,那么它的路径概率应该是:
p(s1)p(s2)p(s3)…p(sl)
B、如果s1,s2应该合并为一个词,那么它的路径概率是:
p(s1s2)p(s3)…p(sl)=p(s1)p(s2|s1)p(s3)…p(sl)
C、如果s2,s3应该合并为一个词,那么它的路径概率是:
p(s1)p(s2s3)…p(sl)=p(s1)p(s2)p(s3|s2)…p(sl)
D、如果s1,s2,s3应该合并为一个词,那么它的路径概率是:
p(s1s2s3)…p(sl)=p(s1)p(s2|s1)p(s3|s1s2)…p(sl)
按照经验,词的平均长度不会很大,因此,我们只需要用n-gram语言模型就够了,其中n为4时效果就挺不错了。(只需要算unigram,2-gram,3-gram和4-gram即可)。
所以路径概率就是条件概率相乘。我们只需要提前算出来所有n-gram的概率,然后再结合切分路径去计算路径概率,路径概率最大的那个就是最优切分。(这个过程我们要借助viterbi算法来做)
3、具体分词时怎么操作
将分词转化为字标注问题
如果字语言模型取到4-gram,那么它相当于做了如下的字标注:
按照经验,词的平均长度不会很大,因此,我们只需要用n-gram语言模型就够了,其中n为4时效果就挺不错了。(只需要算unigram,2-gram,3-gram和4-gram即可)。
b:单字词或者多字词的首字
c:多字词的第二字
d:多字词的第三字
e:多字词的其余部分
想一想,是不是文本中每个字都会被标注为b,c,d,e的一种呢,而且对于超过4个字的长词也可以标注,比如‘克里斯汀·迪奥’,会被标注为'bcdeeee'。
所以,对于分词问题:
第一步:计算每个字分别被标注为b,c,d,e的概率;
第二步:用viterbi算法来寻找最优标注路径。
注意不是说某个词被标注为b的概率最大就一定会被标注为b,因为对于分词的标注有它自己的标注规则,比如b后面只能跟b和c,不能跟d和e吧,c后面只能跟d和b等等。所以用viterbi算法来寻找最优标注路径。
那第一步,如何去计算每个字分别被标注为b,c,d,e的概率呢?
计算每个字的标注概率具体怎么算:
1、训练语言模型比如用统计+平滑的方式计算语言模型,选用工具kenlm来训练。这个工具可以得到grams的联合概率,如p(a),p(b),p(c),p(ab),p(bc),p(adc)。
2、计算条件概率即语言模型。
根据贝叶斯公式,就可以算出条件概率。如p(b/a)=p(ab)/p(a)
3、条件概率即是每个字被标注为b,c,d,e的概率值。
第二步,viterbi算法计算时,需要状态转移概率,即b,c,d,e之间的转移概率。结合刚才说的一些规则,不为0的转移概率如下:
p(b|b),p(c|b),p(b|c),p(d|c),p(b|d),p(e|d),p(b|e),p(e|e)
这些转移概率的取值可以统计获得,经验设定。
已知转移概率、条件概率(对应HMM中发射概率),代入viterbi算法,就可以得到最优切分路径。
为啥说条件概率对应HMM中的发射概率呢?
因为每个字的标注概率b,c,d,e的计算公式是条件概率,而发射概率本身的意思就是在字预测为b,c,d,e的概率。所以两者是一个东西。
三、代码实现
基于语言模型的无监督分词算法实现,见WordSegWithNgram
网友评论