通过k-means对相似度较高的语句进行分类
本文介绍了如何使用K-Means算法对相似度较高的语句进行分类,并附上java案例代码
import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class KMeansTextClustering {public static void main(String[] args) {// 初始化语句数据集List<String> texts = new ArrayList<>();texts.add("如果他不是老师,他就是学生");texts.add("他可能是老师也可能是学生");texts.add("他经常在学校学习");texts.add("他在学校的学习成绩很好");texts.add("老师和学生在上课");texts.add("学校是学习的地方");texts.add("老师收到定金");texts.add("学校塑料袋管理科");texts.add("开心数量肯定两个都是");texts.add("开心的两个孩子");// 设置K值(簇的数量)int K = 3;// 执行K-Means算法List<List<String>> clusters = kMeans(texts, K);// 打印聚类结果for (int i = 0; i < clusters.size(); i++) {System.out.println("Cluster " + (i + 1) + ":");for (String text : clusters.get(i)) {System.out.println(text);}System.out.println();}}public static List<List<String>> kMeans(List<String> texts, int K) {// 随机选择K个语句作为初始簇中心Random random = new Random();List<String> centroids = new ArrayList<>();for (int i = 0; i < K; i++) {centroids.add(texts.get(random.nextInt(texts.size())));}boolean isChanged;List<List<String>> clusters = new ArrayList<>();do {// 创建K个空簇clusters.clear();for (int i = 0; i < K; i++) {clusters.add(new ArrayList<>());}// 分配数据点到最近的簇中心for (String text : texts) {int closestCentroidIndex = 0;double minDistance = Double.MAX_VALUE;for (int i = 0; i < K; i++) {double similarity = 1 - calcTextSim(text, centroids.get(i)); // 使用相似度的补数作为距离if (similarity < minDistance) {minDistance = similarity;closestCentroidIndex = i;}}clusters.get(closestCentroidIndex).add(text);}// 更新簇中心isChanged = false;for (int i = 0; i < K; i++) {String newCentroid = findCentroid(clusters.get(i), centroids.get(i));if (!newCentroid.equals(centroids.get(i))) {isChanged = true;centroids.set(i, newCentroid);}}} while (isChanged);return clusters;}// 计算两个语句的相似度public static double calcTextSim(String text, String targetText) {return ChineseTextRecommender.calcTextSim(text, targetText); // 返回相似度值}// 计算簇的中心点(这里简化为返回簇中第一个元素)public static String findCentroid(List<String> cluster, String currentCentroid) {if (cluster.isEmpty()) return currentCentroid;// 存储每个语句的平均相似度double[] averageSimilarities = new double[cluster.size()];// 计算每个语句与其他语句的平均相似度for (int i = 0; i < cluster.size(); i++) {double totalSimilarity = 0.0;for (int j = 0; j < cluster.size(); j++) {if (i != j) {totalSimilarity += calcTextSim(cluster.get(i), cluster.get(j));}}averageSimilarities[i] = totalSimilarity / (cluster.size() - 1);}// 找到平均相似度最高的语句作为簇中心点int centroidIndex = 0;double maxAverageSimilarity = averageSimilarities[0];for (int i = 1; i < averageSimilarities.length; i++) {if (averageSimilarities[i] > maxAverageSimilarity) {maxAverageSimilarity = averageSimilarities[i];centroidIndex = i;}}return cluster.get(centroidIndex);}
}
相似度工具:
import com.hankcs.hanlp.tokenizer.StandardTokenizer;import java.util.*;
import java.util.stream.Collectors;public class ChineseTextRecommender {public static double calcTextSim(String text, String targetText) {Map<String, Integer> targetVector = buildTermVector(targetText);Map<String, Integer> textVector = buildTermVector(text);double similarity = cosineSimilarity(targetVector, textVector);return similarity;}public static Map<String, Integer> buildTermVector(String text) {List<String> words = StandardTokenizer.segment(text).stream().map(term -> term.word).collect(Collectors.toList());Map<String, Integer> termVector = new HashMap<>();for (String word : words) {termVector.put(word, termVector.getOrDefault(word, 0) + 1);}return termVector;}// 计算余弦相似度public static double cosineSimilarity(Map<String, Integer> vectorA, Map<String, Integer> vectorB) {double dotProduct = 0.0;double normA = 0.0;double normB = 0.0;for (String key : vectorA.keySet()) {dotProduct += vectorA.get(key) * (vectorB.getOrDefault(key, 0));normA += Math.pow(vectorA.get(key), 2);}for (String key : vectorB.keySet()) {normB += Math.pow(vectorB.get(key), 2);}if (normA == 0 || normB == 0) {return 0.0;}return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));}
}
pom依赖
<!-- 分词工具 --><dependency><groupId>com.hankcs</groupId><artifactId>hanlp</artifactId><version>portable-1.8.4</version></dependency>
打印结果:
Cluster 1:
他经常在学校学习
他在学校的学习成绩很好
学校是学习的地方
学校塑料袋管理科Cluster 2:
开心数量肯定两个都是
开心的两个孩子Cluster 3:
如果他不是老师,他就是学生
他可能是老师也可能是学生
老师和学生在上课
老师收到定金
相关文章:
通过k-means对相似度较高的语句进行分类
本文介绍了如何使用K-Means算法对相似度较高的语句进行分类,并附上java案例代码 import java.util.ArrayList; import java.util.List; import java.util.Random;public class KMeansTextClustering {public static void main(String[] args) {// 初始化语句数据集…...
国信华源科技赋能长江蓄滞洪区水闸管护项目验收成果报道
“碧水悠悠绕古城,闸启长江万象新。”近日,由北京国信华源科技有限公司倾力打造的万里长江蓄滞洪区水闸管护项目,圆满通过验收,为这片鱼米之乡的防洪安全注入了新的科技活力。 长江之畔,水闸挺立,犹如干堤上…...
HTML:表格重点
用表格就用table caption为该表上部信息,用来说明表的作用 thead为表头主要信息,效果加粗 tbody为表格中的主体内容 tr是 table row 表格的行 td是table data th是table heading表格标题 ,一般表格第一行的数据都是table heading...
wine的使用方法
wine版本 所有分支,新的主要版本: wine-x.0 All branches, release candidates:各分支、候选版本: wine-x.0-rcn Stable branch updates: 稳定分支更新: wine-x.0.z Development branch updates: wine-x.y wine *.exe “更改目…...
Linux服务器离线安装unzip包
Linux服务器离线安装unzip包 1. 安装unzip包的目的 解压Docker部署包和服务部署包。 2. 查看当前环境是否已经安装unzip rpm -qa | grep --color unzip3. 下载对应的离线包 地址:http://www.rpmfind.net/linux/rpm2html/search.php?query&submitSearch 例…...
Excel拆分脚本
Excel拆分 工作表按行拆分为工作薄 工作表按行拆分为工作薄 打开要拆分的Excel文件,使用快捷键(AltF11)打开脚本界面,选择要拆分的sheet,打开Module,在Module中输入脚本代码,然后运行脚本 Su…...
Mybatis---事务
目录 引入 一、事务存在的意义 1.事务是什么? 2.Mybatis关于事务的管理 程序员自己控制处理的提交和回滚 引入 一、事务存在的意义 1.事务是什么? 多个操作同时进行,那么同时成功,那么同时失败。这就是事务。 事务有四个特性…...
企业直播间媒体分发新闻转播拉流推广名单(金融财经科技类)
【本篇由 言同数字媒体直播分发 原创】随着直播与短视频成为各大企业营销的重要手段,如何选择合适的视频平台进行内容分发与拉流成为了企业关注的焦点。对于财经和科技类企业而言,选择具有专业受众群体和广泛传播能力的平台尤为重要。下面是一些可以帮助…...
华为FreeBuds Pro 4丢了如何找回?(附查找功能使用方法)
华为FreeBuds Pro 4查找到底怎么用?华为FreeBuds Pro 4有星闪精确查找和离线查找,离线查找功能涵盖播放铃声、导航定位、星闪精确查找、上线通知、丢失模式、遗落提醒等。星闪精确查找是离线查找的子功能,当前仅华为FreeBuds Pro 4充电盒支持…...
若依微服务登录密码加密传输解决方案
文章目录 一、需求提出二、应用场景三、解决思路四、注意事项五、完整代码第一步:前端对密码进行加密第二步:后端工具类实现 RSA 加解密功能第三步:登录接口中添加解密逻辑 六、运行结果总结 一、需求提出 在默认情况下,RuoYi 微…...
NVR小程序接入平台/设备EasyNVR深度解析H.265与H.264编码视频接入的区别
随着科技的飞速发展和社会的不断进步,视频压缩编码技术已经成为视频传输和存储中不可或缺的一部分。在众多编码标准中,H.265和H.264是最为重要的两种。今天我们来将深入分析H.265与H.264编码的区别。 一、H.265与H.264编码的区别 1、比特率与分辨率 H.…...
Redisson常用方法
Redisson 参考: 原文链接 定义:Redisson 是一个用于与 Redis 进行交互的 Java 客户端库 优点:很多 1. 入门 1.1 安装 <!--redission--> <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifa…...
html自带的input年月日(date) /时间(datetime-local)/星期(week)/月份(month)/时间(time)控件
年月日期控件 type"date" <input type"date" id"StartDate" valueDateTime.Now.ToString("yyyy-MM-dd") /> //设置值 $("#StartDate").val("2024-12-12"); //获取值 var StartDate$("#StartDate&quo…...
CSS系列(12)-- 响应式设计详解
前端技术探索系列:CSS 响应式设计详解 📱 致读者:掌握响应式设计的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS 响应式设计,学习如何创建适应各种设备的网页布局。 响应式基础 🚀 视口设…...
filecoin boost GraphQL API 查询
查询示例 查询失败交易 curl -X POST \ -H "Content-Type: application/json" \ -d {"query":"query { deals(limit: 10, query: \"failed to get size of imported\") { deals { ID CreatedAt Message } } }"} \ http://localhost:…...
SAS - Subtractive Port
在SAS(串行连接SCSI,Serial Attached SCSI)协议中,subtractive port 是一种特殊类型的端口,主要用于设备间的路由功能。它的作用是在路径选择过程中充当默认路径,以处理未明确指定路径的请求。以下是它的定…...
TCP客户端模拟链接websocket服务端
因一些特殊原因研究了下TCP模拟链接websocket。原理上可以连接但具体怎么连接怎么操作就不知道了,需要研究下,以下是个人研究的方案。 用线上和本地地址来做例子: 线上wss地址:wss://server.cs.com/cs/vido/1 本地地址ws://127…...
TypeScript 的崛起:全面解析与深度洞察
一、背景与起源 (一)JavaScript 的局限性 类型系统缺失 难以在编码阶段发现类型相关错误,导致运行时错误频发。例如,将字符串误当作数字进行数学运算,可能在运行时才暴露问题。函数参数类型不明确,容易传入…...
c#笔记2024
Ctrl r e自动添加get和set CompositeCurve3d 复合曲线 List<Entity> entS listline.Cast<Entity>().ToList();//list类型强转 前面拼上\u0003,就可以实现,不管有没有命令都能打断当前命令的效果 取消其他命令:Z.doc.SendStri…...
Hadoop一课一得
Hadoop作为大数据时代的奠基技术之一,自问世以来就深刻改变了海量数据存储与处理的方式。本文将带您深入了解Hadoop,从其起源、核心架构、关键组件,到典型应用场景,并结合代码示例和图示,帮助您更好地掌握Hadoop的实战…...
AI生成图表化:深入探索Mermaid
引言 在使用生成式AI时,只要你提出让AI帮你生成mermaid图,AI的生成就会出现丰富的图形! 在现代文档编写中,图表的使用不仅能增强文档的可读性,还能更直观地表达复杂的概念和流程。Mermaid 作为一款开源的图表绘制工具…...
25.DDD数量关系
学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 关系型数据库的数量关系领域模型的数量关系实现聚合数量关系聚合内聚合间具体说明代码 数量关系是本质吗?领域对象之…...
Linux应用开发————线程池
线程池 定义:简单来说,就是存放多个线程的池子。当创建线程池时,就给池中存放一些线程,如果有任务要执行,就从池中取出一个线程执行任务,依次类推;当所有线程都在执行任务时,其他任务…...
Spring Boot 集成阿里云OSS 完成文件上传下载
前言: 文件上传下载在项目开发中是一个非常常见的业务场景,在云服务上还没有兴起的时候,一般来说都会把文件单独存放到文件服务器上,随着云服务的兴起,各类云服务厂商都提供了 OSS 服务,本篇我们分享 Spri…...
使用ERA5数据绘制风向玫瑰图的简易流程
使用ERA5数据绘制风向玫瑰图的简易流程 今天需要做一个2017年-2023年的平均风向的统计,做一个风向玫瑰图,想到的还是高分辨率的ERA5land的数据(0.1分辨率,逐小时分辨率,1950年至今)。 风向,我分为了16个&…...
测试脚本并发多进程:pytest-xdist用法
参考:https://www.cnblogs.com/poloyy/p/12694861.html pytest-xdist详解: https://www.cnblogs.com/poloyy/p/14708825.html 总 https://www.cnblogs.com/poloyy/category/1690628.html...
数据可视化的Python实现
一、GDELT介绍 GDELT ( www.gdeltproject.org ) 每时每刻监控着每个国家的几乎每个角落的 100 多种语言的新闻媒体 -- 印刷的、广播的和web 形式的,识别人员、位置、组织、数量、主题、数据源、情绪、报价、图片和每秒都在推动全球社会的事件,GDELT 为全…...
【Linux系列】Linux 系统配置文件详解:`/etc/profile`、`~/.bashrc` 和 `~/.bash_profile`
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
uni-app实现小程序、H5图片轮播预览、双指缩放、双击放大、单击还原、滑动切换功能
前言 这次的标题有点长,主要是想要表述的功能点有点多; 简单做一下需求描述 产品要求在商品详情页的头部轮播图部分,可以单击预览大图,同时在预览界面可以双指放大缩小图片并且可以移动查看图片,双击放大࿰…...
游戏引擎学习第45天
仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们刚刚开始研究运动方程,展示了如何处理当人物遇到障碍物时的情况。有一种版本是角色会从障碍物上反弹,而另一版本是角色会完全停下来。这种方式感觉不太自然,因为在游戏中,…...
百度网站建设中的自由容器/互动营销名词解释
在这之前,我曾认真的研究过鸿洋大神的Android 自定义ViewGroup 实战篇 -> 实现FlowLayout,按照大神的思路写出了一个流式布局,所有的东西都是难者不会会者不难,当自己能自定义流式布局的时候就会觉得这东西原来很简单了。如果各…...
做电影网站失败/百度在线提问
前言在实际项目中常会遇到许多功能相似的类,这时我们只有正确的理解了重载和重写的用法才能设计出清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般。本文也将着重介绍两者的区别以及应用场景。区别1.override 覆写(重写)重写发生在子类继…...
公司官方网站一般什么公司做/南昌seo快速排名
有时候直接下载其他人项目在真机上编译时, 容易遇到这个编译错误, 因为其开启了通知, 但是我们的证书又不支持这个推送证书配置, 我们到项目中找到配置文件,将其删除掉即可。 error通过项目内搜索关键字: entitlements, 找到这个文件 将其 aps-environment key 删除掉即可 enti…...
用什么软件做网站seo好/全球新冠疫情最新消息
企业网管基础笔试题1.默认时XP的文件共享是没办法设置用户权限的,只有一个是否允许网络用户更改我的文件选项,但需要对此共享文件夹设置不同的用户权限,该怎么做?答:打开资源管理器——工具——文件夹选项——查看——…...
重庆城市建设档案馆官方网站/安卓优化大师app下载安装
在国内网站中,包括三大门户,以及“引领”中国网站设计潮流的蓝色理想,ChinaUI等都是使用了px作为字体单位。只有百度好歹做了个可调的表率。而在大洋彼岸,几乎所有的主流站点都使用em作为字体单位,也就是可调的。没错&…...
常州网站快速排名优化/媒体:北京不再公布疫情数据
windows的.lib跟Unix的.a一样,属于中间级。 .o跟Windows的对象一样,是编译后的文件,需要连接起来(LINK),之后才是可执行文件。 clean:一般是make clean ,删除中间的目标文件,.o之类。可以叫别的…...