计算文本相似度的几种方法

计算文本相似度的几种方法

大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一下计算文本相似度的几种方法。文本相似度在自然语言处理(NLP)领域中有着广泛的应用,包括搜索引擎、推荐系统、文本分类等。下面我们将介绍几种常用的文本相似度计算方法,并给出相应的Java代码示例。

一、Jaccard相似度

Jaccard相似度是一种简单而有效的文本相似度度量方法。它通过计算两个集合的交集与并集的比值来衡量相似度。公式如下:

[ \text{Jaccard Similarity} = \frac{|A \cap B|}{|A \cup B|} ]

在Java中可以使用如下代码计算Jaccard相似度:

package cn.juwatech.similarity;

import java.util.HashSet;
import java.util.Set;

public class JaccardSimilarity {
    public static double computeJaccardSimilarity(String text1, String text2) {
        Set<String> set1 = new HashSet<>(Set.of(text1.split("\\s+")));
        Set<String> set2 = new HashSet<>(Set.of(text2.split("\\s+")));

        Set<String> intersection = new HashSet<>(set1);
        intersection.retainAll(set2);

        Set<String> union = new HashSet<>(set1);
        union.addAll(set2);

        return (double) intersection.size() / union.size();
    }

    public static void main(String[] args) {
        String text1 = "I love programming in Java";
        String text2 = "Java programming is fun";

        double similarity = computeJaccardSimilarity(text1, text2);
        System.out.println("Jaccard Similarity: " + similarity);
    }
}

二、余弦相似度

余弦相似度通过计算两个向量之间的夹角余弦值来衡量相似度。它在处理高维数据时非常有效,公式如下:

[ \text{Cosine Similarity} = \frac{\mathbf{A} \cdot \mathbf{B}}{|\mathbf{A}| |\mathbf{B}|} ]

在Java中可以使用如下代码计算余弦相似度:

package cn.juwatech.similarity;

import java.util.HashMap;
import java.util.Map;

public class CosineSimilarity {
    public static double computeCosineSimilarity(String text1, String text2) {
        Map<String, Integer> vector1 = getTermFrequency(text1);
        Map<String, Integer> vector2 = getTermFrequency(text2);

        double dotProduct = 0.0;
        for (String key : vector1.keySet()) {
            if (vector2.containsKey(key)) {
                dotProduct += vector1.get(key) * vector2.get(key);
            }
        }

        double magnitude1 = 0.0;
        for (int value : vector1.values()) {
            magnitude1 += Math.pow(value, 2);
        }

        double magnitude2 = 0.0;
        for (int value : vector2.values()) {
            magnitude2 += Math.pow(value, 2);
        }

        return dotProduct / (Math.sqrt(magnitude1) * Math.sqrt(magnitude2));
    }

    private static Map<String, Integer> getTermFrequency(String text) {
        Map<String, Integer> termFrequency = new HashMap<>();
        for (String term : text.split("\\s+")) {
            termFrequency.put(term, termFrequency.getOrDefault(term, 0) + 1);
        }
        return termFrequency;
    }

    public static void main(String[] args) {
        String text1 = "I love programming in Java";
        String text2 = "Java programming is fun";

        double similarity = computeCosineSimilarity(text1, text2);
        System.out.println("Cosine Similarity: " + similarity);
    }
}

三、编辑距离(Levenshtein距离)

编辑距离是衡量两个字符串之间差异的一种方法,表示将一个字符串转换成另一个字符串所需的最少编辑操作次数(插入、删除、替换)。

在Java中可以使用如下代码计算编辑距离:

package cn.juwatech.similarity;

public class LevenshteinDistance {
    public static int computeLevenshteinDistance(String text1, String text2) {
        int[][] dp = new int[text1.length() + 1][text2.length() + 1];

        for (int i = 0; i <= text1.length(); i++) {
            for (int j = 0; j <= text2.length(); j++) {
                if (i == 0) {
                    dp[i][j] = j;
                } else if (j == 0) {
                    dp[i][j] = i;
                } else {
                    dp[i][j] = min(dp[i - 1][j - 1] + costOfSubstitution(text1.charAt(i - 1), text2.charAt(j - 1)), 
                                   dp[i - 1][j] + 1, 
                                   dp[i][j - 1] + 1);
                }
            }
        }

        return dp[text1.length()][text2.length()];
    }

    private static int costOfSubstitution(char a, char b) {
        return a == b ? 0 : 1;
    }

