详解mmseg
本文先介绍下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的更多相关文章
- coreseek 安装及使用方法详解
coreseek 安装及使用 一般站点都需要搜索功能,如果是php+mysql站点,建议选择coreseek,如果是java站点建议使用lucene,coreseek 是一款很好的中文全文检索/搜索软 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
随机推荐
- Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记
以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...
- 微信小程序体验(2):驴妈妈景区门票即买即游
驴妈妈因为出色的运营能力,被腾讯选为首批小程序内测单位.驴妈妈的技术开发团队在很短的时间内完成了开发任务,并积极参与到张小龙团队的内测问题反馈.驴妈妈认为,移动互联网时代,微信是巨大的流量入口,也是旅 ...
- [转]利用URLConnection来发送POST和GET请求
URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...
- RestTemplate发送请求并携带header信息
1.使用restTemplate的postForObject方法 注:目前没有发现发送携带header信息的getForObject方法. HttpHeaders headers = new Http ...
- 算法与数据结构(十七) 基数排序(Swift 3.0版)
前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...
- Redis的简单动态字符串实现
Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...
- java单向加密算法小结(2)--MD5哈希算法
上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...
- BPM Domino集成解决方案
一.需求分析 Lotus Notes/Domino是IBM的协同办公平台,在国内有广泛的用户. 但由于推出年头较早.采用文档数据库等特点, 导致其流程集成能力弱.统计分析难.不支持移动办公等问题,很多 ...
- Android事件分发机制浅谈(一)
---恢复内容开始--- 一.是什么 我们首先要了解什么是事件分发,通俗的讲就是,当一个触摸事件发生的时候,从一个窗口到一个视图,再到一个视图,直至被消费的过程. 二.做什么 在深入学习android ...
- Linux命令【第二篇】
1.如何过滤出已知当前目录下oldboy中的所有一级目录(提示:不包含oldboy目录下面目录的子目录及隐藏目录,即只能是一级目录). ^:以什么开头,例如^olboy表示以oldboy开头. ls: ...