本文先介绍下mmseg的概念和算法,再说下mmseg4j-solor的3个分词器用法

1.mmseg概念

mmseg是用于中文切词的算法,即Maximum Matching Segment,最大匹配分词。根据在词典(语料库)中的匹配情况把原文切分成一个个词语

2.两种方法

为了便于后续介绍,假设要切分的原文是C1 C2 C3 C4 C5 C6, C表示一个汉字。

简单最大匹配:从头依次查找最长的词语,以此切割。如 [研究生], [研究, 生]

复杂最大匹配:是简单最大匹配的变体,引入三词块的概念,先找到所有可能的连续的三个词语组成的块,以块为单位运用如下规则来确定切割方式。

  • 规则1:块长度最长(包含字符个数最多)Maximum matching
  • 规则2:块中三个词的平均长度最长, Largest average word length
  • 规则3:三词长度的方差最小, Smallest variance of word lengths
  • 规则4:单字频率对数和最大,Largest sum of degree of morphemic freedom of one-character words

复杂最大匹配算法依次运用上面规则来消除歧义,选择符合规则的切词方案

3.mmseg4j-solor提供的3个analyzer

打印切词结果code如下。

    private void print(Analyzer analyzer, String str) throws IOException {
TokenStream stream = analyzer.tokenStream("", new StringReader(str));
StringBuilder sb = new StringBuilder();
stream.reset();
while (stream.incrementToken()) {
sb.append("[").append(stream.getAttribute(CharTermAttribute.class).toString() + "]");
}
stream.end();
stream.close();
System.out.println(sb.toString());
}

SimpleAnalyzer:简单最大匹配

SimpleAnalyzer analyzer = new SimpleAnalyzer("D:\\workspace\\TestLucene\\src\\main\\resources");
print(analyzer, "研究生命起源");

输出-[研究生][命][起源]

ComplexAnalyzer:复杂最大匹配

System.setProperty("mmseg.dic.path", "D:\\workspace\\TestLucene\\src\\main\\resources");
ComplexSeg.setShowChunk(true);
ComplexAnalyzer analyzer = new ComplexAnalyzer();
print(analyzer, "研究生命起源");
print(analyzer, "输入法");

输出:

[研究][生命][起源]

[输入法]

MaxWordAnalyzer: 最多分词切割,是ComplexAnalyzer的子类,在其基础上对词长度做了控制,不允许词长度超过2

MaxWordAnalyzer analyzer = new MaxWordAnalyzer("D:\\workspace\\TestLucene\\src\\main\\resources");
print(analyzer, "研究生命起源");
print(analyzer, "输入法");

输出:

[研究][生命][起源]

[输入][法]

细心的读者会发现上面的代码使用了两种设置词典路径的方法:设置mmseg.dic.path和构造函数传参。注意的是即使设置了新词典路径,mmseg4j-core中的data/words.dic也会被加载。

参考

http://technology.chtsai.org/mmseg/

https://code.google.com/archive/p/mmseg4j/

详解mmseg的更多相关文章

  1. coreseek 安装及使用方法详解

    coreseek 安装及使用 一般站点都需要搜索功能,如果是php+mysql站点,建议选择coreseek,如果是java站点建议使用lucene,coreseek 是一款很好的中文全文检索/搜索软 ...

  2. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  3. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  4. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  5. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  6. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  7. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  8. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  9. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

随机推荐

  1. Angular杂谈系列1-如何在Angular2中使用jQuery及其插件

    jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...

  2. 本人提供微软系.NET技术顾问服务,欢迎企业咨询!

    背景: 1:目前微软系.NET技术高端人才缺少. 2:企业很难直接招到高端技术人才. 3:本人提供.NET技术顾问,保障你的产品或项目在正确的技术方向. 技术顾问服务 硬服务项: 1:提供技术.决策. ...

  3. HTML DOM 介绍

    本篇主要介绍DOM内容.DOM 节点.节点属性以及获取HTML元素的方法. 目录 1. 介绍 DOM:介绍DOM,以及对DOM分类和功能的说明. 2. DOM 节点:介绍DOM节点分类和节点层次. 3 ...

  4. 【开源】.Net Aop(静态织入)框架 BSF.Aop

    BSF.Aop .Net 免费开源,静态Aop织入(直接修改IL中间语言)框架,类似PostSharp(收费): 实现前后Aop切面和INotifyPropertyChanged注入方式. 开源地址: ...

  5. 开源一款简单清爽的日历组件,JavaScript版的

    源码会在最后给出地址,需要的朋友自己去下载.最近项目需要做一个日程安排的功能,就是点击日历的某一天弹出一个录入页面,填完信息后保存当天的日程安排.有日程的日期会有不同的标记(比如加一个背景色啥的).网 ...

  6. Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...

  7. caffe的python接口学习(7):绘制loss和accuracy曲线

    使用python接口来运行caffe程序,主要的原因是python非常容易可视化.所以不推荐大家在命令行下面运行python程序.如果非要在命令行下面运行,还不如直接用 c++算了. 推荐使用jupy ...

  8. CYQ.Data V5 从入门到放弃ORM系列:教程 - AppConfig、AppDebug类的使用

    1:AppConfig类的介绍: Public Static (Shared) Properties IsEnumToInt 是否使用表字段枚举转Int方式(默认为false). 设置为true时,可 ...

  9. Xamarin.Android多界面

    一.准备 开始学习本教程前必须先完成该教程http://www.cnblogs.com/yaozhenfa/p/xamarin_android_quickstart.html 否则将无法继续. 二.界 ...

  10. 在 Ubuntu 14.10 中借用 Windows 的字体

    在前一篇随笔中,我详细讨论了字体的分类及用途,也以 Fedora 20 为例,展示了字体配置的思路和方法.我在配置 Fedora 20 系统字体的时候,采用的是一种釜底抽薪的方法,完全抛开了系统原有的 ...