`

偷梁换柱:MMSeg4j借用庖丁解牛的词库

阅读更多

   “……他不回答,对柜里说,“温两碗酒,要一碟茴香豆。”便排出九文大钱。他们又故意的高声嚷道,“你一定又偷了人家的东西了!”孔乙己睁大眼睛说,“你怎么这样凭空污人清白……”“什么清白?我前天亲眼见你偷了何家的书,吊着打。”孔乙己便涨红了脸,额上的青筋条条绽出,争辩道,“窃书不能算偷……窃书!……读书人的事,能算偷么?”接连便是难懂的话,什么“君子固穷”,什么“者乎”之类,引得众人都哄笑起来;店内外充满了快活的空气。” 

 

  哈哈,在实际分词切词当中,庖丁解牛和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;
	}

  呵呵,同样了,你也可以自己加入一些词库,比如拉登,奥巴马,还有中地沟油,中国加油贵,中国加油真贵.....

   "引得众人都哄笑起来;店内外充满了快活的空气。"
 

  • 描述: 修改后的字典
  • 大小: 6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics