本文先介绍下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. TODO:macOS编译PHP7.1

    TODO:macOS编译PHP7.1 本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.g ...

  2. session实现购物车

    为实现简单的购物功能(购物车添加.账户查看.购物车商品删除.实时的购物商品数量及价格的计算显示.购物车商品数量可手动输入等),用session实现了一简单的以php语言为基础.连接MySQL数据库的购 ...

  3. 闲来无聊,研究一下Web服务器 的源程序

    web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...

  4. [APUE]UNIX进程的环境(上)

    一. 前言 本章将学习:当执行程序时,其main函数是如何被调用的,命令行参数是如何传送给执行程序的,典型的存储器布局是什么样式,如何分配另外的存储空间,进程如何使用环境变量,进程终止的不同方式等.另 ...

  5. ASP.NET从零开始学习EF的增删改查

           ASP.NET从零开始学习EF的增删改查           最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...

  6. System.Guid ToString五中格式

    参考:https://msdn.microsoft.com/en-us/library/97af8hh4.aspx 测试代码: using System; using System.Collectio ...

  7. scanf类型不匹配造成死循环

        int i = 0; while (flag) { printf("please input a number >>> "); scanf("% ...

  8. VC中的MFC到底是什么?

    1. 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API ...

  9. JQuery实现表格的增加行和删除行

    利用JQuery实现datatables插件的增加和删除行操作 在学习过程中遇到了这个利用JQuery对表格行的增加和删除,特记录下来以供初学者参考. 下面是主要的代码: <meta http- ...

  10. JAVA装饰者模式(从现实生活角度理解代码原理)

    装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职 ...