java实现文本相似度计算

news2024/9/21 0:36:59

需求

**文本推荐:**有多个文本字符串,如何设计一个简单的统计方法(从词频的角度设计),来计算出多个文本字符串两两之间的相似度,并输出大于指定相似度阈值的文本

分析理解

使用Java实现文本相似度计算的一种方法是通过构建词频向量并计算余弦相似度,具体介绍如下,简单易懂
在这里插入图片描述
在这里插入图片描述

代码实现

复杂粘贴可以直接运行

        <!--  使用HanLP进行分词  -->
        <dependency>
            <groupId>com.hankcs</groupId>
            <artifactId>hanlp</artifactId>
            <version>portable-1.8.4</version>
        </dependency>
import com.hankcs.hanlp.tokenizer.StandardTokenizer;
import java.util.*;
import java.util.stream.Collectors;

public class ChineseTextRecommender {

    // 使用HanLP进行中文分词
    // 构建词频向量
    // 假设我们有两个文本文档,我们想衡量它们的主题相似性。每个文档可以被表示为一个向量,其中包含词频(TF)或TF-IDF值。
    // 文档A: "the cat sat on the mat on the mat"
    // 文档B: "the cat and the dog played"
    // 我们选择几个关键词:"the", "cat", "sat", "on", "mat", "and", "dog", "played"。每个词在文档中出现的次数(词频)可以构成一个向量。
    // 向量A: [2, 1, 1, 1, 2, 0, 0, 0]("the", "cat", "sat", "on", "mat", "and", "dog", "played")
    // 向量B: [1, 1, 0, 0, 0, 1, 1, 1]
    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));
    }

    // 推荐与指定文本相似度高的文本 texts为待判断文本列表
    public static List<String> recommendTexts(List<String> texts, String targetText, double threshold) {
        Map<String, Double> similarityScores = new HashMap<>();
        Map<String, Integer> targetVector = buildTermVector(targetText);

        for (String text : texts) {
            Map<String, Integer> textVector = buildTermVector(text);
            double similarity = cosineSimilarity(targetVector, textVector);
            similarityScores.put(text, similarity);
            System.out.println(text + " ----Similarity: " + similarity);
        }

        return similarityScores.entrySet().stream()
                .filter(entry -> entry.getValue() >= threshold)
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());
    }

    public static void main(String[] args) {
        // 相似度分别为0.91 0.59 0.54 0.799 0.791
        List<String> texts = Arrays.asList("这是一个测试文档吗", "这是第二个文档", "这是第三个文档","这是一个文档吗","这是第一个测试文档吧哈哈");
        String targetText = "这是一个测试文档";
        double threshold = 0.8; // 理论上,阈值在0.5左右都可以接受

        List<String> recommendedTexts = recommendTexts(texts, targetText, threshold);

        System.out.println("推荐文本:");
        recommendedTexts.forEach(System.out::println);
    }
}

输出结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9月产品更新 | 超10项功能升级,快来看看你的需求上线了吗?

Smartbi用户可以在官网&#xff08;PC端下载&#xff09;&#xff0c;更新后便可以使用相关功能&#xff0c;也可以在官网体验中心体验相关功能。 接下来&#xff0c;我们一起来看看都有哪些亮点功能更新吧。 ▎插件商城 Smartbi麦粉社区的应用市场新增了“插件”模块&#xf…

Python(PyTorch和TensorFlow)图像分割卷积网络导图(生物医学)

&#x1f3af;要点 语义分割图像三层分割椭圆图像脑肿瘤图像分割动物图像分割皮肤病变分割多模态医学图像多尺度特征生物医学肖像多类和医学分割通用图像分割模板腹部胰腺图像分割分类注意力网络病灶边界分割气胸图像分割 Python生物医学图像卷积网络 该网络由收缩路径和扩…

《黑神话悟空》四大弟子三十六难解锁方法

在《黑神话悟空》的神秘世界中&#xff0c;探索和战斗是永恒的主题。对于许多玩家而言&#xff0c;解锁游戏中的成就不仅是对技巧的挑战&#xff0c;也是对游戏深度理解的证明。今天&#xff0c;就让我们一起深入探索如何解锁“四大弟子三十六难”这一成就&#xff0c;让你的旅…

基于协同过滤算法+SpringBoot+Vue+MySQL的商品推荐系统

系统展示 用户前台界面 管理员后台界面 系统背景 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛运用&#xff0c;以及…

SmartNews如何赋能日本市场解锁购买力强劲广告营销新篇章

SmartNews如何赋能日本市场解锁购买力强劲广告营销新篇章 在数字化浪潮席卷全球的今天&#xff0c;日本市场以其独特的消费文化和强大的购买力&#xff0c;成为了众多品牌竞相角逐的舞台。而SmartNews&#xff0c;作为一款集新闻聚合、个性化推荐与深度内容分析于一体的智能新…

