分词算法2

转自:http://www.busfly.cn/csdn/post/553.html

 

昨天下午研究了一下分词,看了一篇论文,和天网的一些介绍。
  为什么要对文章分词?我认为其意义可以归结为两点。
第一、匹配用户的搜索意图。
       我们将搜集来的网页分词,然后用词语来代表网页(也就是倒排索引文件)。我们再将用户的输入的查询条件分词,用这些词代表用户的查询意图。这样用户输入的“词”就可以和网页组成的词进行匹配,将满足的网页返还给用户。这似乎是搜索引擎的一个基本原理。
第二、分析网页的意义。
       大家知道,目前的计算机技术,不足以通过分析语法来了解一篇文章的意图。那一堆文字对于计算机又有什么另外的意义呢?其实前人做过很多研究,人们发现,一个词如果在文章中出现的频率很高,那么它对这篇文章就有某些特殊的意义(当然stopword不算)。我们也许没有必要把一篇文章看成是所有组成他的词的集合,换句话说,我们可以用几个出现频率较高的词来表示一篇文章的大方向。
      于是我们就开始对文章分词。
      目前对文章分词有两个方向,其中一个是利用概率的思想对文章分词。也就是如果两个字,一起出现的频率很高的话,我们可以假设这两个字是一个词。这里可以用一个公式衡量: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;
                   }
            }
      }

posted on 2009-05-10 11:50  Charles Huang @ CAS  阅读(217)  评论(0)    收藏  举报

导航