文分词 mmseg4j
来源:互联网 发布:数据迁移方案格式 编辑:程序博客网 时间:2024/05/11 05:00
文分词 mmseg4j
- 博客分类:
- mmseg4j
实在想不到其它名字,就称它为 mmseg4j。关于 mmseg的算法我先不在这介绍,
可以参考:
- mmseg
- libmmseg
- rmmseg
mmseg4j 也实现了两种分词方式:Simple和Complex。
mmseg4j 扩展 lucene的analyzer,叫MMSegAnalyzer默认使用Complex方式,也可以用SimpleAnalyzer(Simple方式)。
来看下分词效果。
2009-3-22 22:29:45 com.chenlb.mmseg4j.Dictionary
信息: look up in mmseg.dic.path=../data
2009-3-22 22:29:45 com.chenlb.mmseg4j.Dictionary init
信息: chars loaded time=297ms, line=12638, on file=..\data\chars.dic
2009-3-22 22:29:46 com.chenlb.mmseg4j.Dictionary init
信息: words loaded time=485ms, line=120330, on file=..\data\words.dic
2009-3-22 22:29:46 com.chenlb.mmseg4j.Dictionary init
信息: sort time=125ms
2009-3-22 22:29:46 com.chenlb.mmseg4j.Dictionary init
信息: load dic use time=937ms
羽毛 | 球拍 | 研究 | 生命 | 起源 | 国际化 | 眼看 | 就要 | 来 | 了 | 为首 | 要 | 考虑 |
mmseg4j还扩展了solr的TokenizerFactory可以在Solr中方便的使用。可以指定词库的目录(paoding 到现在我还没搞懂怎么指定词库,在solr中使用,只能放到solr.war中)。mmseg4j在solr中使用的示例:
1、把mmseg4j-1.0.jar 放到solr.home/lib目录下(solr1.3支持)。
2、schema.xml定义field type
- <fieldType name="textComplex" class="solr.TextField" >
- <analyzer>
- <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" dicPath="dic"/>
- </analyzer>
- </fieldType>
- <fieldType name="textSimple" class="solr.TextField" >
- <analyzer>
- <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple"
- dicPath="n:/OpenSource/apache-solr-1.3.0/example/solr/my_dic"/>
- </analyzer>
- </fieldType>
3、打开http://localhost:8080/solr/admin/analysis.jsp 察看分词效果。
MMSegTokenizerFactory 支持两个参数,mode=simple(默认是complex),dicPath可以用词库目录绝对路径或相对路径(相对路径是是相对solr.home目录)。可以为每个不同的MMSegTokenizerFactory指定不同的目录(一般应用中没有必要,一般用相同的目录,默认是CWD的data目录下找词库)。
词库,由于mmseg算法的特性要两个文件,我指定用chars.dic、words.dic,基本上chars.dic不需要改动,words.dic可以添加自己的词。现在用的是rmmseg的词库,当然你也可以用sogou的词库(下个版本准备用它)。
现在把 mmseg4j 发在 http://code.google.com/p/mmseg4j/ 上。可以下载 mmseg4j-1.0.jar
发现有 bug,联系我 chenlb2008#gmail.com。
http://www.oschina.net/p/mmseg4j
1、mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法(http://technology.chtsai.org/mmseg/ )实现的中文分词器,并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。
2、MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex 加了四个规则过虑。官方说:词语的正确识别率达到了 98.41%。mmseg4j 已经实现了这两种分词算法。
- 1.5版的分词速度simple算法是 1100kb/s左右、complex算法是 700kb/s左右,(测试机:AMD athlon 64 2800+ 1G内存 xp)。
- 1.6版在complex基础上实现了最多分词(max-word)。“很好听” -> "很好|好听"; “中华人民共和国” -> "中华|华人|共和|国"; “中国人民银行” -> "中国|人民|银行"。
- 1.7-beta 版, 目前 complex 1200kb/s左右, simple 1900kb/s左右, 但内存开销了50M左右. 上几个版都是在10M左右.
mmseg4j实现的功能详情请看:
http://mmseg4j.googlecode.com/svn/branches/mmseg4j-1.7/CHANGES.txt
http://mmseg4j.googlecode.com/svn/branches/mmseg4j-1.6/CHANGES.txt
3、在 com.chenlb.mmseg4j.example包里的类示例了三种分词效果。
4、 在 com.chenlb.mmseg4j.analysis包里扩展lucene analyzer。MMSegAnalyzer默认使用max-word方式分词(还有:ComplexAnalyzer, SimplexAnalyzer, MaxWordAnalyzer)。
5、在 com.chenlb.mmseg4j.solr包里扩展solr tokenizerFactory。
dicPath 指定词库位置(每个MMSegTokenizerFactory可以指定不同的目录,当是相对目录时,是相对 solr.home 的目录),mode 指定分词模式(simple|complex|max-word,默认是max-word)。
6、运行,词典用mmseg.dic.path属性指定或在当前目录下的data目录,默认是 ./data 目录。
java -Dmmseg.dic.path=./data -jar mmseg4j-1.6.jar 这里是字符串。
java -cp .;mmseg4j-1.6.jar com.chenlb.mmseg4j.example.Simple 这里是字符串。
java -cp .;mmseg4j-1.6.jar com.chenlb.mmseg4j.example.MaxWord 这里是字符串
7、一些字符的处理 英文、俄文、希腊、数字(包括①㈠⒈)的分出一连串的。目前版本没有处理小数字问题, 如ⅠⅡⅢ是单字分,字库(chars.dic)中没找到也单字分。
8、词库(强制使用 UTF-8):
- data/chars.dic 是单字与语料中的频率,一般不用改动,1.5版本中已经加到mmseg4j的jar里了,我们不需要关心它,当然你在词库目录放这个文件可能覆盖它。
- data/units.dic 是单字的单位,默认读jar包里的,你也可以自定义覆盖它,这功能是试行,如果不喜欢它,可以空的units.dic文件覆盖它。
- data/words.dic 是词库文件,一行一词,当然你也可以使用自己的,1.5版本使用 sogou 词库,1.0的版本是用 rmmseg 带的词库。
- data/wordsxxx.dic 1.6版支持多个词库文件,data 目录(或你定义的目录)下读到"words"前缀且".dic"为后缀的文件。如:data/words-my.dic。
http://www.oschina.net/p/libmmseg/
LibMMSeg 简介
LibMMSeg 是Coreseek.com为 Sphinx 全文搜索引擎设计的中文分词软件包,其在GPL协议下发行的中文分词法,采用Chih-Hao Tsai的MMSEG算法。
MMSEG: A Word Identification System for Mandarin Chinese Text Based on Two Variants of the Maximum Matching Algorithm
Published: 1996-04-29
Updated: 1998-03-06
Document updated: 2000-03-12
License: Free for noncommercial use
Copyright 1996-2006 Chih-Hao Tsai (Email: hao520 at yahoo.com )
您可以在Chih-Hao Tsai's Technology Page找到算法的原文。
LibMMSeg 采用C++开发,同时支持Linux平台和Windows平台,切分速度大约在300K/s(PM-1.2G),截至当前版本(0.7.1)LibMMSeg没有为速度仔细优化过,进一步的提升切分速度应仍有空间。
下载
下载 MMSeg 0.7.3
修订记录
0.7.3
- 2008.05.27 修正 Makefile 无法安装csr_typedefs.h的问题
- 2008.05.27 修正 x64系统上编译无法作为动态库的一部分编译的问题
0.7.2
- 2008.05.19 修正 指定的目录中无词典不提示错误的问题
- 2008.05.19 新增 Ruby 的调用API
0.7.1
- 2008.04.23 修正了在类似 “english 中文 english" 的句子,切分不正确的问题
0.7
- 第一次发行
安装
Window平台
打开源码包中src\win32 子目录下的对应的工程文件,目前LibMMSeg内置了VS2003和VS2005的工程文件。
Linux平台
在源码包根目录下执行:
./configure && make && make install
使用
词典的构造
mmseg -u unigram.txt
该命令执行后,将会产生一个名为unigram.txt.uni的文件,将该文件改名为uni.lib,完成词典的构造。需要注意的是,unigram.txt 必须为UTF-8编码。
词典文件格式:
....
河 187
x:187
造假者 1
x:1
台北队 1
x:1
湖边 1
......
其中,每条记录分两行。其中,第一行为词项,其格式为:[词条]\t[词频率]。需要注意的是,对于单个字后面跟这个字作单字成词的频率,这个频率 需要在大量的预先切分好的语料库中进行统计,用户增加或删除词时,一般不需要修改这个数值;对于非单字词,词频率处必须为1。第二行为占位项,是由于 LibMMSeg库的代码是从Coreseek其他的分词算法库(N-gram模型)中改造而来的,在原来的应用中,第二行为该词在各种词性下的分布频 率。LibMMSeg的用户只需要简单的在第二行处填"x:1"即可。
用户可以通过修改词典文件增加自己的自定义词,以提高分词法在某一具体领域的切分精度,系统默认的词典文件在data/unigram.txt中。
分词
mmseg -d tobe_segment.txt
其中,命令使用‘-d’开关指定词库文件所在的位置,参数dict_dir为词库文件(uni.lib )所在的目录;tobe_segment.txt 为待切分的文本文件,必须为UTF-8编码。如果一切正确,mmseg会将切分结果以及所花费的时间显示到标准输出上。
对特殊短语的支持
由于LibMMSeg是为Sphinx全文搜索引擎设计的,因此其内置了部分搜索引擎切分算法的特性,主要表现在对特殊短语的支持上。
在搜索引擎中,需要处理C++时,如果分词器中没有词组C++,则将被切分为C/x +/x +/x,在进一步的检索中,可能每个词会由于出现的过于频繁而被过滤掉,导致搜索的结果与C++相关度不高不说,也严重影响的全文搜索的速度。在 LibMMSeg中,内置对特殊短语的支持。
其输入文件格式如下
// test commit
.net => dotnet
c# => csharp
c++ => cplusplus
其中左侧是待支持的特殊短语,右侧是左侧的特殊短语需要被转换为的短语。这一转换在分词前进行。
可以在行的开头加入'//'作为注释符号,发现符号'//'后,整行将被忽略。
特殊短语词库构造命令:
mmseg -b exceptions.txt
其中, 开关'-b'指示mmseg是要构造特殊短语词库;exceptions.txt是用户编辑的特殊短语转换规则。
该命令执行后,将在当前目录下产生一个名为"synonyms.dat"的文件,将该文件放在"uni.lib"同一目录下,分词系统将自动启动特殊短语转换功能。
注意:
1、在启用了该功能后,如果分词系统发现了一个特殊短语,将直接输出其在右侧对应的替换的值;
2、右侧被替换的值,请保证不会被分词器进行切分。(eg. C++ => C# 这个转换的意义不大,并且可能导致C++这个短语永远无法被检索到!)
附录:
MMSeg算法说明
首先来理解一下chunk,它是MMSeg分词算法中一个关键的概念。Chunk中包含依据上下文分出的一组词和相关的属性,包括长度 (Length)、平均长度(Average Length)、标准差的平方(Variance)和自由语素度(Degree Of Morphemic Freedom)。下面列出了这4个属性:
属性含义长度(Length)chuck中各个词的长度之和平均长度(Average Length)长度(Length)/词数标准差的平方(Variance)同数学中的定义自由语素度(Degree Of Morphemic Freedom)各单字词词频的对数之和
Chunk中的4个属性只有在需要该属性的值时才进行计算,而且只计算一次。
其次来理解一下规则(Rule),它是MMSeg分词算法中的又一个关键的概念。实际上我们可以将规则理解为一个过滤器(Filter),过滤掉不符合要求的chunk。MMSeg分词算法中涉及了4个规则:
- 规则1:取最大匹配的chunk (Rule 1: Maximum matching)
- 规则2:取平均词长最大的chunk (Rule 2: Largest average word length)
- 规则3:取词长标准差最小的chunk (Rule 3: Smallest variance of word lengths)
- 规则4:取单字词自由语素度之和最大的chunk (Rule 4: Largest sum of degree of morphemic freedom of one-character words)
这4个规则符合汉语成词的基本习惯。
再来理解一下匹配方式复杂最大匹配(Complex maximum matching):
复杂最大匹配先使用规则1来过滤chunks,如果过滤后的结果多于或等于2,则使用规则2继续过滤,否则终止过滤过程。如果使用规则2得到的过滤 结果多于或等于2,则使用规则3继续过滤,否则终止过滤过程。如果使用规则3得到的过滤结果多于或等于2,则使用规则4继续过滤,否则终止过滤过程。如果 使用规则 4得到的过滤结果多于或等于2,则抛出一个表示歧义的异常,否则终止过滤过程。
最后通过一个例句--“研究生命起源来简述”一下复杂最大匹配的分词过程。MMSeg分词算法会得到7个chunk,分别为:
编号chunk长度0研_究_生31研_究_生命42研究_生_命43研究_生命_起54研究_生命_起源65研究生_命_起56研究生_命_起源6使用规则1过滤后得到2个chunk,如下:
编号chunk长度4研究_生命_起源66研究生_命_起源6计算平均长度后为:
编号chunk长度平均长度4研究_生命_起源626研究生_命_起源62使用规则2过滤后得到2个chunk,如下:
编号chunk长度平均长度4研究_生命_起源626研究生_命_起源62计算标准差的平方后为:
编号chunk长度平均长度标准差的平方4研究_生命_起源6206研究生_命_起源624/9使用规则3过滤后得到1个chunk,如下:
编号chunk长度平均长度标准差的平方4研究_生命_起源620匹配过程终止。最终取“研究”成词,以相同的方法继续处理“生命起源”。
分词效果:
研究_生命_起源_
研究生_教育_
- 文分词 mmseg4j
- solr+mmseg4j 中文分词
- solr中文分词(mmseg4j)
- solr+mmseg4j 中文分词
- solr+mmseg4j 中文分词
- solr中文分词(mmseg4j)
- 添加中文分词(mmseg4j)
- Lucene中文分词mmseg4j
- MMSeg4j 分词器
- Solr分词mmseg4j配置
- 中文分词 mmseg4j-1.8框架
- solr中文分词(mmseg4j) 编辑
- solr4.4.0+mmseg4j 中文分词
- solr安装mmseg4j 分词器
- Solr6+中文分词(mmseg4j)
- solr中集成中文分词 mmseg4j
- solr4.5 mmseg4j 分词器配置
- solr4.5配置中文分词器mmseg4j
- [Leetcode] Sum Root to Leaf Numbers (Java)
- 将man page转换成pdf的方法
- HTTP 方法:GET 对比 POST
- 让/etc/profile文件修改后立即生效
- TOMCAT调优(JVM参数)
- 文分词 mmseg4j
- Android 横竖屏切换时 Custom Dialog 布局自适应
- BOX2D基本元素简介
- Java内存溢出
- 在非UI线程处理Bitmap(实用)
- oscache使用指南
- Oracle导出表(即DMP文件)的两种方法
- Codesigning the Debugger OSX gdb签名
- Tchar.h 中的一般文本映射