java判断两句话的相似度算法,能返回相似比例
以下是几种实现 Java 判断两句话相似度并返回相似比例的方法。 方法一:使用 Levenshtein 距离(编辑距离) Levenshtein 距离是指两个字符串之间,由一个字符串转换成另一个字符串所需的最少编辑操作次数(插入、删除、替换)。相似度可以通过以下公式计算:相似度 = 1 - (Levenshtein 距离 / 较长字符串的长度) ```java public class SimilarityCalculator { // 计算 Levenshtein 距离 public static int levenshteinDistance(String s1, String s2) { int m = s1.length(); int n = s2.length(); // 如果其中一个字符串为空,距离为另一个字符串的长度 if (m == 0) return n; if (n == 0) return m; int[][] dp = new int[m + 1][n + 1]; // 初始化第一行和第一列 for (int i = 0; i <= m; i++) { dp[i][0] = i; } for (int j = 0; j <= n; j++) { dp[0][j] = j; } // 填充动态规划表 for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { int cost = (s1.charAt(i - 1) == s2.charAt(j - 1)) ? 0 : 1; dp[i][j] = Math.min(Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + cost); } } return dp[m][n]; } // 计算相似度 public static double similarity(String s1, String s2) { int distance = levenshteinDistance(s1, s2); int maxLength = Math.max(s1.length(), s2.length()); return 1.0 - (double) distance / maxLength; } public static void main(String[] args) { String sentence1 = "这是一个测试句子"; String sentence2 = "这是一个测试语句"; double sim = similarity(sentence1, sentence2); System.out.println("两句话的相似度为: " + sim); } } ``` 方法二:使用余弦相似度 余弦相似度通过计算两个向量的夹角余弦值来评估它们的相似度。在文本处理中,可以将句子转换为词频向量,然后计算余弦相似度。 ```java import java.util.HashMap; import java.util.Map; public class CosineSimilarity { // 将句子转换为词频向量 public static Map<String, Integer> getTermFrequency(String sentence) { Map<String, Integer> termFrequency = new HashMap<>(); String[] words = sentence.split(" "); for (String word : words) { termFrequency.put(word, termFrequency.getOrDefault(word, 0) + 1); } return termFrequency; } // 计算向量的点积 public static double dotProduct(Map<String, Integer> vec1, Map<String, Integer> vec2) { double product = 0; for (Map.Entry<String, Integer> entry : vec1.entrySet()) { String term = entry.getKey(); if (vec2.containsKey(term)) { product += entry.getValue() * vec2.get(term); } } return product; } // 计算向量的模 public static double magnitude(Map<String, Integer> vector) { double sum = 0; for (int value : vector.values()) { sum += Math.pow(value, 2); } return Math.sqrt(sum); } // 计算余弦相似度 public static double cosineSimilarity(String sentence1, String sentence2) { Map<String, Integer> vec1 = getTermFrequency(sentence1); Map<String, Integer> vec2 = getTermFrequency(sentence2); double dotProduct = dotProduct(vec1, vec2); double magnitude1 = magnitude(vec1); double magnitude2 = magnitude(vec2); if (magnitude1 == 0 || magnitude2 == 0) { return 0; } return dotProduct / (magnitude1 * magnitude2); } public static void main(String[] args) { String sentence1 = "这是 一个 测试 句子"; String sentence2 = "这是 一个 测试 语句"; double sim = cosineSimilarity(sentence1, sentence2); System.out.println("两句话的余弦相似度为: " + sim); } } ``` 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 对于 Levenshtein 距离算法,当字符串较长时,动态规划表的空间复杂度为 $O(m * n)$,可能会占用较多内存。 2. 在使用余弦相似度时,需要注意分词的准确性,不同的分词方式可能会导致不同的结果。 3. 对于中文句子,需要考虑到标点符号、大小写等因素对相似度计算的影响,可能需要在计算前进行预处理。 [2026-01-27 10:08:29 | AI写代码神器 | 1238点数解答]
- [GPT] import javax.swing.*; import java.awt.*; import java.awt.datatransfer.clipboard; import java.awt.datatransfer.stringselection; import java.awt.datatransfer.transferable; import java.awt.event.*; import java.io.*; import java.nio.file.files; import java.nio.file.path; import java.nio.file.paths; import java.time.localdatetime; import java.util.hashmap; import java.util.list; import java.util.map; import java.util.random; public class copy { static private final jtextarea textarea = new jtext(1497点数解答 | 2024-08-25 09:40:33)382
- [阿里通义] dm.jdbc.driver.dmexception: 数据溢出 at dm.jdbc.driver.dberror.throwexception(dberror.java:636) at dm.jdbc.c.b.p.s(msg.java:225) at dm.jdbc.c.b.p.p(msg.java:185) at dm.jdbc.c.b.p.o(msg.java:166) at dm.jdbc.c.a.a(dbaccess.java:776) at dm.jdbc.c.a.a(dbaccess.java:327) at dm.jdbc.c.a.a(dbaccess.java:435) at dm.jdbc.driver.dmdbpreparedstatement.executeinner(dmdbpreparedstatement.java:284) at dm.jdbc.driver.dmdbpreparedstatement.do_executequery(dmdbpreparedstatement.java:383) at dm.jdbc.driver.(598点数解答 | 2024-10-15 15:48:38)282
- [阿里通义] 问题排查:dm.jdbc.driver.dmexception: 数据溢出 at dm.jdbc.driver.dberror.throwexception(dberror.java:636) at dm.jdbc.c.b.p.s(msg.java:225) at dm.jdbc.c.b.p.p(msg.java:185) at dm.jdbc.c.b.p.o(msg.java:166) at dm.jdbc.c.a.a(dbaccess.java:776) at dm.jdbc.c.a.a(dbaccess.java:327) at dm.jdbc.c.a.a(dbaccess.java:435) at dm.jdbc.driver.dmdbpreparedstatement.executeinner(dmdbpreparedstatement.java:284) at dm.jdbc.driver.dmdbpreparedstatement.do_executequery(dmdbpreparedstatement.java:383) at dm.jdbc.dr(403点数解答 | 2024-10-15 15:48:41)1074
- 编写程序模拟实现如下教学管理场景中的应用: (1) 设计学生、老师和课程类见下图, (2) 老师能够开课,学生能选课 (3)在主方法中测试见图2: |老师创建一门课程,并添加58位学生来选择该课程。 1统计出58位学生中男女数量及比重。 public class testcourse ( static course cour;//静态变量,学生的课程 public static void testcreatecourse(int num)( //num学生数 //创建老师 //老师tea 开设了课程 //设置课程的老师tea 的信息; //输出课程信息 //课程添加学生 public static void teststatics()(//统计男女学生个数,比例 public static void main(string[] args)(testcreatecourse(58); teststatics();} 程序模拟选课,运行效果如下: 林老师开课了. 课程名称:《java 程序设计》 开课学期:2020第二学期 开课老师编号:课程1001:名字: 林老师 学生:李 选择了(2653点数解答 | 2024-04-02 11:00:16)444
- 编写程序模拟实现如下教学管理场景中的应用: (1) 设计学生、老师和课程类见下图, (2)老师能够开课,学生能选课 (3) 在主方法中测试见图2: l 老师创建一门课程,并添加58位学生来选择该课程。 l 统计出58位学生中男女数量及比重。 public class testcourse { static course cour;//静态变量,学生的课程 public static void testcreatecourse(int num)( //num学生数 //创建老师 //老师tea 开设了课程 //设置课程的老师tea 的信息; //输出课程信息 //课程添加学生 public static void teststatics()(11 //统计男女学生个数,比例 public static void main(string[] args)(testcreatecourse(58); teststatics(); 程序模拟选课,运行效果如下: 林老师开课了. 课程名称:《java 程序设计》 开课学期:2020第二学期 开课老师编号:课程1001:名字: 林老师 学生:李(363点数解答 | 2024-04-05 18:31:39)449
- [字节豆包] #include <stdio.h> #define total_blocks 64 // 总块数 #define max_processes 4 // 最大进程数 #define max_pages 54 // 每个进程最多的页面数 int bit_map[total_blocks] = {0}; // 位示图,用于记录内存块占用情况 // 初始化已有的占用块号 void initialize_bit_map() { int last_blocks[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19}; for (int i = 0; i < 10; i++) { bit_map[last_blocks[i]] = 1; // 标记这些块为已占用 } } // 分配内存块,返回 1 表示成功,返回 0 表示内存不足 int allocate_memory(int process_pages[], int allocations[max_processes][max_pages]) {(303点数解答 | 2024-12-06 18:12:20)201
- [百度文心] 题目描述 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 输入格式 一个整数。 输出格式 一个整数。 输入/输出样例 输入1 x = 121 输出1 true 提示: −2 31 <=x<=2 31 −1(257点数解答 | 2024-12-17 15:06:30)275
- [百度文心] 题目描述 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 输入格式 一个整数。 输出格式 一个整数。 输入/输出样例 输入1 x = 121 输出1 true 提示: −2 的31 次方<=x<=2的31次方 −1(286点数解答 | 2024-12-17 15:08:00)255
- [百度文心] c语言题目描述 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 输入格式 一个整数。 输出格式 一个整数。 输入/输出样例 输入1 x = 121 输出1 true 提示: −2 的31 次方<=x<=2的31次方 −1(476点数解答 | 2024-12-17 15:08:51)254
- [字节豆包] 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。(116点数解答 | 2024-12-19 21:48:31)247
- [字节豆包] import com.opencsv.csvreader; import com.opencsv.exceptions.csvvalidationexception; import java.io.filereader; import java.io.ioexception; import java.text.parseexception; import java.text.simpledateformat; import java.util.*; public class stockstatistics { public static void main(string[] args) { string filepath = "stocks.csv"; // 请确保csv文件与此java文件在同一目录下,或提供完整路径 simpledateformat sdf = new simpledateformat("yyyy-mm-dd"); map<string, stockdata> monthlydata = new has(66点数解答 | 2024-11-13 15:31:04)274
- [阿里通义] 算法,90°旋转二维数组(205点数解答 | 2023-10-31 11:05:29)315