综合比较
| 名称 | 用户自定义词典 | 数字识别 | 人名识别 | 机构名识别 | 新词发现 |
|---|---|---|---|---|---|
| BaseAnalysis | X | X | X | X | X |
| ToAnalysis | √ | √ | √ | X | X |
| DicAnalysis | √ | √ | √ | X | X |
| IndexAnalysis | √ | √ | √ | X | X |
| NlpAnalysis | √ | √ | √ | √ | √ |
ToAnalysis 精准分词
推荐
它在易用性,稳定性,准确性,以及分词效率上,都取得了一个不错的平衡,如果你初次尝试Ansj如果你想开箱即用,那么就用这个分词方式是不会错的,
DicAnalysis 用户自定义词典优先策略的分词
用户自定义词典优先策略的分词,如果你的用户自定义词典足够好,或者你的需求对用户自定义词典的要求比较高,那么强烈建议你使用DicAnalysis的分词方式,
可以说在很多方面Dic优于ToAnalysis的结果
NlpAnalysis 带有新词发现功能的分词
nlp分词是总能给你惊喜的一种分词方式,
它可以识别出未登录词,但是它也有它的缺点,速度比较慢,稳定性差,ps:我这里说的慢仅仅是和自己的其他方式比较,应该是40w字每秒的速度吧,
个人觉得nlp的适用方式,1,语法实体名抽取,未登录词整理,只要是对文本进行发现分析等工作
IndexAnalysis 面向索引的分词(适合全文检索)
面向索引的分词。顾名思义就是适合在 lucene 等文本检索中用到的分词。主要考虑以下两点
召回率:召回率是对分词结果尽可能的涵盖。比如对“上海虹桥机场南路” 召回结果是[上海/ns, 上海虹桥机场/nt, 虹桥/ns, 虹桥机场/nz, 机场/n, 南路/nr]
准确率:其实这和召回本身是具有一定矛盾性的Ansj的强大之处是很巧妙的避开了这两个的冲突 。比如我们常见的歧义句“旅游和服务”->对于一般保证召回 。大家会给出的结果是“旅游 和服 服务” 对于ansj不存在跨term的分词。意思就是。召回的词只是针对精准分词之后的结果的一个细分。比较好的解决了这个问题
BaseAnalysis 最小颗粒度的分词
基本就是保证了最基本的分词,词语颗粒度最非常小的,,所涉及到的词大约是10万左右,
基本分词速度非常快,准确率也很高,但是对于新词他的功能十分有限
使用
maven依赖
<dependency>
<groupId>org.ansj</groupId>
<artifactId>ansj_seg</artifactId>
<version>5.1.1</version>
</dependency>
例子1
import org.ansj.library.DicLibrary;
import org.ansj.splitWord.analysis.*;
import org.ansj.util.MyStaticValue;
/**
* AnsjAnalyzerTest
*
* @author limingcheng
* @Date 2019/11/26
*/
public class AnsjAnalyzerTest {
/**
* 基本分词(BaseAnalysis)
* 速度快
*/
public static void BaseAnalysisTest(){
String words = "让战士们过一个欢乐祥和的新春佳节。";
System.out.println(BaseAnalysis.parse(words));
}
/**
* 精准分词(ToAnalysis)
* 精准分词方式兼顾精度与速度,比较均衡
*/
public static void ToAnalysisTest(){
String words = "让战士们过一个欢乐祥和的新春佳节。";
System.out.println(ToAnalysis.parse(words));
}
/**
* NLP分词(NlpAnalysis)
* NLP分词方式可是未登录词,但速度较慢
*/
public static void NlpAnalysisTest(){
String words = "洁面仪配合洁面深层清洁毛孔 清洁鼻孔面膜碎觉使劲挤才能出一点点皱纹 " +
"脸颊毛孔修复的看不见啦 草莓鼻历史遗留问题没辙 脸和脖子差不多颜色的皮肤才是健康的 " +
"长期使用安全健康的比同龄人显小五到十岁 28岁的妹子看看你们的鱼尾纹。";
System.out.println(NlpAnalysis.parse(words));
}
/**
* 自定词典分词(DicLibrary)
* 动态添加
*/
public static void DicLibraryTest(){
//添加自定义词语 【 英文,按照小写配置。(大写,不识别。拆词的结果,也转为小写了)】
DicLibrary.insert(DicLibrary.DEFAULT, "基于java", "n", 1);
String text = "基于Java开发的轻量级的中分分词工具包";
System.out.println(DicAnalysis.parse(text));
}
/**
* 自定词典分词(DicLibrary)
* 路径获取
*/
public static void DicLibraryPath(){
// 关闭名字识别
MyStaticValue.isNameRecognition = false;
// 配置自定义词典的位置。注意是绝对路径
MyStaticValue.ENV.put(DicLibrary.DEFAULT, "E:\\indexDir\\library\\default.dic");
String text = "基于Java开发的轻量级的中分分词工具包";
System.out.println(DicAnalysis.parse(text));
}
/**
* 自定词典分词(DicLibrary)
* 配置文件
*/
public static void DicLibraryProperties(){
String text = "基于Java开发的轻量级的中分分词工具包";
System.out.println(DicAnalysis.parse(text));
}
public static void main(String[] args) {
// 基本分词
// BaseAnalysisTest();
// // 精准分词
// ToAnalysisTest();
// // NLP分词
// NlpAnalysisTest();
// 词典分词(动态添加)
// DicLibraryTest();
// 词典分词(路径)
// DicLibraryPath();
// 词典分词(配置文件)
DicLibraryProperties();
}
}
全文检索分词
必须指定用户自定义词典,否则没有效果,详见 链接
定义词典
创建词典文件:default.dic
mysql n 1000
MySQL5.6 n 1000
mysql5.7.32 n 1000
mysql5.7 n 1000
mysql8 n 1000
centos n 1000
centos7 n 1000
代码
import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.library.DicLibrary;
import org.ansj.splitWord.analysis.IndexAnalysis;
import org.ansj.util.MyStaticValue;
import java.util.Iterator;
/**
* 加载歧义词库
*/
public class Test6分词 {
public static void main(String[] args) {
MyStaticValue.putLibrary(DicLibrary.DEFAULT, "D:\\default.dic");
System.out.println("加载用户词库完毕!");
String cnt = "linux(centos7) mysql5.7.32 启动、重启、停止、查看服务状态";
Result result = IndexAnalysis.parse(cnt);
Iterator<Term> it = result.iterator();
while(it.hasNext()){
Term t = it.next();
System.out.println(t.getName());
}
}
}
执行结果:
linux
(
centos7
centos
)
mysql5.7.32
mysql5.7
mysql
启动
、
重启
、
停止
、
查看
服务
状态
参考:
https://blog.csdn.net/lb521200200/article/details/53696387