ansj 分词器(分词方式) 作者:马育民 • 2024-03-02 21:47 • 阅读:10025 # 综合比较 |名称|用户自定义词典|数字识别|人名识别|机构名识别|新词发现| |---|---|---| |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依赖 ``` org.ansj ansj_seg 5.1.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)); } /** * 面向索引分词(IndexAnalysis) */ public static void IndexAnalysisTest(){ String words = "洁面仪配合洁面深层清洁毛孔 清洁鼻孔面膜碎觉使劲挤才能出一点点皱纹"; System.out.println(IndexAnalysis.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(); // // 面向索引分词 // IndexAnalysisTest(); // 词典分词(动态添加) // DicLibraryTest(); // 词典分词(路径) // DicLibraryPath(); // 词典分词(配置文件) DicLibraryProperties(); } } ``` 参考: https://blog.csdn.net/lb521200200/article/details/53696387 原文出处:http://malaoshi.top/show_1IX7Fjy7jrRb.html