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

4.更多关于中文分词算法,查看中文分词常用算法

二.中文分词算法RMM,MM实现

1.定义分词器的基类和一些公有方法和相关接口

package myAnalyzer;
import java.util.*;
public abstract class Analyzer {
public String words;
//匹配的最大长度
public int max_length=4;
//模拟字典
private HashSet<String> dict=new HashSet();
//存放分词后的序列
public ArrayList<String> analyzerResult=new ArrayList<String>();
public Analyzer(String words){this.words=words;System.out.println("加载字典");dict.add("服装");dict.add("有限公司");dict.add("公司");dict.add("和服");}
//完成分词工作
public void splitWords(){while(!"".equals(words)){splitWordsbyOneStep();}
}
//进行一次切分,将切分的单词放入分词结果中,并更新原始的目标串
public abstract void splitWordsbyOneStep();
//返回分词结果
public  List<String> getSplitResult(){splitWords();return analyzerResult;
}
//判断该词是否在字典中
public boolean find(String str){if(dict.contains(str))return true;return false;
}
public void printResult(){if(analyzerResult.size()==0)analyzerResult=(ArrayList<String>)getSplitResult();Iterator<String> it=analyzerResult.iterator();System.out.println("分词结果为:");while(it.hasNext()){System.out.print(it.next()+"-");}
}
}

2.RMM算法实现

package myAnalyzer;import java.util.ArrayList;
import java.util.List;
public class RmmAnalyzer extends Analyzer{public RmmAnalyzer(String words) {super(words);}//进行一次切分,将切分的单词放入分词结果中,并更新原始的目标串@Overridepublic void splitWordsbyOneStep() {int words_len=words.length();if (words_len==0){return ;}String si="";//判断匹配的最大长度int pattern_len=words_len>=max_length?max_length:words_len;System.out.println("patter_len"+pattern_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);//将分词后的单词加入分词结果中analyzerResult.add(si);break;}}return;}//对分词结果进行反转@Overridepublic void splitWords() {super.splitWords();analyzerResult=(ArrayList<String>) reverseSplitResult();}//RMM需要对分词结果进行反逆操作private List<String> reverseSplitResult() {// TODO Auto-generated method stubList<String> copyresult=new ArrayList();for(int i=analyzerResult.size()-1;i>=0;i--){copyresult.add(analyzerResult.get(i));}return copyresult;}
}

3.MM算法实现

