ToAnalysis 精准分词
精准分词是Ansj分词的店长推荐款
它在易用性,稳定性.准确性.以及分词效率上.都取得了一个不错的平衡.如果你初次尝试Ansj如果你想开箱即用.那么就用这个分词方式是不会错的.
DicAnalysis 用户自定义词典优先策略的分词
用户自定义词典优先策略的分词,如果你的用户自定义词典足够好,或者你的需求对用户自定义词典的要求比较高,那么强烈建议你使用DicAnalysis的分词方式.
可以说在很多方面Dic优于ToAnalysis的结果
NlpAnalysis 带有新词发现功能的分词
nlp分词是总能给你惊喜的一种分词方式.
它可以识别出未登录词.但是它也有它的缺点.速度比较慢.稳定性差.ps:我这里说的慢仅仅是和自己的其他方式比较.应该是40w字每秒的速度吧.
个人觉得nlp的适用方式.1.语法实体名抽取.未登录词整理.主要是对文本进行发现分析等工作
IndexAnalysis 面向索引的分词
面向索引的分词。顾名思义就是适合在lucene等文本检索中用到的分词。 主要考虑以下两点
召回率
o召回率是对分词结果尽可能的涵盖。比如对“上海虹桥机场南路” 召回结果是[上海/ns, 上海虹桥机场/nt, 虹桥/ns, 虹桥机场/nz, 机场/n, 南路/nr]
准确率
o其实这和召回本身是具有一定矛盾性的Ansj的强大之处是很巧妙的避开了这两个的冲突 。比如我们常见的歧义句“旅游和服务”->对于一般保证召回 。大家会给出的结果是“旅游 和服 服务” 对于ansj不存在跨term的分词。意思就是。召回的词只是针对精准分词之后的结果的一个细分。比较好的解决了这个问题
BaseAnalysis 最小颗粒度的分词
基本就是保证了最基本的分词.词语颗粒度最非常小的..所涉及到的词大约是10万左右.
基本分词速度非常快.在macAir上.能到每秒300w字每秒.同时准确率也很高.但是对于新词他的功能十分有限.
配置文件说明
在默认情况下,如果你想做更多的全局设定在程序调用时候,配置文件是个必不可少的玩意,在ansj中配置文件名为library.properties,这是一个不可更改的约定.下面让我们看看都有哪些选项在这个配置文件中.
字段名 默认值 说明
isNameRecognition true 是否开启人名识别
isNumRecognition true 是否开启数字识别
isQuantifierRecognition true 是否数字和量词合并
isRealName false 是否取得真实的词,默认情况会取得标注化后的
isSkipUserDefine false 是否用户辞典不加载相同的词
dic “library/default.dic” 自定义词典路径
dic_[key] “你的词典路径” 针对不同语料调用不同的自定义词典
ambiguity “library/ambiguity.dic” 歧义词典路径
ambiguity_[key] “library/ambiguity.dic” 歧义词典路径
crf null crf词典路径,不设置为默认
crf_[key] “你的模型路径” 针对不同语料调用不同的分词模型
String strbuf = "洁面仪配合洁面深层清洁毛孔 清洁鼻孔面膜碎觉使劲挤才能出一点点皱纹 脸颊毛孔修复的看不见啦 草莓鼻历史遗留问题没辙 脸和脖子差不多颜色的皮肤才是健康的 长期使用安全健康的比同龄人显小五到十岁 28岁的妹子看看你们的鱼尾纹";
StopRecognition filter = new StopRecognition();
List<String> stopword = new ArrayList<String>();
try {
stopword =Files.readLines(new File("F:\\data\\dict\\chinese_stopword.txt"), Charset.defaultCharset());
} catch (IOException e) {
e.printStackTrace();
}
//添加停用词词典
filter.insertStopWords( stopword );
filter.insertStopNatures("w");
filter.insertStopNatures("m");
filter.insertStopNatures("ng");
filter.insertStopNatures("t");
filter.insertStopNatures("nr");
filter.insertStopNatures("b");
filter.insertStopNatures("n");
filter.insertStopWords("生");
filter.insertStopNatures("ns");
//
Result parse = BaseAnalysis.parse(strbuf);
System.out.println("基础分词:"+parse);
System.out.println("------------------");
DicLibrary.insert("dic", "夜划车");
System.out.println("dic:"+DicAnalysis.parse( strbuf ));
Result parse1 = ToAnalysis.parse(strbuf);
System.out.println("精准分词:"+parse1);
Result parse11 = ToAnalysis.parse(strbuf).recognition(filter);
System.out.println("精准分词filter:"+parse11);
Result parse22 = NlpAnalysis.parse(strbuf);
System.out.println("nly分词:"+parse22);
Result parse2 = NlpAnalysis.parse(strbuf).recognition( filter );
System.out.println("nly分词filter:"+parse2);
Result parse3 = IndexAnalysis.parse(strbuf).recognition(filter);
System.out.println("search分词:"+parse3);
//关键词提取
KeyWordComputer key=new KeyWordComputer(10);
Iterator it = key.computeArticleTfidf(strbuf).iterator() ;
StringBuffer value = new StringBuffer();
while(it.hasNext()) {
Keyword key2=(Keyword)it.next();
value.append(key2.getName() +"="+key2.getFreq()+","+key2.getScore());
}
String out = value.toString();
String OutValue = out.substring(0, out.length()-1);
System.out.println("keyword:"+OutValue);
System.out.println("------------------");
SummaryComputer summaryComputer = new SummaryComputer(strbuf,"");
System.out.println( summaryComputer.toSummary().getKeyWords());
String title = "苏州通安强拆引发事件";
String content = "苏州高新区镇镇府门口被许多愤怒群众包围,据说是拆迁户没有拿到镇府补贴的, 宅基地补偿款,具体数额比较大,涉水比较深,因为,电视台都不敢来采访这件事情,镇府想冷处理这个事件。 昨天听说传闻,凌晨2.30分左右,公鞍部门出动500警力(其中不乏从周边城市调来的武警)将闹事群众或打 或驱散或抓捕,但是被打是肯定的,因为医院里躺好了被警嚓打伤的群众。";
KeyWordComputer kwc = new KeyWordComputer(5);
Collection<Keyword> result = kwc.computeArticleTfidf(title, content);
System.out.println(result);
SummaryComputer summaryComputer1 = new SummaryComputer(title,content);
System.out.println( "summaryComputer1"+summaryComputer1.toSummary().getKeyWords());
经过测试分词效果还是可以的,有机会和jieba分词比较一下