java调用Hanlp分词器获取词性;自定义词性字典

2024-01-06 19:52

本文主要是介绍java调用Hanlp分词器获取词性;自定义词性字典,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

若解读用户输入的一段话,找出输入内容的构成(名词、动词、形容词、地名、人名等)以便进一步的处理。

一、配置pom,导包:

   <dependency><groupId>com.hankcs</groupId><artifactId>hanlp</artifactId><version>portable-1.6.8</version></dependency>

二、java代码实现分词:

/**** hanlp分词* @param input*/public static Map<String, String> getOut(String input){Map<String, String> resMap = new HashMap<>();Segment segment = HanLP.newSegment(); //使用Hanlp分词List<Term> termList = segment.seg(input);//遍历分词结果for (Term term : termList) {String word = term.toString().substring(0, term.length()); //词String nature = term.toString().substring(term.length() + 1); //词性if (StringUtils.isNotBlank(word) && StringUtils.isNotBlank(nature)) {//将词及词性放到Map结果集中resMap.put(word, nature);}}return resMap;}public static void main(String[] args) {Map<String, String> out = getOut("我爱吃薯片,它是红薯油炸而来的,紫罗兰熊猫");System.out.println("out = " + out);}

运行结果:

out = {紫罗兰=n, 红薯=n, 它=rr, 的=ude1, 来=vf, 薯片=nf, ,=w, 而=cc, 是=vshi, 熊猫=n, 我=rr, 油炸=v, 爱吃=v}

对照hanlp的词性表,得到每个词的词性:

符号描述
a形容词
ad副形词
ag形容词性语素
al形容词性惯用语
an名形词
b区别词
begin仅用于始##始
bg区别语素
bl区别词性惯用语
c连词
cc并列连词
d副词
dg辄,俱,复之类的副词
dl连语
e叹词
end仅用于终##终
f方位词
g学术词汇
gb生物相关词汇
gbc生物类别
gc化学相关词汇
gg地理地质相关词汇
gi计算机相关词汇
gm数学相关词汇
gp物理相关词汇
h前缀
i成语
j简称略语
k后缀
l习用语
m数词
mg数语素
Mg甲乙丙丁之类的数词
mq数量词
n名词
nb生物名
nba动物名
nbc动物纲目
nbp植物名
nf食品,比如“薯片”
ng名词性语素
nh医药疾病等健康相关名词
nhd疾病
nhm药品
ni机构相关(不是独立机构名)
nic下属机构
nis机构后缀
nit教育相关机构
nl名词性惯用语
nm物品名
nmc化学品名
nn工作相关名词
nnd职业
nnt职务职称
nr人名
nr1复姓
nr2蒙古姓名
nrf音译人名
nrj日语人名
ns地名
nsf音译地名
nt机构团体名
ntc公司名
ntcb银行
ntcf工厂
ntch酒店宾馆
nth医院
nto政府机构
nts中小学
ntu大学
nx字母专名
nz其他专名
o拟声词
p介词
pba介词“把”
pbei介词“被”
q量词
qg量词语素
qt时量词
qv动量词
r代词
rg代词性语素
Rg古汉语代词性语素
rr人称代词
ry疑问代词
rys处所疑问代词
ryt时间疑问代词
ryv谓词性疑问代词
rz指示代词
rzs处所指示代词
rzt时间指示代词
rzv谓词性指示代词
s处所词
t时间词
tg时间词性语素
u助词
ud助词
ude1的 底
ude2
ude3
udeng等 等等 云云
udh的话
ug
uguo
uj助词
ul连词
ule了 喽
ulian连 (“连小学生都会”)
uls来讲 来说 而言 说来
usuo
uv连词
uyy一样 一般 似的 般
uz
uzhe
uzhi
v动词
vd副动词
vf趋向动词
vg动词性语素
vi不及物动词(内动词)
vl动词性惯用语
vn名动词
vshi动词“是”
vx形式动词
vyou动词“有”
w标点符号
wb百分号千分号,全角:% ‰ 半角:%
wd逗号,全角:, 半角:,
wf分号,全角:; 半角: ;
wh单位符号,全角:¥ $ £ ° ℃ 半角:$
wj句号,全角:。
wky右括号,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { >
wkz左括号,全角:( 〔 [ { 《 【 〖 〈 半角:( [ { <
wm冒号,全角:: 半角: :
wn顿号,全角:、
wp破折号,全角:—— -- ——- 半角:— —-
ws省略号,全角:…… …
wt叹号,全角:!
ww问号,全角:?
wyy右引号,全角:” ’ 』
wyz左引号,全角:“ ‘ 『
x字符串
xu网址URL
xx非语素字
y语气词(delete yg)
yg语气语素
z状态词
zg状态词

三、到这基本的分词及词性已经获取到了,但是又发现这样得到的词性都是固定的,像我输入的这段话"请问怎么哪家公司有边缘计算相关的项目?"中,"边缘计算"被分成了"边缘"(n-名词)、"计算"(v-动词),但是业务需求是"边缘计算"属于某些项目的业务标签,定义在系统的字典表中,这时就要自定义hanlp的词性了。

查了一些文章,基本都是导入一个自定义的txt文件,文件中定义词及词性,但是我这里是通过maven引用的hanlp包,而且自定义的词性也不是固定的,而是从系统的字典表中动态读取的。于是有了以下代码:

/**** hanlp分词* @param input*/public static Map<String, String> getOut(String input){Map<String, String> resMap = new HashMap<>();//使用Hanlp分词;允许用户自定义词性字典Segment segment = HanLP.newSegment().enableCustomDictionary(true);//添加自定义词性(此处添加了一个词做测试;真实业务中是读取字典表中的词并添加到自定义词性)//其中"zingyidongwu"是自定义的词性CustomDictionary.add("紫罗兰熊猫","zingyidongwu");List<Term> termList = segment.seg(input);//遍历分词结果for (Term term : termList) {String word = term.toString().substring(0, term.length()); //词String nature = term.toString().substring(term.length() + 1); //词性if (StringUtils.isNotBlank(word) && StringUtils.isNotBlank(nature)) {//将词及词性放到Map结果集中resMap.put(word, nature);}}return resMap;}public static void main(String[] args) {Map<String, String> out = getOut("我爱吃薯片,它是红薯油炸而来的,紫罗兰熊猫");System.out.println("out = " + out);}

运行结果:

out = {紫罗兰熊猫=n, 红薯=n, 它=rr, 的=ude1, 来=vf, 薯片=nf, ,=w, 而=cc, 是=vshi, , 我=rr, 油炸=v, 爱吃=v}

可以看到,这次的分词结果中,"边缘计算"没有被拆分,而且词性也变成了自定义的"ywbq"词性。

这篇关于java调用Hanlp分词器获取词性;自定义词性字典的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/577427

相关文章

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1