逆向分词

    技术2022-05-20  37

    目前对中文分词有两个方向,其中一个是利用概率的思想对文章分词。也就是如果两个字,一起出现的频率很高的话,我们可以假设这两个字是一个词。这里可以用一个公式衡量:M(A,B)=P(AB)/P(A)P(B),其中A表示一个字,B表示一个字,P(AB)表示AB相邻出现的概率,P(A)表示A在这篇文章中的频度,P(B)表示B在这篇文章中的频度。用概率分词的好处是不需要借助词典的帮助,坏处是算法比较麻烦,效率不高,也存在一定的出错率。另外的一个方向是使用词典分词。就是事先为程序准备一个词典,然后通过这个词典对文章分词。目前较流行的方式有正向最大匹配算法和逆向最大匹配算法。逆向最大匹配算法在准确性上要更好一些。

    以 “我是一个坏人” 为例

    正向的顺序为我是一我是我 ===> 得到一个词是一个是一是 ===>得到一个词一个坏一个===> 得到一个词坏人===>得到一个词结果 我、是、一个、坏人

    反向算法个坏人坏人==> 坏人是一个一个==> 一个我是是==> 是我==> 我结果 我、是、一个、坏人

    逆向最大匹配:(1)将文章分成句子(通过标点符号来实现);(2)循环的读入每一个句子S,设句子中的字数为n;(3)设置一个最大词长度,就是我们要截取的词的最大长度max;(4)从句子中取n-max到n的字符串subword,去字典中查找是否有这个词。如果有就走(5),没有就走(6);(5)记住subword,从n-max付值给n,继续执行(4),直到n=0。(6)将max-1,再执行(4)。

    伪代码如下:max=4;for(i..N){   sentence = 读入下一个句子; n = 取字数(sentence);for(j=n;j>0;){subword = 截取字符串(j-max,j);flag=去字典中查找(subword);if(flag){//找到这个词记住(subword);j=n-max;}else{for(k=max;k>0;k--){tempWord=截取字符串(subword.length-max,subword.length,subword)temFlg=去字典中查找(subword);if(temFlg)break;}记住(tempWord)j=n-max+k;}}}


    最新回复(0)