Java 开源中文分词器Ansj 学习教程

Java有11大开源中文分词器,分别是word分词器,Ansj分词器,Stanford分词器,FudanNLP分词器,Jieba分词器,Jcseg分词器,MMSeg4j分词器,IKAnalyzer分词器,Paoding分词器,smartcn分词器,HanLP分词器。

不同的分词器有不同的用法,定义的接口也不一样,至于效果哪个好,那要结合自己的应用场景自己来判断。

这里我就主要介绍Ansj中文分词器,它是一个开源的 Java 中文分词工具,基于中科院的 ictclas 中文分词算法,比其他常用的开源分词工具(如MMseg4j)的分词准确率更高,目前实现了.中文分词. 中文姓名识别 . 用户自定义词典,关键字提取,自动摘要,关键字标记等功能,适用于对分词效果要求高的各种项目。

其Github地址为https://github.com/NLPchina/ansj_seg,上面有较详细的说明。

一、依赖注入

首先添加ansj的maven依赖(目前最高版本是5.1.6):

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

注:访问 https://oss.sonatype.org/content/repositories/releases/org/ansj/ansj_seg/ 可查看或下载最新版 ansj_seg/

二、调用方式

1. 基本分词-BaseAnalysis

基本就是保证了最基本的分词.词语颗粒度最非常小的,所涉及到的词大约是10万左右,
基本分词速度非常快,在macAir上.能到每秒300w字每秒,同时准确率也很高.但是对于新词他的功能十分有限。

简单的示例代码:

	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		String text = "20个左边的卡罗拉倒车镜! ";
		Result analysisedResult = BaseAnalysis.parse(text);
		long endTime = System.currentTimeMillis();
		long time = endTime - startTime;
		System.out.println("基本分词: " + analysisedResult + "(" + time + "ms)");
	}

输出的结果:

基本分词: 20/m,个/q,左边/f,的卡/n,罗/j,拉/v,倒车镜/n,!/w, (1871ms)

可以看到分词后会在词语的后边加上对应词语的词性
如何不输出词性,仅输出词?
可以在后面加上.toStringWithOutNature()

	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		String text = "20个左边的卡罗拉倒车镜! ";
		String analysisedText = BaseAnalysis.parse(text).toStringWithOutNature();
		long endTime = System.currentTimeMillis();
		long time = endTime - startTime;
		System.out.println("基本分词: " + analysisedText + "(" + time + "ms)");
	}

输出的结果:

基本分词: 20,个,左边,的卡,罗,拉,倒车镜,!, (1990ms)

可以看到现在后面的词性没有了,只输出了词

2. 精准分词-ToAnalysis

它在易用性,稳定性.准确性.以及分词效率上.都取得了一个不错的平衡。
如果你初次赏识Ansj如果你想开箱即用.那么就用这个分词方式是不会错的。

简单的示例代码:

	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		String text = "20个左边的卡罗拉倒车镜! ";
		String analysisedText = ToAnalysis.parse(text).toStringWithOutNature();
		long endTime = System.currentTimeMillis();
		long time = endTime - startTime;
		System.out.println("精准分词: " + analysisedText + "(" + time + "ms)");
	}

输出的结果:

精准分词: 20个,左边,的卡,罗拉,倒车镜,!, (1856ms)
3. nlp分词-NlpAnalysis

nlp的适用方式:语法实体名抽取.未登录词整理.只要是对文本进行发现分析等工作

简单的示例代码:

	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		String text = "20个左边的卡罗拉倒车镜! ";
		String analysisedText = NlpAnalysis.parse(text).toStringWithOutNature();
		long endTime = System.currentTimeMillis();
		long time = endTime - startTime;
		System.out.println("nlp分词: " + analysisedText + "(" + time + "ms)");
	}

输出的结果:

nlp分词: 20个,左边,的,卡,罗拉,倒车镜,!, (2712ms)
4. 面向索引的分词-IndexAnalysis

面向索引的分词,故名思议就是适合在lucene等文本检索中用到的分词。
主要考虑以下两点:
召回率是对分词结果尽可能的涵盖。比如对“上海虹桥机场南路” 召回结果是[上海/ns, 上海虹桥机场/nt, 虹桥/ns, 虹桥机场/nz, 机场/n, 南路/nr]

准确率其实这和召回本身是具有一定矛盾性的Ansj的强大之处是很巧妙的避开了这两个的冲突 。比如我们常见的歧义句“旅游和服务”->对于一般保证召回 。大家会给出的结果是“旅游 和服 服务” 对于ansj不存在跨term的分词。意思就是。召回的词只是针对精准分词之后的结果的一个细分。比较好的解决了这个问题

