java实现通用的文本相似度评估方法(余弦相似度计算)

余弦相似度计算:通用的文本相似度评估方法,通过计算向量之间的夹角来衡量文本的相似度

总体实现思路为:

  • 对两段文本进行分词,得到单词列表。
  • 将两段文本的单词列表合并,并去除重复的单词,形成词汇表。
  • 根据词汇表,将两段文本转换为向量表示。
  • 使用余弦相似度公式计算两段文本的相似度。

首先引入maven依赖:

<!-- 中文分词器 -->

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


		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>4.0.0</version>
		</dependency>


		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-math3</artifactId>
			<version>3.6.1</version> <!-- 请检查是否有更新的版本 -->
		</dependency>

因为我是从excel里读取标准答案和真正答案做相似度平均值计算,所以我也引入了poi依赖。

废话不多说,上代码和注释:

package com.xxx.zjtest.testtest.test;

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.seg.Segment;
import com.hankcs.hanlp.seg.common.Term;
import org.apache.commons.math3.linear.MatrixUtils;
import org.apache.commons.math3.linear.RealVector;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;


/**
 * 余弦相似度计算:通用的文本相似度评估方法,通过计算向量之间的夹角来衡量文本的相似度
 *
 * 对两段文本进行分词,得到单词列表。
 * 将两段文本的单词列表合并,并去除重复的单词,形成词汇表。
 * 根据词汇表,将两段文本转换为向量表示。
 * 使用余弦相似度公式计算两段文本的相似度。
 */
public class CosineSimilarityCalculatorWithoutVocabulary {

    public static double calculateCosineSimilarity(String text1, String text2) {
        // 分词
        List<String> words1 = tokenize(text1);
        List<String> words2 = tokenize(text2);

        // 创建词汇表
        Set<String> vocabulary = new HashSet<>(words1);
        vocabulary.addAll(words2);

        // 将文本转换为向量
        RealVector vector1 = convertTextToVector(words1, vocabulary);
        RealVector vector2 = convertTextToVector(words2, vocabulary);

        // 计算余弦相似度
        double dotProduct = vector1.dotProduct(vector2);
        double norm1 = vector1.getNorm();
        double norm2 = vector2.getNorm();
        double similarity = dotProduct / (norm1 * norm2);

        return similarity;
    }


    //使用hanlp包进行分词
    private static List<String> tokenize(String text) {
        List<String> words = new ArrayList<>();
        Segment segment = HanLP.newSegment().enableCustomDictionary(false).enablePlaceRecognize(true).enableOrganizationRecognize(true);
        for (Term term : segment.seg(text)) {
            words.add(term.word); // 获取分词后的单词
        }
        return words;
    }


    private static RealVector convertTextToVector(List<String> words, Set<String> vocabulary) {
        double[] vector = new double[vocabulary.size()];
        // 计算词频
        int index = 0;
        for (String word : vocabulary) {
            int count = Collections.frequency(words, word);
            vector[index++] = count;
        }

        // 将数组转换为Apache Commons Math的RealVector对象
        RealVector realVector = MatrixUtils.createRealVector(vector);

        return realVector;
    }

    public static double calculateAverageCSCWV(List<String> referenceTexts, List<String> hypothesisTexts) {
        if (referenceTexts.size() != hypothesisTexts.size()) {
            throw new IllegalArgumentException("参考文本列表和假设文本列表的长度必须相等");
        }

        double totalRougeL = 0;
        for (int i = 0; i < referenceTexts.size(); i++) {
            totalRougeL += calculateCosineSimilarity(referenceTexts.get(i), hypothesisTexts.get(i));
        }

        return totalRougeL / referenceTexts.size();
    }

