Java利用hanlp完成语句相似度分析的方法详解

2023-12-13 17:08

本文主要是介绍Java利用hanlp完成语句相似度分析的方法详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在做kaoshi系统需求时,后台题库系统提供录入题目的功能。在录入题目的时候,由于题目来源广泛,且参与录入题目的人有多位,因此容易出现录入重复题目的情况。所以需要实现语句相似度分析功能,从而筛选出重复的题目并人工处理之。

下面介绍如何使用 Java 实现上述想法,完成语句相似度分析:

1 、使用 HanLP 完成分词:

首先,添加 HanLP 的依赖:( jsoup 是为了处理题干中的 html 标签,去除 html 标签得到纯文本的题干内容)

分词代码如下,需要处理 html 标签和标点符号:

private static List<String> getSplitWords(String sentence) {// 去除掉 html 标签sentence = Jsoup.parse(sentence.replace(" ","")).body().text();// 标点符号会被单独分为一个 Term ,去除之return HanLP.segment(sentence).stream().map(a -> a.word).filter(s -> !"`~!@#$^&*()=|{}':;',\\[\\].<>/?~ ! @# ¥…… &* ()—— |{} 【】‘;:”“ ' 。,、? ".contains(s)).collect(Collectors.toList());}

2 、合并分词结果,列出所有的词:

3 、统计词频,得到词频构成的向量:

代码如下,其中 allWords 是上一步中得到的所有的词, sentWords 是第一步中对单个句子的分词结果:

4 、计算相似度(两个向量的余弦值):

以上所有方法的完整代码如下,使用 SimilarityUtil.getSimilarity(String s1,String s2) 即可得到 s1 和 s2 的语句相似度:

package com.yuantu.dubbo.provider.questionRepo.utils;import com.hankcs.hanlp.HanLP;import com.hankcs.hanlp.dictionary.CustomDictionary;import org.jsoup.Jsoup;import java.util.ArrayList;import java.util.Calendar;import java.util.Collections;import java.util.List;import java.util.stream.Collectors;public class SimilarityUtil {static {CustomDictionary.add(" 子类 ");CustomDictionary.add(" 父类 ");}private SimilarityUtil() {}/*** 获得两个句子的相似度** @param sentence1* @param sentence2* @return*/public static double getSimilarity(String sentence1, String sentence2) {List<String> sent1Words = getSplitWords(sentence1);System.out.println(sent1Words);List<String> sent2Words = getSplitWords(sentence2);System.out.println(sent2Words);List<String> allWords = mergeList(sent1Words, sent2Words);int[] statistic1 = statistic(allWords, sent1Words);int[] statistic2 = statistic(allWords, sent2Words);double dividend = 0;double divisor1 = 0;double divisor2 = 0;for (int i = 0; i < statistic1.length; i++) {dividend += statistic1[i] * statistic2[i];divisor1 += Math.pow(statistic1[i], 2);divisor2 += Math.pow(statistic2[i], 2);}return dividend / (Math.sqrt(divisor1) * Math.sqrt(divisor2));}private static int[] statistic(List<String> allWords, List<String> sentWords) {int[] result = new int[allWords.size()];for (int i = 0; i < allWords.size(); i++) {result[i] = Collections.frequency(sentWords, allWords.get(i));}return result;}private static List<String> mergeList(List<String> list1, List<String> list2) {List<String> result = new ArrayList<>();result.addAll(list1);result.addAll(list2);return result.stream().distinct().collect(Collectors.toList());}private static List<String> getSplitWords(String sentence) {// 去除掉 html 标签sentence = Jsoup.parse(sentence.replace(" ","")).body().text();// 标点符号会被单独分为一个 Term ,去除之return HanLP.segment(sentence).stream().map(a -> a.word).filter(s -> !"`~!@#$^&*()=|{}':;',\\[\\].<>/?~ ! @# ¥…… &* ()—— |{} 【】‘;:”“ ' 。,、? ".contains(s)).collect(Collectors.toList());}}

原文链接:http://blog.itpub.net/31524777/viewspace-2636656/

这篇关于Java利用hanlp完成语句相似度分析的方法详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/489248

相关文章

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

Linux之软件包管理器yum详解

《Linux之软件包管理器yum详解》文章介绍了现代类Unix操作系统中软件包管理和包存储库的工作原理,以及如何使用包管理器如yum来安装、更新和卸载软件,文章还介绍了如何配置yum源,更新系统软件包... 目录软件包yumyum语法yum常用命令yum源配置文件介绍更新yum源查看已经安装软件的方法总结软

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处