[转载]分词算法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值