    //excel操作类
    private static void readColumnData(String filePath, List<String> list, int columnIndex) {
        try (FileInputStream file = new FileInputStream(new File(filePath))) {
            // 创建Workbook实例
            Workbook workbook = new XSSFWorkbook(file);
            // 获取第一个工作表
            Sheet sheet = workbook.getSheetAt(0);
            // 遍历每一行
            for (Row row : sheet) {
                // 获取单元格,注意这里列索引是从0开始的
                Cell cell = row.getCell(columnIndex);
                if (cell != null && cell.getCellType() == CellType.STRING) {
                    list.add(cell.getStringCellValue());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String filePath1 = "D:\\项目资料\\ai\\训练资料\\StandardAnswer.xlsx";
        String filePath2 = "D:\\项目资料\\ai\\训练资料\\AssAnswer.xlsx";

        List<String> referenceTexts = new ArrayList<>();
        List<String> hypothesisTexts = new ArrayList<>();

        readColumnData(filePath1, referenceTexts, 0); // 读取第一个Excel的第一列 参考答案
        readColumnData(filePath2, hypothesisTexts, 0); // 读取第二个Excel的第一列  大模型答案
        double similarity = calculateAverageCSCWV(referenceTexts, hypothesisTexts);
        System.out.println("平均余弦相似度:" + similarity);
    }
}

思路和代码以及注释都有了,完结撒花o( ̄▽ ̄)ブ

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

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

相关文章

自编码器网络

1.自编码器网络 自动编码器是一种无监督的数据维度压缩和数据特征表达方法。 无监督 在海量数据的场景下&#xff0c;使用无监督的学习方法比有监督的学习方法更省力。 维度上的压缩 自编码网络可以根据输入的数据&#xff0c;对其进行表征学习。输入数据转换到隐藏层co…

简单介绍IIC通信协议

文章目录 一&#xff0c;简单介绍二&#xff0c;IIC物理层三&#xff0c;IIC通信时序1.起始位与停止位2.IIC读写地址位信号3.IIC应答信号4.IIC数据位收发信号 四&#xff0c;总线速率五&#xff0c;主机发送数据流程六&#xff0c;主机接收数据流程七&#xff0c;IIC的时钟延展…

ComfyUI 基础教程(十四):ComfyUI中4种实现局部重绘方法

在ComfyUI中有多种方式可以实现局部重绘,简单的方式是使用VAE内补编码器进行局部重绘,也可以用Fooocus inpaint进行局部重绘,还可以用controlNet的inpaint模型进行局部重绘,以及使用Clip seg蒙版插件! 本篇介绍使用VAE內补编码器进行局部重绘的方法。 1、VAE内补编码器 局…

OpenHarmony实战开发-请求自绘制内容绘制帧率

对于基于XComponent进行Native开发的业务&#xff0c;可以请求独立的绘制帧率进行内容开发&#xff0c;如游戏、自绘制UI框架对接等场景。 接口说明 开发步骤 说明&#xff1a; 本范例是通过Drawing在Native侧实现图形的绘制&#xff0c;并将其呈现在NativeWindow上 1.定义Ark…

docker的commit命令使用制作镜像

docker run -it ubuntu 最基础的ubuntu启动后安装vim 的命令 apt-get update apt-get -y install vim docker commit -m"my_test_ubuntu" -a"za" 80977284a998 atljw/myubuntu:1.0 将本地镜像推送到阿里云 首先登录阿里云服务-控制台 记得一定要设定设…

免费领取!最新2024中国行政区划数据(Shp)!审图号:GS(2024)0650号

最新2024中国行政区划数据&#xff08;Shp&#xff09; 最近&#xff0c;在天地图官网对外公布了带审图号的行政区划矢量&#xff0c;包含省、市、县。官网提供GeoJSON格式下载。 数据介绍 分为省、市、县三级尺度。通过格式转换&#xff0c;形成shape格式的边界线数据和面数…

springboot版本升级,及解决springsecurity漏洞问题

背景&#xff1a; 项目中要解决 Spring Security RegexRequestMatcher 认证绕过漏洞&#xff08;CVE-2022-22978&#xff09; 漏洞问题&#xff0c;并且需要将项目的版本整体升级到boot版本2.1.7&#xff0c;升级改造过程非常的痛苦&#xff0c;一方面对整个框架的代码不是很熟…

关于视频号小店,常见问题解答,开店做店各方面详解

大家好&#xff0c;我是电商笨笨熊 视频号小店作为今年风口&#xff0c;一个新推出的项目&#xff0c;凭借着自身流量加用户群体的优势吸引了不少的电商玩家。 但对于很多玩家来说&#xff0c;视频号小店完全是一个新的项目、新的领域&#xff0c;因此也会存在很多的疑问&…

后缀字串排序

直接sort: #include <iostream> #include <cstring> #include <algorithm> #include <vector>using namespace std;int main() {string str;cin >> str;int len str.size();vector<string> strings;for(int i 0; i < len; i){strin…

云原生专栏丨基于K8s集群网络策略的应用访问控制技术

在当今云计算时代&#xff0c;Kubernetes已经成为容器编排的事实标准&#xff0c;它为容器化应用提供了强大的自动化部署、扩展和管理能力。在Kubernetes集群中&#xff0c;网络策略(Network Policy)作为对Pod间通信进行控制的关键功能&#xff0c;对保障应用安全和隔离性起到了…

[报错解决]SpringBoot子项目打jar包启动报 XXX--1.0-SNAPSHOT.jar中没有主清单属性

目录 报错信息解决原因原因分析解决方案 报错信息 解决 原因 在使用SpringBoot架构搭建父子工程时&#xff0c;使用IDEA可以正常启动&#xff0c;对子项目打成jar包后使用jar方式启动时&#xff0c;会报错xx.jar中没有主清单属性。 原因分析 原因主要是在使用jar方式启动时…

使用nvm切换nodejs版本

查看可以安装的版本&#xff1a; 使用nvm list显示已安装的nodejs版本&#xff1a; 选择一个版本下载&#xff1a; 切换对应的版本&#xff1a;

3D+仿真分析:高效实现海底石油管道系统设计

Bentley AutoPIPE 助力节省寻找更佳管道路线所需的时间和成本 评估管道完整性以提高石油产量 从墨西哥湾浅水区开采石油通常需要铺设新的海底管道&#xff0c;从而在高压和高温条件下高效、安全地输送原油。 Grupo EspecializadoenObras Marinas (GEOMSA) 是墨西哥湾管道—土体…

MaxKB宝塔Docker安装并配置域名访问

准备 Linux系统 bt面板 默认环境LNMP随便装 服务器环境配置最好是4G&#xff0c; 占用硬盘存储大概1G 对于一些海外AI产品的对接需要使用香港或者海外的服务器 安装 在宝塔面板中打开SSH或者你本地使用SSH工具去链接服务器 运行docker命令 前提是放开服务器的8080端口 doc…

顶管机种类多样 国内产量不断增长

顶管机种类多样 国内产量不断增长 顶管机是一种用于非开挖管道铺设的机械设备&#xff0c;能够通过非开挖施工技术降低对地面活动的影响&#xff0c;具有工作效率高、安全性好、受地质条件限制小、环保性强等优点&#xff0c;在隧道修建、城市管网建设、地下管线敷设等场景中发…

html5动漫风二次元网站博客引导页模板

html5动漫风二次元网站博客引导页模板 效果图部分源码领取源码下期更新预报 效果图 部分源码 <!DOCTYPE html> <!--孤独 --> <html xmlns"http://www.w3.org/1999/xhtml" lang"en"><head><meta charset"utf-8" /&g…

v-for中的key是什么作用

在使用v-for进行列表渲染时&#xff0c;我们通常会给元素或者组件绑定一个key属性。 这个key属性有什么作用呢?我们先来看一下官方的解释&#xff1a; key属性主要用在Vue的虚拟DOM算法&#xff0c;在新Inodes对比时辨识VNodes&#xff1b; 如果不使用key&#xff0c;Vue会使用…

快速了解Oracle 数据库 23ai

Oracle Database 23ai 于2024年5月2日正式发布。快速了解可以看官网主页和官方博客。 官网主页 23ai的3个要点&#xff0c;核心都是数据&#xff1a; 数据的人工智能 主要指数据库内置机器学习和AI向量搜索。这实际是Oracle融合数据库策略的延续&#xff0c;避免了复杂的数据…

Python+Selenium 实现自动化测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 安装selenium 打开命令控制符输入&#xff1a;pip install -U …

软件测试必问的33个面试题

1.你为什么选择软件测试行业 因为之前有了解软件测试这个行业&#xff0c;觉得他的发展前景很好。 2.根据你以前的工作经验描述一下软件开发、测试过程&#xff0c;由那些角色负责&#xff0c;你做什么 要有架构师、开发经理、测试经理、程序员、测试员。我在里面主要是负责所…
最新文章