基于字典的中文分词算法RMM

3/8/2017来源:ASP.NET技巧人气:508

引言:目前针对中文分词一般有基于字典,基于统计(HMM等),基于规则的分词方法,然而其中基于字典的中文分词是最基础,同时也是最高效的方式,但分词精度取决与字典的规模。 一.基于字典的中文算法简介 1.定义:按照一定策略将带分析的汉字串与一个大机器字典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功.所以也称为机械匹配。 按照扫描方向的不同:正向匹配和逆向匹配 按照长度不同:最长匹配和最小匹配 2.正向最大匹配算法MM 1)从左向右取待切分汗语句的m个字符作为匹配字段,m为大机器字典中最长词条个数。 2)查找打机器词条并进行匹配, 若匹配成功,则将这个匹配字段作为一个词切分出来。 3)若匹配不成功,则将这个匹配字段的最后一个字去掉,剩下来的字符串作为新的匹配字段, 继续进行再次匹配,重复以上过程,直到切分出所有词为止. 3.逆向最大匹配算法RMM 该算法是正向最大匹配的逆向思维(最大匹配的顺序不是从首字母开始,而是从末尾开始),匹配不成功, 将匹配自大un的最前一个字去掉,实验表明,逆向最大匹配算法要优于正向匹配算法。 (RMM产生歧义的可能性比MM低,你将会从以下案例中体会) 4.更多关于中文分词算法,请看网上中文分词算法 二.RMM实现(效果比MM好, MM交给读者实现)

public class analyzer{ String Words=""; int words_len=0; //分词的最大长度 PRivate int max_length=4; //简易词典(简单模拟) Vector<String> dict=new String[]{"服装","有限公司","和服","有限公司"} public analyzer(String words){ this.words=words; words_len=this.words.length(); } public int getWordsLength(){ return words.length(); } //逆向匹配 public String RMMSplit(){ int words_len=getWordsLength(); if(words_len==0){ return ""; } String si=""; //词匹配的最大长度 int pattern_len=words_len>=max_length?max_length:words_len; for(int i=pattern_len;i>=1;i--){ si=words.substring(words_len-i); if(Find(si)||i==1){ words=words.substring(0,words_len-i); results.add(si); break; } } return si; } //是否在词典找到 public boolean Find(String str){ for(int i=0;i<dict.length;i++){ if(str.equals(dict[i])){ return true; } return false; } } public static void main(String[]args){ String str="永和服装有限公司"; analyzer a=new analyzer(); String isFinish=a.RMMSplit(); while(""!=isFinish){ isFinish=a.RMMSplit(); } while(a.results.size()!=0){ System.out.println(a.results.remove(a.results[0])+","); } } } //执行结果如下:永,和,服装,有限公司 //正向最大匹配算法的结果为永,和服,装,有限公司 //由此可知,RMM比MM在处理歧义等语言方面更有优势,出错率更低。