酷代码 AI
菜单

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点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多