mlcsseg下载:
https://github.com/mlcsdev/mlcsseg/tree/4.7
mlcsseg使用说明:
http://mlcsdev.iteye.com/blog/2037109
ansj中文分词下载:
https://github.com/ansjsun/ansj_seg
参考文章:
http://www.abyssss.com/?p=62
由于ansj不支持solr,所以选择了使用mlcsseg封装包,目前mlcsseg版本是4.7,支持ansj版本是1.4,所以如果你需要使用ansj的最新版本2.0,需要自己修改一下.
mlcsseg项目总共包含4个子项目,由于ik我没用到,所以pom里面可以考虑去除,最后就剩下3个项目
<module>mlcsseg-common</module> <module>mlcsseg-filter</module> <module>mlcsseg-ansj</module>
在这三个项目里面,需要这样调整一下(调整只是稍微测试了一下,还不知道改得有没有问题)
1.mlcsseg-ansj的pom修改
<version>1.4</version> <scope>system</scope> <systemPath>${project.basedir}/lib/ansj_seg-1.4-min.jar</systemPath> 修改为 <version>2.0.6</version> <!-------------------------------------------------------------------------> <version>1.3</version> <scope>system</scope> <systemPath>${project.basedir}/lib/tree_split-1.3.jar</systemPath> 修改为 <version>1.4</version>
2.mlcsseg-ansj项目中AnsjTokenizerFactory.update方法修改如下:
UserDefineLibrary.loadLibrary(inputStreams); 修改为 UserDefineLibrary.loadLibrary(UserDefineLibrary.FOREST, path);
3.mlcsseg-common项目中ReloaderRegister.loadAndUpdate方法修改如下:
if (!dicts.isEmpty()){ List<InputStream> insFromLoader = new ArrayList<InputStream>(dicts.size()); for(String dictName : dicts){ try{ insFromLoader.add(loader.openResource(dictName)); }catch(IOException e){ System.out.println("missing dict source : " + dictName); } } reloadFactory.update(insFromLoader); System.out.println("reload finish! " + dicts); } //--------------------------------------------------------------------------- //以上代码修改为下面的代码 if (!dicts.isEmpty()){ for(String dictPath : dicts){ reloadFactory.update(dictPath); System.out.println("reload finish! " + dictPath); } }
代码修改完成后,maven install一下,把jar包:tree_split-1.4.jar,nlp-lang-0.2.jar,ansj_seg-2.0.6.jar,mlcsseg-common-4.6.0-SNAPSHOT.jar,mlcsseg-filter-4.6.0-SNAPSHOT.jar,mlcsseg-ansj-4.6.0-SNAPSHOT.jar放入你的solr web项目WEB-INF/lib文件夹中
4.在mlcsseg项目中有test1和test2文件夹,test1为ik的配置,可以不用,我们选用test2文件夹,找到ansj.conf文件files的值修改为词库的路径(原先是词库的具体文件名,现在修改为路径),可以扩展自己的词库
5.把test2文件夹中的conf文件夹,copy到上篇文章中提到的new_core中(直接覆盖)
6.ansj_seg-master项目中(即ansj项目),把library文件夹copy到上篇文章中提到的new_core中
7.ansj_seg-master项目中,把library.properties文件复制到你的solr web项目WEB-INF/classes中,同时修改ambiguityLibrary和userLibrary的词库路径(指上一点中提到的library路径)
至此,配置算是完成了,重启一下resin(希望没有遗漏什么要点,因为都是跑通后,重新回忆补上文档的)
ansj分词效果
不是ansj的分词效果
特别注意:以上所有的操作都是初试而已
测试代码:
//增加新词 /* String nature = "aaaaa"; String str = "上海电力2012年财务报表如下怎爸爸去哪儿么办"; UserDefineLibrary.insertWord("怎爸爸去哪儿", nature, 2000); UserDefineLibrary.insertWord("爸爸去哪", nature, 2000); String[] paramers = new String[2]; paramers[0] = nature; paramers[1] = String.valueOf(2000); Value value = new Value(newWord, paramers); Library.insertWord(UserDefineLibrary.FOREST, value); */ String str = "北京好药师大药房连锁有限公司"; //String newWord = "北京好药师"; //String nature = "111"; /* String[] paramers = new String[2]; paramers[0] = nature; paramers[1] = String.valueOf(2000); Value value = new Value(newWord, paramers); Library.insertWord(UserDefineLibrary.FOREST,value); */ String path = "/home/resin/data/jsp/solr.ehaoyao.com/WebRoot/cores/multicore/new_core/conf/extDic.txt"; UserDefineLibrary.loadLibrary(UserDefineLibrary.FOREST, path); //Value value2 = new Value("好药师", "222", "1000"); //Library.insertWord(UserDefineLibrary.FOREST, value2); //Value value = new Value("北京好药师", "111", "1000"); //Library.insertWord(UserDefineLibrary.FOREST, value); out.println(ToAnalysis.parse(str)); //out.println("<br/>"); //out.println(UserDefineAnalysis.parse(str));
或者 直接看ansj项目中的测试类
/ansj_seg-master/src/test/java/org/ansj/test/UserDefinedAnalysisTest.java
不过这里还有个疑问 为什么我在词库中添加 “北京好药师” “好药师” 这两个词 按理分词后应该会出现这两个,但是实际上不会,只会出现“北京好药师”这个词,不明白为什么