简单的示例代码:

	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		String text = "20个左边的卡罗拉倒车镜! ";
		String analysisedText = IndexAnalysis.parse(text).toStringWithOutNature();
		long endTime = System.currentTimeMillis();
		long time = endTime - startTime;
		System.out.println("面向索引的分词: " + analysisedText + "(" + time + "ms)");
	}

输出的结果:

面向索引的分词: 20个,左边,的卡,罗拉,倒车镜,!, (1825ms)

5. 四种方式比较

四种方式功能统计如下:
在这里插入图片描述

三、 停词器

停用词需求是一种及其常见的需求,好处很多很多,令人惊讶的是坏处比好处还多,所以一般情况下不要用这个,比较耗费cpu

第一步实例化停用器

第二步调用过滤:
如下面的三种形式的过滤(用精准分词来举例)

1. 过滤词性(insertStopNatures())

简单的示例代码:

	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		StopRecognition stopRecognition = new StopRecognition();
		String text = "20个左边的卡罗拉倒车镜! ";

		//剔除标点符号(w)
		stopRecognition.insertStopNatures("w");
		String analysisedText = ToAnalysis.parse(text).recognition(stopRecognition)
		.toStringWithOutNature().replaceAll(","," ");
		long endTime = System.currentTimeMillis();
		long time = endTime - startTime;
		System.out.println("精准分词: " + analysisedText + "(" + time + "ms)");
	}

输出的结果:

精准分词: 20个 左边 的卡 罗拉 倒车镜  (1974ms)

从结果可以看到句中的感叹号已经被剔除了

2. 过滤单词(insertStopWords())

简单的示例代码:

	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		StopRecognition stopRecognition = new StopRecognition();
		String text = "20个左边的卡罗拉倒车镜! ";

		//剔除指定的分词
		stopRecognition.insertStopWords("20个");
		String analysisedText = ToAnalysis.parse(text).recognition(stopRecognition)
		.toStringWithOutNature().replaceAll(","," ");
		long endTime = System.currentTimeMillis();
		long time = endTime - startTime;
		System.out.println("精准分词: " + analysisedText + "(" + time + "ms)");
	}

输出的结果:

精准分词: 左边 的卡 罗拉 倒车镜 !  (2089ms)

从结果可以看到20个已经被剔除了

3. 支持正则表达式(insertStopRegexes())

简单的示例代码:

	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		StopRecognition stopRecognition = new StopRecognition();
		String text = "20个左边的卡罗拉倒车镜! ";

		//剔除指定的分词
		stopRecognition.insertStopRegexes("倒车.*?");
		String analysisedText = ToAnalysis.parse(text).recognition(stopRecognition)
		.toStringWithOutNature().replaceAll(","," ");
		long endTime = System.currentTimeMillis();
		long time = endTime - startTime;
		System.out.println("精准分词: " + analysisedText + "(" + time + "ms)");
	}

简单的示例代码:

精准分词: 20个 左边 的卡 罗拉 !  (2004ms)

从结果可以看到“倒车镜”已经被剔除了


参考:

AnsjSeg使用手册

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
很抱歉,jieba分词是Python中的中文分词工具,Java中并没有直接使用jieba的方法。不过Java中也有很多优秀的中文分词工具,比如ansj、HanLP等。这里以ansj为例,介绍如何在Java中使用中文分词工具提取关键词。 首先,需要在Java项目中引入ansj分词的jar包。然后,可以按照以下步骤使用ansj分词提取关键词: 1. 导入ansj分词的相关类: ```java import org.ansj.domain.Result; import org.ansj.splitWord.analysis.ToAnalysis; import org.ansj.util.FilterModifWord; ``` 2. 调用ToAnalysis.parse()方法对文本进行分词: ```java String text = "这是一段待分词的文本"; Result result = ToAnalysis.parse(text); ``` 3. 调用FilterModifWord.insertStopWords()方法添加停用词(可选): ```java FilterModifWord.insertStopWords(Arrays.asList("的", "是", "一", "段")); ``` 4. 调用FilterModifWord.modifResult()方法过滤分词结果: ```java result = FilterModifWord.modifResult(result); ``` 5. 遍历分词结果,提取关键词: ```java List<String> keywords = new ArrayList<>();for (int i = 0; i < result.size(); i++) { String word = result.get(i).getName(); String natureStr = result.get(i).getNatureStr(); if (!natureStr.startsWith("w")) { // 过滤掉标点符号 keywords.add(word); } } ``` 以上就是使用ansj分词Java中提取关键词的步骤。需要注意的是,ansj分词默认使用的是基于词典的分词方式,对于一些新词或专有名词可能无法很好地识别,需要手动添加词典或调整分词规则。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值