    private static int min(int... numbers) {
        int minValue = Integer.MAX_VALUE;
        for (int number : numbers) {
            if (number < minValue) {
                minValue = number;
            }
        }
        return minValue;
    }

    public static void main(String[] args) {
        String text1 = "kitten";
        String text2 = "sitting";

        int distance = computeLevenshteinDistance(text1, text2);
        System.out.println("Levenshtein Distance: " + distance);
    }
}

四、应用场景

  1. 搜索引擎:在搜索引擎中,计算文本相似度可以用于匹配用户查询和网页内容,从而提高搜索结果的相关性。
  2. 推荐系统:在推荐系统中,计算用户之间的文本相似度可以帮助发现具有相似兴趣的用户,从而进行个性化推荐。
  3. 文本分类:在文本分类任务中,通过计算文本相似度可以将相似的文本归为一类,从而提高分类精度。

总结

计算文本相似度的方法多种多样,不同的方法适用于不同的应用场景。Jaccard相似度适用于集合相似度计算,余弦相似度适用于高维向量相似度计算,编辑距离适用于字符串相似度计算。在实际应用中,可以根据具体需求选择合适的相似度计算方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库同步最简单的方法

数据库同步到底有咩有简单的方法&#xff0c;有肯定是有的&#xff0c;就看你有咩有缘&#xff0c;看到这篇文章&#xff0c;你就是有缘人。众所周知&#xff0c;数据库同步向来都不是一件简单的事情&#xff0c;它很繁琐&#xff0c;很费精力&#xff0c;很考验经验&#xff0…

unity 导入的模型设置讲解

咱们先讲Model这一栏 Model Scene&#xff1a;场景级属性&#xff0c;例如是否导入灯光和照相机&#xff0c;以及使用什么比例因子。 Scale Factor&#xff1a;缩放因子&#xff08;也就是模型导入后大小如果小了或者大了在这里直接改是相当于该模型的大小的&#xff0c;而且在…

Windows系统开启python虚拟环境

.\env4socre\Scripts\activate : 无法加载文件 E:\SocreMan\env4socre\Scripts\Activate.ps1&#xff0c;因为在此系统上禁止运行脚本。 环境&#xff1a;windows 11、vscode 1、用管理员权限打开powershell 输入set-executionpolicy remotesigned&#xff0c;选择Y 2、返回v…

网工内推 | 网络工程师,IE认证优先,最高18k*14薪,周末双休

01 上海吾索信息科技有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;岗位职责&#xff1a; 1&#xff09;具备网络系统运维服务经验以及数据库实施经验&#xff0c;具备网络系统认证相关资质或证书&#xff1b; 2&#xff09;掌握常用各设备的运维巡检…

Logback-打印方法名及代码行号

背景 公司产品使用了logback作为日志输出框架&#xff0c;日志输出的pattern里配置了打印调用方法名及代码行号的配置&#xff0c;但是实际输出的日志方法名总是显示? 在强迫症的驱使下&#xff0c;开启了探秘之旅 Logback版本 1.2.3 项目中Logging.pattern配置如下&#xff1…

【课程总结】Day12:YOLO的深入了解

前言 在【课程总结】Day11&#xff08;下&#xff09;&#xff1a;YOLO的入门使用一节中&#xff0c;我们已经了解YOLO的使用方法&#xff0c;使用过程非常简单&#xff0c;训练时只需要三行代码&#xff1a;引入YOLO&#xff0c;构建模型&#xff0c;训练模型&#xff1b;预测…

DevOps CMDB平台整合Jira工单

背景 在DevOps CMDB平台建设的过程中&#xff0c;我们可以很容易的将业务应用所涉及的云资源&#xff08;WAF、K8S、虚拟机等&#xff09;、CICD工具链&#xff08;Jenkins、ArgoCD&#xff09;、监控、日志等一次性的维护到CMDB平台&#xff0c;但随着时间的推移&#xff0c;…

《昇思25天学习打卡营第5天|onereal》

ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&#xff1a;Pointw…

【51单片机入门】点亮数码管

文章目录 前言仿真图如何去绘制一个数字示例代码选择某个数码管显示某个数字 示例代码总结 前言 在嵌入式系统的世界中&#xff0c;单片机扮演着至关重要的角色。51单片机&#xff0c;作为最早的微控制器之一&#xff0c;至今仍被广泛应用在各种设备中。本文将介绍如何使用51单…