[Linux]:文件(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 1. C语言文件操作 C语言文件操作接口如下&#xff0c;详情可参照——C语言文…

零基础国产GD32单片机编程入门(十九)红外避障传感器模块实战含源码

文章目录 一.概要二.红外避障模块主要参数1.模块引脚定义2.模块特点3.模块原理图 三.GD32单片机红外避障模块检测实验四.工程源代码下载五.小结 一.概要 红外避障模块具有一对红外线发射与接收管&#xff0c;发射管发射出一定频率的红外线&#xff0c;当检测遇到障碍物时&…

HTML5( HTML5 、CSS3) 第一天

HTML5 第一天 HTML5 第一天一、什么是 HTML5二、HTML5 新增标签三、多媒体音频标签四、多媒体视频标签五、新增 input 标签六、新增表单属性七、CSS3 新特性八、CSS3 属性选择器九、结构伪类选择器十、nth-child 参数详解十一、nth-child 和 nt-of-type 的区别十二、伪元素选…

写作翻译两不误!Deepl翻译,我的创意加速器

嘿&#xff0c;朋友们&#xff01;有没有觉得有时候写论文的摘要、给外国朋友发邮件&#xff0c;或者追剧的时候没有字幕&#xff0c;这些都挺让人头疼的&#xff1f;就像是在猜谜语一样难搞&#xff1f;别担心&#xff0c;我有个好消息要告诉大家&#xff0c;2024年翻译界出了…

azkaban安装

azkaban安装 Azkaban介绍azkaban三大组件 Azkaban安装1、下载地址2、安装前准备3、安装1、分别解压web-server、executor-server2、初始化脚本 4、配置ssl认证5、配置 execServer6、配置web-server7、配置user8、启动、激活 验证 Azkaban介绍 Azkaban是由Linkedin开源的一个批…

【西电电装实习】3. SMT

前言 西电电装实习 定义 SMT&#xff0c;全称为Surface Mount Technology&#xff0c;即表面贴装技术。 是一种将电子元器件直接贴装在印刷电路板&#xff08;PCB&#xff09;表面的工艺。 与传统的插针式组装方法相比&#xff0c;SMT技术具有更高的组装密度、更小的电子产品…

excel提示宏病毒处理

excel提示宏病毒如何解决&#xff1f; 文章目录 操作步骤1、打开文件2、找到选项3、点击信用中心4、点击信任中心设置5. 依次点击&#xff1a;点击宏设置→通过通知禁用 VBA 宏&#xff08;A&#xff09;→&#xff08;去掉√&#xff09;信任对VBA工程对象模型的访问→确定6、…

MySQL总结(上)

目录 一、SQL语句1.1、DDL&#xff08;数据库定义语言&#xff09;1.1.1、定义数据库1.1.2、定义数据表 1.2、DML&#xff08;数据库操作语言&#xff09;1.2.1、增加 insert into1.2.2、删除 delete1.2.3、修改 update 1.3、DQL&#xff08;数据库查询语言&#xff09;1.3.1、…

info_scan!自动化漏洞扫描系统,附下载链接

在我们团队的日常工作中&#xff0c;定期进行安全演练和漏洞扫描几乎是必不可少的。每次安全互动我们都需要对关键资产进行全面的安全评估&#xff0c;及时发现可能存在的安全隐患。 就在上周&#xff0c;我们针对几个主要服务进行了例行的漏洞扫描。在这个过程中&#xff0c;…

【数学分析笔记】第3章第2节 连续函数(3)

3. 函数极限与连续函数 3.2 连续函数 【Riemann&#xff08;黎曼&#xff09;函数】 R ( x ) { 0 , x 是无理数 1 p , x q p , p ∈ N , q ∈ Z 且 q ≠ 0 , p 与 q 互质 1 , x 0 R(x)\left\{\begin{matrix} 0&,x是无理数 \\ \frac{1}{p}&,x\frac{q}{p},p\in\mat…

你真的懂吗系列——GPIO

你真的懂吗 文章目录 你真的懂吗前言一、GPIO介绍二、GPIO基本结构三、GPIO的八种模式浮空输入输入上拉输入下拉模拟输入开漏输出推挽输出什么是推挽结构和推挽电路&#xff1f;开漏输出和推挽输出的区别&#xff1f;开漏式复用推挽式复用 前言 最近在做STM32的时候发现有些寄…

利用 Zero-1-2-3 进行多视图 3D 重建:从单图像到多视图 3D 模型的生成

3D 模型生成在计算机视觉领域有着广泛的应用&#xff0c;从虚拟现实到自动驾驶&#xff0c;基于单张图像的 3D 重建技术正在迅速发展。这篇博客将带你深入探索如何使用 Zero-1-2-3 框架进行多视图 3D 重建&#xff0c;通过详细解析该框架中的代码结构和功能&#xff0c;帮助你理…

BUUCTF 之Basic 1(BUU LFI COURSE 1)

1、启动靶场&#xff0c;会生成一个URL地址&#xff0c;打开给的URL地址&#xff0c;会看到一个如下界面 可以看到是一个PHP文件&#xff0c;非常的简单&#xff0c;就几行代码&#xff0c;判断一下是否有一个GET的参数&#xff0c;并且是file名字&#xff0c;如果是并且加载&a…

C语言 预处理详解(二) #命令行定义 #条件编译 #文件包含 #其他预处理指令

文章目录 前言 一、命令行定义 二、条件编译 三、文件包含 什么叫做文件包含&#xff1f; (一)、本地文件包含 (二)、库文件包含 如何做才能避免头文件被多次包含呢&#xff1f; 方法一&#xff1a;利用条件编译&#xff1a; 方法二&#xff1a;利用 #pragma once 四、其他预处…

鸿蒙界面开发——组件(8):图形绘制

绘制几何图形——父组件Shape 绘制组件的父组件&#xff0c;父组件中会描述所有绘制组件均支持的通用属性。 1、绘制组件使用Shape作为父组件&#xff0c;实现类似SVG的效果。 2、绘制组件单独使用&#xff0c;用于在页面上绘制指定的图形。 Shape(value?: PixelMap) value …