中文分词封装 - TokenizerUtil
# 中文分词封装 - TokenizerUtil
# 1. 介绍
在搜索引擎和自然语言处理(NLP)领域,中文分词是非常重要的一环。市面上有多种中文分词库,但它们的使用方式各不相同,增加了学习成本。为了简化分词库的使用,Hutool 对常见的分词库进行了统一封装,通过抽象出统一的接口,隔离不同库之间的差异,实现了在多个分词库之间的无缝切换。
目前,Hutool 支持的分词引擎包括:
- Ansj (opens new window)
- HanLP (opens new window)
- IKAnalyzer (opens new window)
- Jcseg (opens new window)
- Jieba (opens new window)
- mmseg4j (opens new window)
- Word (opens new window)
- Smartcn (opens new window)
注意:该工具从 Hutool-4.4.0 开始支持。
# 2. 原理
Hutool 的分词引擎封装基于类似于 Java 日志门面的思想,通过抽象三个概念,实现了不同分词库的统一调用接口:
TokenizerEngine
:分词引擎,封装了具体的分词库对象。Result
:分词结果接口,定义了对文本进行分词后的结果,支持迭代遍历分词结果。Word
:表示分词中的一个词,可以获取词语文本、起始位置和结束位置等信息。
Hutool 的 TokenizerFactory
可以根据用户引入的分词库自动选择使用哪种分词引擎,这样用户无需关注具体的分词库,只需调用统一的 API。
# 3. 使用
# 3.1 引入分词库依赖
根据需要选择引入一个或多个分词库,例如:
<!-- 引入 HanLP 依赖 -->
<dependency>
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>1.7.8</version>
</dependency>
1
2
3
4
5
6
2
3
4
5
6
提示:只需引入想要使用的分词库,Hutool 会自动识别并路由到对应的引擎。
# 3.2 自动解析文本并分词
通过 TokenizerUtil
可以自动选择分词库并解析文本。
import cn.hutool.core.collection.CollUtil;
import cn.hutool.extra.tokenizer.TokenizerEngine;
import cn.hutool.extra.tokenizer.TokenizerUtil;
import cn.hutool.extra.tokenizer.Result;
import cn.hutool.extra.tokenizer.Word;
import java.util.Iterator;
public class TokenizerExample {
public static void main(String[] args) {
// 自动根据引入的分词库选择引擎
TokenizerEngine engine = TokenizerUtil.createEngine();
// 要解析的文本
String text = "这两个方法的区别在于返回值";
// 解析文本
Result result = engine.parse(text);
// 将分词结果连接为字符串
String resultStr = CollUtil.join((Iterator<Word>) result, " ");
// 输出分词结果
System.out.println(resultStr); // 输出:这 两个 方法 的 区别 在于 返回 值
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
代码解析:
TokenizerUtil.createEngine()
:自动选择合适的分词引擎,基于用户引入的分词库。engine.parse(text)
:解析文本并返回分词结果Result
对象。CollUtil.join((Iterator<Word>) result, " ")
:将分词结果通过空格连接成字符串,便于输出和展示。
实际开发场景:
- 在需要进行文本分词的场景中,无需关心具体使用的分词库,代码保持统一,方便库的替换和升级。
# 3.3 自定义分词引擎
如果需要手动指定使用的分词库,可以直接实例化对应的引擎。例如,使用 HanLP 引擎:
import cn.hutool.extra.tokenizer.engine.hanlp.HanLPEngine;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.extra.tokenizer.Result;
import cn.hutool.extra.tokenizer.Word;
import java.util.Iterator;
public class CustomEngineExample {
public static void main(String[] args) {
// 手动指定使用 HanLP 引擎
HanLPEngine engine = new HanLPEngine();
// 要解析的文本
String text = "这两个方法的区别在于返回值";
// 解析文本
Result result = engine.parse(text);
// 将分词结果连接为字符串
String resultStr = CollUtil.join((Iterator<Word>) result, " ");
// 输出分词结果
System.out.println(resultStr); // 输出:这 两个 方法 的 区别 在于 返回 值
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
代码解析:
HanLPEngine
:明确指定使用 HanLP 分词引擎,适合在项目中固定使用某个分词库时采用。
实际开发场景:
- 当项目需求固定使用某个分词库时,可以手动指定引擎,避免自动路由可能带来的不确定性。
# 4. 总结
通过 TokenizerUtil
,Hutool 提供了一个统一的中文分词接口,解决了不同分词库的兼容问题。无论使用哪种分词库,开发者都可以通过相同的 API 进行调用,极大地降低了学习成本和代码维护成本。
在分词库升级、切换的场景下,只需调整 Maven 依赖,无需修改核心代码,增强了代码的可扩展性和灵活性。
!
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08