“……他不回答,对柜里说,“温两碗酒,要一碟茴香豆。”便排出九文大钱。他们又故意的高声嚷道,“你一定又偷了人家的东西了!”孔乙己睁大眼睛说,“你怎么这样凭空污人清白……”“什么清白?我前天亲眼见你偷了何家的书,吊着打。”孔乙己便涨红了脸,额上的青筋条条绽出,争辩道,“窃书不能算偷……窃书!……读书人的事,能算偷么?”接连便是难懂的话,什么“君子固穷”,什么“者乎”之类,引得众人都哄笑起来;店内外充满了快活的空气。”
哈哈,在实际分词切词当中,庖丁解牛和MMSeg4j各有千秋,但MMSeg4j的思想更先进一些,提供两种类型的分词:Simple和Complex,都是基于正向最大匹配。Complex 加了四个规则过虑。从技术实现原理上,MMSeg4j更先进些,但是效果并不理想,究其原因,原来是词库太少,默认的带dic的jar包只有三个dic文件,太少太少。
而庖丁解牛的分词效果,我觉得跟他的词库有很关系,效果当然跟词库有关系,所以,本人就想了一个办法:MMSeg4j来借用庖丁解牛的词库,“借书算窃吗?”
从MMSeg4j官方说明,可以看出如何指定词库的位置:有关说明如下:
-----------------------------------------------------
6、运行,词典用mmseg.dic.path属性指定、在classpath 目录下或在当前目录下的data目录,默认是 classpath/data 目录。如果使用 mmseg4j-with-dic.jar 包可以不指定词库目录(如果指定也可以,它们也可以被加载)。
java -jar mmseg4j-core-1.8-with-dic.jar 这里是字符串。
java -cp .;mmseg4j-1.6.jar -Dmmseg.dic.path=./other-dic com.chenlb.mmseg4j.example.Simple 这里是字符串。
java -cp .;mmseg4j-1.6.jar com.chenlb.mmseg4j.example.MaxWord 这里是字符串
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。
- 由于 utf-8 文件有带与不带 BOM 之分,建议词库第一行为空行或为无 BOM 格式的 utf-8 文件。
-----------------------------------------------------
更多的请参考官网。
开始动手了。
第一步,把庖丁解牛下载后,有一个dic的目录,把其中第二级的目录location里面的文本COPY到一级目录后。
第二步,把庖丁解牛的所有dic文件,前面加一个前缀words-xxx,最后的结果如图所示:
第三步,在程序中动态执行的加入字典目录,如下所示:
public String segStr(String text,String mode) throws IOException{ String returnStr = ""; Seg seg = null; Properties p = System.getProperties(); p.setProperty("mmseg.dic.path", "C:\\dic"); Dictionary dic = Dictionary.getInstance(); if ("simple".equals(mode)) { seg = new SimpleSeg(dic); } else { seg = new ComplexSeg(dic); } MMSeg mmSeg = new MMSeg(new InputStreamReader(new ByteArrayInputStream(text.getBytes())), seg); Word word = null; while ((word = mmSeg.next()) != null) { //切词为单字的无实际意思,所以词组做为返回结果,仅仅为测试 if (word.getString().length()>=2){ returnStr += word.getString()+" "; } } return returnStr; }
呵呵,同样了,你也可以自己加入一些词库,比如拉登,奥巴马,还有中地沟油,中国加油贵,中国加油真贵.....
"引得众人都哄笑起来;店内外充满了快活的空气。"