读书人

汉语言分词 mmseg4j

发布时间: 2012-10-28 09:54:44 作者: rapoo

中文分词 mmseg4j
使用 paoding 的配置觉得有点复杂,而且管理词库也有点不方便,同时自己也想了解下中文分词算法,然后就想自己写个中文分词器,在lucene和solr中使用。在 javaeye 看到有关 mmseg 的简介,看了下还不错,简单方便,那就用它来写个java版吧,我搜索 mmseg的java版(好像是 solo,官方已经下载不了),弄清分词算法还是自己写写吧。

实在想不到其它名字,就称它为 mmseg4j。关于 mmseg的算法我先不在这介绍,
可以参考:

    mmseglibmmsegrmmseg


mmseg4j 也实现了两种分词方式:Simple和Complex。

mmseg4j 扩展 lucene的analyzer,叫MMSegAnalyzer默认使用Complex方式,也可以用SimpleAnalyzer(Simple方式)。

来看下分词效果。

<fieldType name="textComplex" > <analyzer> <tokenizer dicPath="dic"/> </analyzer> </fieldType><fieldType name="textSimple" > <analyzer> <tokenizer 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。

顶 solol 兄是你的自由, 写 mmseg4j 是我的自由。你甚至还可以为 solol 兄的mmseg扩展lucene analyzer

我写 mmseg4j 的目的很简单:学习一种分词算法。

1.5版的分词速度simple算法是 1100kb/s左右、complex算法是 700kb/s左右,(测试机:AMD athlon 64 2800+ 1G内存 xp)。

simple > paoding(900Kb/s左右) > complex > ik & mik > je

后续的版本努力提升性能....

1.5版的分词速度simple算法是 1100kb/s左右、complex算法是 700kb/s左右,(测试机:AMD athlon 64 2800+ 1G内存 xp)。

simple > paoding(900Kb/s左右) > complex > ik & mik > je

后续的版本努力提升性能....
C版本,2.6M/s
python版本惨不忍睹。。。。。T_T
但是如果不对结果进行字符串拷贝的话。
python wrapper是1.16M/s

都是complex算法

1.5版的分词速度simple算法是 1100kb/s左右、complex算法是 700kb/s左右,(测试机:AMD athlon 64 2800+ 1G内存 xp)。

simple > paoding(900Kb/s左右) > complex > ik & mik > je

后续的版本努力提升性能....
C版本,2.6M/s
python版本惨不忍睹。。。。。T_T
但是如果不对结果进行字符串拷贝的话。
python wrapper是1.16M/s

都是complex算法

如果对结果拷贝, 是多少? 你机器怎么样?

我测试的都是分出词的, 近10M的几篇小说进行,5次测试的平均值.
因为Linux是unicode(utf-8)的,不是国标,(GB2312) 因为Linux是unicode(utf-8)的,不是国标,(GB2312)


词库,我强制使用 utf-8 编码。

reader 层里没有编码的概念了 因为Linux是unicode(utf-8)的,不是国标,(GB2312)


词库,我强制使用 utf-8 编码。

reader 层里没有编码的概念了
是你的Performance.java里面hardcode的。。嘿嘿 36 楼 chenlb 2009-04-15 哦, 那个是我本机上测的, 没打包到 jar 里。

呵呵

读书人网 >软件架构设计

热点推荐