ansj添加自定义词典以及解决ansj加载自定义词典不起作用问题

pom文件中添加

        <!--        Ansj中文分词-->
        <dependency>
            <groupId>org.ansj</groupId>
            <artifactId>ansj_seg</artifactId>
            <version>5.1.6</version>
        </dependency>

我定义的dict文件内容

推特	n	57969
中华	n	57969
周杰伦	n	57969
时光机	n	57969

 

 实现

方式1

通过Library加载自定义字典文件,分词的时候将forset对象传入

    @Test
    public void contextLoadsAnalysis() throws Exception {
        Forest forest = null;
        String text = "中西西红柿炖牛腩通报推特手机这是一段测试文字周杰伦的时光机";
        Resource resource = new ClassPathResource("/library/userLibrary.dic");
        InputStream fis = resource.getInputStream();
        forest = Library.makeForest(fis);
        Forest forest1 = Library.makeForest(Objects.requireNonNull(this.getClass().getResourceAsStream("/library/default.dic")));
        System.out.println("Anysis 分词  -------------");
        System.out.println("DicAnalysis自定义分词  -------------");
        System.out.println(DicAnalysis.parse(text,forest1));
        System.out.println(DicAnalysis.parse(text));
        System.out.println("NlpAnalysis自定义分词  -------------");
        System.out.println(NlpAnalysis.parse(text,forest));
        System.out.println(NlpAnalysis.parse(text));
        System.out.println("其他自定义分词  -------------");
        System.out.println(ToAnalysis.parse(text));
        System.out.println(IndexAnalysis.parse(text));
        System.out.println(BaseAnalysis.parse(text));
    }

结果如下:

可能出现的问题:

词典添加的词不生效:编辑的tab其实不是\t,我试了半天就是因为在idea中手动tab结果不是真正的\t,后面直接复制了作者文档里的数据(PS:用户自定义词典这里面有例子数据)改了改数据就成功了

方式2

使用作者说的动态添加词典直接加载词。但是如果数据量大一个个加,肯定很麻烦。

        //动态添加
        String str ="我觉得中文分词是一个不错的系统";
        DicLibrary.insert(DicLibrary.DEFAULT, "我觉得", "n", 1000);
        DicLibrary.insert(DicLibrary.DEFAULT, "是一个不错的系统", "n", 1000);
        Result terms2 = DicAnalysis.parse(str);
        System.out.println(terms2);

删除词就只要使用DicLibrary.delete(DicLibrary.DEFAULT, "我是词");

注意!!!

如果是DicLibrary.insert(DicLibrary.DEFAULT, "增加新词", "我是词性", 1000);这样添加词典,使用ToAnalysis 、DicAnalysis 、NlpAnalysis 、IndexAnalysis 都会被影响,使用添加的词分词。比如输入【名称性别电话】一般会拆开成【名称】、【性别】和【电话】,这个时候通过DicLibrary.insert(DicLibrary.DEFAULT, "名称性别", "n", 1000);加入词典,那么除了使用BaseAnalysis之外的所有分词发方式输出的结果都是【名称性别】、【电话】

这是ansj文档里面功能统计:

名称用户自定义词典数字识别人名识别机构名识别新词发现
BaseAnalysisXXXXX
ToAnalysisXX
DicAnalysisXX
IndexAnalysisXX
NlpAnalysis

方式2.2

所以为了不影响其他分词方式的使用,最好使用自定义的key,想要使用这个词典的时候直接DicAnalysis.parse("xx",DicLibrary.gets(key));、ToAnalysis.parse("xx",DicLibrary.gets(key));等等都可以,再次使用分词DicAnalysis.parse("xx")也不会这个自定义的词典被影响。

/**
	 * 自定义key
	 */
	@Test
	public void keyTest(){
		String key = "dic_mykey" ;
		DicLibrary.put(key, key, new Forest());
		DicLibrary.insert(key, "增加新词", "我是词性", 1000);
		Result parse = DicAnalysis.parse("这是用户自定义词典增加新词的例子",DicLibrary.gets(key));
		System.out.println(parse);
		boolean flag = false;
		for (Term term : parse) {
			flag = flag || "增加新词".equals(term.getName());
		}
		Assert.assertTrue(flag);
	}

方式3(我试了不起作用,用方式1保险)

根据网上的方法和作者的操作文档用户自定义词典试了蛮多回,在项目根路径下创建library.properties 并添加

#path of userLibrary this is default library
dic=library/default.dic

 试了半天,但并未起作用,迷惑。

看了下别人出现的问题,只找到了一个已经关闭的issues里面的回答

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值