package myAnalyzer;import java.util.ArrayList;
import java.util.List;import javax.swing.text.DefaultEditorKit.CopyAction;public class MmAnalyzer extends Analyzer{public MmAnalyzer(String words) {super(words);}//进行一次切分,将切分的单词放入分词结果中,并更新原始的目标串@Overridepublic void splitWordsbyOneStep() {int words_len=words.length();//结束if (words_len==0){return;}//匹配的最大长度int pattern_len=words_len>=max_length?max_length:words_len;int bestPosition=1;//可能找到的词语字串String si="";for(int i=pattern_len;i>=1;i--){si=words.substring(0,i);//找到即返回if(find(si)){bestPosition=i;break;}}//加入分词结果中si=words.substring(0,bestPosition);analyzerResult.add(si);//防止数组下表越界if(bestPosition<words_len){//更新待切分的目标串words=words.substring(bestPosition);}else{words="";}}}

三, 测试

1.测试代码

package myAnalyzer;import java.util.List;import org.junit.Test;public class test {@Test
public void test(){String content="永和服装有限公司";System.out.println("逆向最大匹配算法RMM")RmmAnalyzer rmm=new RmmAnalyzer(content);rmm.printResult();System.out.println(“正向最大匹配算法MM")MmAnalyzer mm=new MmAnalyzer(content);mm.printResult();}
}

2.分析比对

待分词的字符串序列为永和服装有限公司
逆向最大匹配算法执行结果为:永,和,服装,有限公司
正向最大匹配算法的结果为:永,和服,装,有限公司
由此可知,RMM比MM在处理歧义等语言方面更有优势,出错率更低。

算法无绝对的好坏,大家私下可以了解相关的算法,比如双向最大匹配算法(结合逆向和正向最大匹配算法),最小匹配算法等,学习下相关理论。

基于字典的中文分词算法RMM,MM实现相关推荐

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

    引言:目前针对中文分词一般有基于字典,基于统计(HMM等),基于规则的分词方法,然而其中基于字典的中文分词是最基础,同时也是最高效的方式,但分词精度取决与字典的规模. 一.基于字典的中文算法简介 1. ...

  2. 基于词表的中文分词算法

    基于词表的中文分词算法 正向最大匹配法 对于输入的一段文本从左至右,以贪心的方式切分出当前位置上长度最大的词.正向最大匹配法是基于词典的分词方法,其分词原理是:单词的颗粒度越大,所能表示的含义越确切. ...

  3. 入门科普:一文看懂NLP和中文分词算法(附代码举例)

    导读:在人类社会中,语言扮演着重要的角色,语言是人类区别于其他动物的根本标志,没有语言,人类的思维无从谈起,沟通交流更是无源之水. 所谓"自然"乃是寓意自然进化形成,是为了区分一些 ...

  4. 在Hadoop上运行基于RMM中文分词算法的MapReduce程序

    原文:http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-count-on-hadoop/ 在Hadoop上运行基于RMM中文分词 ...

  5. PHP基于字典的中英文数字混合分词算法RMM简易实现

    <?phpclass Seg {//字典private $dict = [];//加载字典function set_dict($vDict){//词典大写,方便比对foreach ($vDict ...

  6. 基于词典的逆向最大匹配中文分词算法,更好实现中英文数字混合分词

    基于词典的逆向最大匹配中文分词算法,能实现中英文数字混合分词.比如能分出这样的词:bb霜.3室.乐phone.touch4.mp3.T恤.实际分词效果比正向分词效果好 publicclass RMM ...

  7. 基于感知器的中文分词算法

    http://heshenghuan.github.io/2015/12/21/%E5%9F%BA%E4%BA%8E%E6%84%9F%E7%9F%A5%E5%99%A8%E7%9A%84%E4%B8 ...

  8. 基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词

    基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词.比如能分出这样的词:bb霜.3室.乐phone.touch4.mp3.T恤 第一次写中文分词程序,欢迎拍砖. publicclass MM ...

  9. 中文分词算法python代码_中文分词算法之最大正向匹配算法(Python版)

    最大匹配算法是自然语言处理中的中文匹配算法中最基础的算法,分为正向和逆向,原理都是一样的. 正向最大匹配算法,故名思意,从左向右扫描寻找词的最大匹配. 首先我们可以规定一个词的最大长度,每次扫描的时候 ...

最新文章

  1. nodejs 全局变量和全局对象
  2. 15.深入分布式缓存:从原理到实践 --- 同程凤凰缓存系统基于Redis的设计与实践
  3. Python实现Word文档翻译
  4. JDBC bug : You must configure either the server or JDBC driver
  5. 没想到这一天来的这么快 大数据之下再无隐私
  6. 虚拟化——成功解决使用ovirt安装虚拟机系统时不能正常引导安装
  7. 使用Qt做一个简单计算器
  8. html英文读法,HTML格式,html format,音标,读音,翻译,英文例句,英语词典
  9. c# 全选快捷键等类似事件
  10. 海龟交易法则 | 稳定性并不等于低风险!
  11. void value not ignored as it ought to be解决方法
  12. 解决 Vant中 输入框(Field)组件获取不到输入值
  13. ubuntu backup-manager 高效备份工具
  14. 美国iPhone出新品,苹果新总部也将竣工,哪个更让你期待?
  15. 超全人物icon图标素材网站整理
  16. 一文详解Mysql锁事务隔离级别
  17. 信工实验参考——《通信原理实验1——话音信号的PCM编译码综合实验》
  18. syy7comai5php,PhraseEdit.txt
  19. Selenium UI自动化测试中元素定位不到的原因和解决方法汇总
  20. 更适合python的应用程序_一些很棒的Python应用程序

热门文章

  1. 未能从程序集“mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“System.Coll
  2. 「hdu6608」Fansblog【Miller_Rabin+威尔逊定理】
  3. 品达物流TMS项目_第6章 数据聚合服务开发(pd-aggregation)
  4. 面试磕磕碰碰,辛得蚂蚁高级工程师的技术笔记指导,终获P7岗offer
  5. linux搭建 eth节点,Ethereum全节点搭建
  6. Everyday-FE-Articles 8~11月前端文章日推 [持续更新]
  7. Java 开发中常用的 4 种加密方法。MD5加密工具类测试 base64加密工具类测试 SHA加密工具类测试 BCrypt加密工具类测试
  8. EOS的中心化,该中国财团背锅吗?
  9. Apache htaccess 重写如果文件存在!
  10. 华为高管回应养猪传闻,赋能企业用AI养好猪