ansj 分词器(分词方式)

综合比较

名称 用户自定义词典 数字识别 人名识别 机构名识别 新词发现
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