java判断两句话相似的算法


# Java判断两句话相似度的算法 以下是几种常用的Java实现方法来判断两句话的相似度: ## 1. 余弦相似度算法 ```java import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class CosineSimilarity { public static double cosineSimilarity(String text1, String text2) { // 分词(这里简单按空格分割,实际应用可能需要更复杂的分词) String[] words1 = text1.split("\\s+"); String[] words2 = text2.split("\\s+"); // 获取所有不重复的词汇 Set<String> allWords = new HashSet<>(); for (String word : words1) allWords.add(word); for (String word : words2) allWords.add(word); // 构建词频向量 Map<String, Integer> vector1 = new HashMap<>(); Map<String, Integer> vector2 = new HashMap<>(); for (String word : words1) { vector1.put(word, vector1.getOrDefault(word, 0) + 1); } for (String word : words2) { vector2.put(word, vector2.getOrDefault(word, 0) + 1); } // 计算点积 double dotProduct = 0; for (String word : allWords) { dotProduct += vector1.getOrDefault(word, 0) * vector2.getOrDefault(word, 0); } // 计算向量长度 double magnitude1 = 0; for (int count : vector1.values()) { magnitude1 += Math.pow(count, 2); } magnitude1 = Math.sqrt(magnitude1); double magnitude2 = 0; for (int count : vector2.values()) { magnitude2 += Math.pow(count, 2); } magnitude2 = Math.sqrt(magnitude2); // 计算余弦相似度 return dotProduct / (magnitude1 * magnitude2); } public static void main(String[] args) { String text1 = "我喜欢编程"; String text2 = "编程使我快乐"; System.out.println("相似度: " + cosineSimilarity(text1, text2)); } } ``` ## 2. Levenshtein距离(编辑距离) ```java public class LevenshteinDistance { public static int calculate(String s1, String s2) { int[][] dp = new int[s1.length() + 1][s2.length() + 1]; for (int i = 0; i <= s1.length(); i++) { dp[i][0] = i; } for (int j = 0; j <= s2.length(); j++) { dp[0][j] = j; } for (int i = 1; i <= s1.length(); i++) { for (int j = 1; j <= s2.length(); 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[s1.length()][s2.length()]; } public static double similarity(String s1, String s2) { int distance = calculate(s1, s2); return 1 - (double) distance / Math.max(s1.length(), s2.length()); } public static void main(String[] args) { String s1 = "kitten"; String s2 = "sitting"; System.out.println("相似度: " + similarity(s1, s2)); } } ``` ## 3. Jaccard相似系数 ```java import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class JaccardSimilarity { public static double calculate(String text1, String text2) { Set<String> set1 = new HashSet<>(Arrays.asList(text1.split("\\s+"))); Set<String> set2 = new HashSet<>(Arrays.asList(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 = "我喜欢编程"; String text2 = "编程使我快乐"; System.out.println("相似度: " + calculate(text1, text2)); } } ``` ## 4. 使用第三方库(Apache Commons Text) ```java import org.apache.commons.text.similarity.*; public class SimilarityExample { public static void main(String[] args) { // 余弦相似度 CosineSimilarity cosine = new CosineSimilarity(); Double cosineScore = cosine.cosineSimilarity("我喜欢编程", "编程使我快乐"); // Jaccard相似度 JaccardSimilarity jaccard = new JaccardSimilarity(); Double jaccardScore = jaccard.apply("我喜欢编程", "编程使我快乐"); // Levenshtein距离 LevenshteinDistance levenshtein = new LevenshteinDistance(); Integer distance = levenshtein.apply("kitten", "sitting"); Double levenshteinScore = 1 - (double)distance / Math.max("kitten".length(), "sitting".length()); System.out.println("余弦相似度: " + cosineScore); System.out.println("Jaccard相似度: " + jaccardScore); System.out.println("Levenshtein相似度: " + levenshteinScore); } } ``` ## 选择建议 1. 对于短文本比较,Levenshtein距离效果较好 2. 对于长文档比较,余弦相似度更合适 3. Jaccard系数计算简单,适合快速比较 4. 实际应用中可能需要结合多种算法 这些算法都可以根据具体需求进行调整和优化,例如添加同义词处理、词干提取等预处理步骤。 [2025-05-22 14:02:47 | AI问答 | 1383点数解答]
- 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)327
- 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)231
- 问题排查: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)922
- 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)194
- 编写 js 代码,判断 color 是否为"red",如果是则将 color 值改成"green",并显示提示框,内容为 color 的值。(176点数解答 | 2024-05-20 21:33:04)320
- 编写 js 代码,判断 a 是否大于 7,若为真则在页面输出“a>b”;若 a 等于 b 则输出“a=b”;否则输出“a<b”。 var a = 9,b = 17;(47点数解答 | 2024-05-20 22:10:14)230
- python代码案例需求:模拟一个大鱼吃小鱼游戏的过程。 (1)玩家鱼和敌人鱼,玩家鱼初始大小为1,敌人鱼随机出现,一次屏幕至多出现10条敌人鱼,等级一级到五级 不等 (2)玩家鱼可以自由控制移动,敌人鱼默认屏幕从右到左游过 (3)玩家鱼可以吞下等级比它当前要小的敌人鱼完成进化游戏过程中玩家鱼如果吞吃了等级比它大的会死亡 (4)一级鱼积分为1,二级鱼积分为2,三级鱼积分为3,四级鱼积分为4,五级鱼积分为5 (5)玩家初始积分为1,积分0~3范围内只能吞吃一级鱼,大于3可以吞吃二级鱼,大于7可以吞吃三级鱼,大于12可以吞吃四级鱼,大于20可以吞吃五级鱼。 (6)敌人鱼或者玩家鱼被吞吃的时候记得回收资源,避免占太多内存 游戏过程如下: 创建玩家角色-->随机出现10条敌人鱼-->玩家移动-->碰撞检测-->判断等级是否可以吞吃 -->如果还活着继续-->玩家移动-->碰撞检测-->判断。。挂了没(390点数解答 | 2024-05-31 11:45:36)183
- python 案例需求:模拟一个大鱼吃小鱼游戏的过程。 (1)玩家鱼和敌人鱼,玩家鱼初始大小为1,敌人鱼随机出现,一次屏幕至多出现10条敌人鱼,等级一级到五级 不等 (2)玩家鱼可以自由控制移动,敌人鱼默认屏幕从右到左游过 (3)玩家鱼可以吞下等级比它当前要小的敌人鱼完成进化游戏过程中玩家鱼如果吞吃了等级比它大的会死亡 (4)一级鱼积分为1,二级鱼积分为2,三级鱼积分为3,四级鱼积分为4,五级鱼积分为5 (5)玩家初始积分为1,积分0~3范围内只能吞吃一级鱼,大于3可以吞吃二级鱼,大于7可以吞吃三级鱼,大于12可以吞吃四级鱼,大于20可以吞吃五级鱼。 (6)敌人鱼或者玩家鱼被吞吃的时候记得回收资源,避免占太多内存 游戏过程如下: 创建玩家角色-->随机出现10条敌人鱼-->玩家移动-->碰撞检测-->判断等级是否可以吞吃 -->如果还活着继续-->玩家移动-->碰撞检测-->判断。。挂了没(767点数解答 | 2024-05-31 11:50:29)207
- linux if条件 判断/home/test.txt文件是否存在(脚本)(356点数解答 | 2024-11-16 16:42:28)199
- linux if条件 判断/home/test.txt文件是否存在(脚本)(347点数解答 | 2024-11-16 16:45:35)185
- 实验报告题目: 采用python或c++语言,实现如下功能: 实现古典密码中的移位密码和仿射密码,具体实现如下接口: python 接口: <<<<<移位密码>>>>> def is_valid_s(k): 判断k是否为合理的密钥 def encrypt_s(p, k): 密钥合理,则采用k对p进行加密,p为明文字符串,k为密钥,返回密文。 密钥不合理,则返回none. def decrypt_s(c,k): 密钥合理,则采用k对c进行解密,c为密文字符串,k为密钥,返回密文。 密钥不合理,则返回none. <<<<<仿射密码>>>>> def is_valid_a(a,b): 判断(a,b)是否为合理的密钥 def encrypt_s(p, a,b): 密钥合理,则采用a,b对p进行加密,p为明文字符串,a,b为密钥,返回密文。 密钥不合理,则返回none. def decrypt_s(c,a,b): //注意解密的时候需要计算a的逆元 密钥合理,则采用a,b对c进行解密,c为密文字符串,k为密钥,返回密文。 密钥不合理,则返回none. c++接口: <<<(798点数解答 | 2024-12-18 15:55:47)166
- 题目描述 现有一个正整数 n n 请判断 n n 是否为 3 , 5 , 7 3,5,7 的倍数 输入格式 一行,一个正整数 n n。 输出格式 判断 n n 是否为 3 , 5 , 7 3,5,7 的倍数,若是则输出对应的数字,否则不输出,注意输出时,如果有多个满足的数字,数字之间需要使用一个英文逗号间隔 input1 复制 9 output1 复制 3 input2 复制 70 output2 复制 5,7 input2 复制 210 output2 复制 3,5,7 语言方向:C++ 系统环境:Windows(185点数解答 | 2025-08-24 18:42:18)72