Hanlp的学习
参考:HanLP 自然语言处理使用总结-CSDN博客
参考:Sprint Boot 工程中HanLP配置相对路径,始终有问题的解决方案_springboot hanlp-CSDN博客
<!--hanlp 依赖--><dependency><groupId>com.hankcs</groupId><artifactId>hanlp</artifactId><version>portable-1.8.4</version></dependency>

public class ResourceFileIoAdapter implements IIOAdapter {@Overridepublic InputStream open(String path) throws IOException {ClassPathResource resource = new ClassPathResource(path);// return Files.newInputStream(resource.getFile().toPath());// Linux环境下跑要把open()里改成这样:return resource.getInputStream();}@Overridepublic OutputStream create(String path) throws IOException {ClassPathResource resource = new ClassPathResource(path);OutputStream os = new FileOutputStream(resource.getFile());return os;}
}
http://nlp.hankcs.com/download.php?file=data
下载后


其中数据分为词典和模型,其中词典是词法分析必需的,模型是句法分析必需的,用户可以自行增删替换,如果不需要句法分析等功能的话,随时可以删除model文件夹
实践使用
从文本中提取关键字
// 提取名词关键字
public static String extractOptimizedKeywords(String text, int keywordCount) {// 获取短语List<String> termList = HanLP.extractPhrase(text, 100);// 只保留都是名词的短语List<String> termNounsList = filterOnlyNounsFromPhrases(termList);System.out.println(termNounsList);// 计算TF-IDF值并排序Map<String, Double> tfidfMap = calculateTfidf(termNounsList, text);List<Map.Entry<String, Double>> sortedKeywords = tfidfMap.entrySet().stream().sorted(Map.Entry.<String, Double>comparingByValue().reversed()).collect(Collectors.toList());// 返回出现次数最多的前keywordCount个复合关键字List<String> keywords = sortedKeywords.stream().limit(keywordCount).map(Map.Entry::getKey).collect(Collectors.toList());// 将关键词列表转换为逗号分隔的字符串return String.join(", ", keywords);}// 获取名词短语
public static List<String> filterOnlyNounsFromPhrases(List<String> phrases) {List<String> nounOnlyPhrases = new ArrayList<>();for (String phrase : phrases) {// 对每个短语进行分词和词性标注List<Term> terms = HanLP.segment(phrase);// 检查短语中是否所有词都是名词boolean allNouns = terms.stream().allMatch(term -> term.nature.toString().startsWith("n"));// 如果短语中所有词都是名词,则保留该短语if (allNouns) {nounOnlyPhrases.add(phrase);}}return nounOnlyPhrases;}// 计算TF-IDF值并排序
private static Map<String, Double> calculateTfidf(List<String> terms, String corpus) {Map<String, Integer> termFrequency = terms.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(v -> 1)));Map<String, Integer> documentFrequency = calculateDocumentFrequency(corpus);Map<String, Double> tfidf = new HashMap<>();for (Map.Entry<String, Integer> entry : termFrequency.entrySet()) {String term = entry.getKey();int freq = entry.getValue();int df = documentFrequency.getOrDefault(term, 1); // 确保df至少为1,避免log(0)double tf = (double) freq / terms.size();double idf = Math.log((double) 1 + corpus.length() / df); // 调整idf公式,用语料库长度作为文档数量的代理double tfidfValue = tf * idf;tfidf.put(term, tfidfValue);}return tfidf;}private static Map<String, Integer> calculateDocumentFrequency(String corpus) {List<Term> docTerms = HanLP.segment(corpus);return docTerms.stream().filter(term -> term.nature.toString().startsWith("n")) // 使用startsWith("n")匹配任何名词性质.collect(Collectors.groupingBy(term -> term.word, Collectors.summingInt(v -> 1)));}
相关文章:
Hanlp的学习
参考:HanLP 自然语言处理使用总结-CSDN博客 参考:Sprint Boot 工程中HanLP配置相对路径,始终有问题的解决方案_springboot hanlp-CSDN博客 <!--hanlp 依赖--><dependency><groupId>com.hankcs</groupId><artifa…...
Excel中函数SIGN()的用法
Excel中函数SIGN的用法 1. 函数详细讲解1.1 函数解释1.2 使用格式1.3 参数定义1.4 要点 2. 实用演示示例2.1 函数需求2.2 公式编写 3. 注意事项4. 文档下载5. 其他文章6. 获取全部Excel练习素材快来试试吧🥰 函数练习素材👈点击即可进行下载操作操作注意…...
如何将本地电脑上的文件夹设置为和服务器的共享文件夹
将本地电脑上的文件夹设为与服务器共享的文件夹,通常是在本地开启文件共享,并配置相应的权限,使服务器可以访问该文件夹。以下以 Windows 系统为例说明具体操作步骤: 一、在本地电脑上设置共享文件夹 选择文件夹 找到需要共享的文…...
智能建筑时代的核心选择——基于SAIL-RK3576核心板的AI边缘计算网关方案
随着智能建筑技术的不断发展,建筑设备正日益向“智慧化”迈进。传统的建筑管理系统往往依赖中央服务器和云端平台进行数据处理和控制,但在实时监控、安防及能耗管理等关键环节,延迟和数据安全问题依然存在。此外,物联网设备数量激…...
08、如何预防SQL注入
目录 1、分析及其存在哪些危险 2、预防SQL注入 1、分析及其存在哪些危险 原理: SQL 注入是一种常见的网络攻击手段,攻击者通过在用户输入中插入恶意的 SQL 语句,利用程序对用户输入处理不当的漏洞,使恶意 SQL 语句被数据库服务器执行。 通常发生在应用程序将用户输入直接拼…...
【时时三省】(C语言基础)柔性数组
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 柔性数组 C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做 柔性数组 成员。 例如: 这里把arr就称为柔性数组 有的编译器上是写成int arr&…...
mongodb详解二:基础操作
基础操作 数据库操作collection操作查看表插入数据查找数据 数据库操作 1.创建数据库 use test_db;如果没有数据库,use命令会新建一个;有的话,会切换到这个数据库 2.查看数据库 show dbs;collection操作 查看表 show tables;插入数据 …...
【数据分享】1929-2024年全球站点的逐月平均气温数据(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据!本次我们为大家带来的就是具体到气象监…...
管理口令安全和资源(一)
学习目标 Manage passwords using profiles: 使用配置文件(profiles)来管理密码。这意味着你应该能够设置和修改密码策略,比如密码的复杂性、有效期、尝试次数限制等。在Oracle数据库中,配置文件是一组可以应用于所有用户的预定义…...
【Linux】【Vim】vim编辑器的用法
一、vim简介 Vim是一款功能强大且高度可定制的文本编辑器,广泛应用于Linux 和 Unix系统中。 它不仅继承了vi编辑器的所有特性,还增加了许多新的功能,如语法高亮、代码折叠、多级撤销等。 Vim有三种主要的工作模式: 命令模式&am…...
Golang Gin系列-3:Gin Framework的项目结构
在Gin教程的第3篇,我们将讨论如何设置你的项目。这不仅仅是把文件扔得到处都是,而是要对所有东西的位置做出明智的选择。相信我,这些东西很重要。如果你做得对,你的项目会更容易处理。当你以后不再为了找东西或添加新功能而绞尽脑…...
LabVIEW实车四轮轮速信号再现系统
开发了一个基于LabVIEW的实车四轮轮速信号再现系统。该系统解决现有电机驱动传感器成本高、重复性差、真实性差和精度低等问题,提供一种高精度、低成本的轮速信号再现解决方案。 项目背景 ABS轮速传感器在现代汽车安全系统中发挥着至关重要的作用。为保证其准确性和…...
2025.1.16——六、BabySQL 双写绕过|联合注入
题目来源:buuctf [极客大挑战 2019]BabySQL 1 目录 一、打开靶机,分析已知信息 二、手工注入解题 step 1:万能密码 step 2:正常注入,判断字段数 step 3:绕过 step 4:查数据库 step 5&am…...
Spring Boot 下的Swagger 3.0 与 Swagger 2.0 的详细对比
先说结论: Swgger 3.0 与Swagger 2.0 区别很大,Swagger3.0用了最新的注释实现更强大的功能,同时使得代码更优雅。 就个人而言,如果新项目推荐使用Swgger 3.0,对于工具而言新的一定比旧的好;对接于旧项目原…...
【已解决】git clone报错:Failed to connect to github.com port 443: Timed out
1.问题原因1 报错信息1: fatal: unable to access https://github.com/microsoft/xxx/: Failed to connect to github.com port 443: Timed out 报错信息2: fatal: unable to access https://github.com/xxx/xx/: OpenSSL SSL_read: Connection was …...
Qt 程序 DPI 适配方法归纳
方案1:通过 Windows api 处理 缺点:放大之后界面会模糊。 通过调用api实现 #include <ShellScalingAPI.h> #pragma comment(lib, "Shcore.lib")HRESULT hr SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE);或者使用qt.conf 实现 在…...
AI刷题-小R的随机播放顺序、不同整数的计数问题
目录 一、小R的随机播放顺序 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终代码: 运行结果: 二、 不同整数的计数问题 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终…...
windows 极速安装 Linux (Ubuntu)-- 无需虚拟机
1. 安装 WSL 和 Ubuntu 打开命令行,执行 WSL --install -d ubuntu若报错,则先执行 WSL --update2. 重启电脑 因安装了子系统,需重启电脑才生效 3. 配置 Ubuntu 的账号密码 打开 Ubuntu 的命令行 按提示,输入账号,密…...
【影刀_常规任务计划_API调用】
影刀_常规任务计划 1、在常规任务计划被关闭或者设置了定时任务的情况下(非手动执行),通过API的方式启动任务,任务仍然可以被正常执行。 2、如果在常规任务计划里面应用中填写的参数的话, 如果通过api执行ÿ…...
参数校验 Spring Validation框架
后端参数校验 解决:校验前端传入的参数是否符合预期 1、引入依赖 使用Spring Validation框架 <!-- validation参数校验框架--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validatio…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...
【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...