嵌入式Linux的浮点运算能力测试

嵌入式Linux的浮点运算能力测试 今天需要对一款ARM CPU的浮点数运算能力进行测试&#xff0c;采用了台式机上常用的SuperPI相同的原理&#xff1a;计算一定小数位数的圆周率来测试硬件的浮点数计算能力和稳定性。 首先下载计算软件的源代码&#xff0c;可以使用下面命令&#…

python使用动态属性访问JSON类数据,Get it!

目录 1、基础访问:内置json模块 📦 1.1 json.loads转换字符串 1.2 动态属性访问技巧 2、面向对象方式处理JSON 🛰️ 2.1 创建JSON数据模型类 2.2 动态属性与方法绑定 3、类型安全: 数据类(dataclasses)应用 🔒 3.1 数据类基础 3.2 自动从JSON解构数据 3.3 动态…

LLM大模型实战 —— DB-GPT阿里云部署指南

简介&#xff1a; DB-GPT 是一个实验性的开源应用&#xff0c;它基于FastChat&#xff0c;并使用vicuna-13b作为基础模型, 模型与数据全部本地化部署, 绝对保障数据的隐私安全。 同时此GPT项目可以直接本地部署连接到私有数据库, 进行私有数据处理&#xff0c; 目前已支持SQL生…

与国际接轨,与行业同行!2024深圳国际自有品牌展今日开幕!

2024深圳国际自有品牌展&#xff08;Marca China International Private Label Fair&#xff0c;简称“Marca China”&#xff09;于6月27日在深圳会展中心&#xff08;福田&#xff09;盛大开幕&#xff01;来自零售、电商、品牌等渠道的买家与专业观众&#xff0c;以及来自全…

提高LabVIEW程序可靠性

​提高LabVIEW程序的可靠性是确保系统稳定运行、减少故障和维护成本的重要措施。以下从多个方面详细分析如何提高LabVIEW程序的可靠性 1. 选择合适的架构 1.1 状态机架构 适用情况&#xff1a; 多状态、多步骤操作。 具体例子&#xff1a;在一个自动测试系统中&#xff0c;…

数学建模---最小生成树问题的建模~~~~~Matlab代码

目录 1.相关概念 &#xff08;1&#xff09;什么是树 &#xff08;2&#xff09;生成树和最小生成树&#xff1a; 2.适用赛题 &#xff08;1&#xff09;赛题分类 &#xff08;2&#xff09;不同之处 3.两种算法 &#xff08;1&#xff09;prim算法 &#xff08;2&…

PlatformIO开发环境

PlatformIO是一个开源的生态系统&#xff0c;用于构建物联网应用&#xff0c;它支持多种微控制器&#xff08;MCU&#xff09;和硬件开发板&#xff0c;并且与各种IDE集成良好&#xff0c;如VSCode, Atom等&#xff0c;使得跨平台的固件开发变得更加简单和高效。 ### 平台介绍…

计算机图形学入门21:辐射度量学

1.前言 在使用Blinn-Phong着色模型的时候&#xff0c;定义了一个光的强度I(Intensity)&#xff0c;假如I等于10。那么I等于10是什么意思&#xff1f;它肯定有单位和物理意义。另一方面&#xff0c;whited-style光线追踪模型也不是准确的模型&#xff0c;因为做了很多假设&#…

VS Code快速选定当前括号中内容 快速选择当前行内容(必备)

文章目录 快速选定当前括号内容效果方法 快速选定当前行内容效果操作 快速选定当前括号内容 效果 方法 下载插件 默认快捷键选中当前括号内容 ctrl w 可修改快捷键 快速选定当前行内容 效果 操作 点击左键三次即可

鸿蒙HarmonyOS自定义组件开发和使用

自定义组件的介绍 在开发和使用自定义组件直接&#xff0c;我们需要了解什么是自定义组件&#xff1f; 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为系统组件&#xff0c;由开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常…

操作系统之《处理器机调度算法》【知识点+详细解题过程】

目录 PS:处理机调度算法相关公式&#xff1a; 1、【FCFS】先来先服务调度算法 2、【SJF&#xff08;SPF&#xff09;】短作业&#xff08;进程&#xff09;优先调度算法 3、【HRRF】最高响应比优先算法 4、【SRTF】最短剩余时间优先调度算法&#xff08;抢占式&am…
最新文章