java判断两个字符串相似的方法
发布日期:2025-04-02 00:49:15 浏览次数:13 分类:精选文章

本文共 3767 字,大约阅读时间需要 12 分钟。

Java判断两个字符串相似的方法

在实际应用中,判断两个字符串的相似度常常是通过计算它们的相似度系数来实现的。常见的相似度系数包括编辑距离、余弦相似度、Jaccard系数等。

比较字符串的相似度

在文本匹配、数据清洗、搜索等操作中,判断两个字符串的相似度是非常有用的需求。通过计算两个字符串的相似度系数,可以有效地衡量它们的相似程度。

编辑距离

编辑距离,也称为Levenshtein距离,是一种用于字符串相似度比较的常见方法。它表示将一个字符串转换为另一个字符串所需的最少操作数。以下是计算编辑距离的具体实现:

public int calculateEditDistance(String s1, String s2) {
int m = s1.length();
int n = s2.length();
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++) {
if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = Math.min(dp[i - 1][j - 1] + 1,
Math.min(dp[i][j - 1] + 1,
dp[i - 1][j] + 1));
}
}
}
return dp[m][n];
}

以上代码使用动态规划算法计算两个字符串之间的编辑距离。dp[i][j] 表示将 s1 的前 i 个字符转换为 s2 的前 j 个字符所需的最小编辑操作数。函数返回两个字符串的编辑距离。

余弦相似度

余弦相似度是一种常用的度量两个向量之间相似度的方法,可以用于度量两个字符串之间的相似度。以下是余弦相似度的具体实现:

public double calculateCosineSimilarity(String s1, String s2) {
Map
vector1 = generateVector(s1);
Map
vector2 = generateVector(s2);
double dotProduct = 0.0;
double norm1 = 0.0;
double norm2 = 0.0;
for (Character key : vector1.keySet()) {
if (vector2.containsKey(key)) {
dotProduct += vector1.get(key) * vector2.get(key);
}
norm1 += Math.pow(vector1.get(key), 2);
}
for (Character key : vector2.keySet()) {
norm2 += Math.pow(vector2.get(key), 2);
}
double similarity = dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));
return similarity;
}
private Map
generateVector(String s) {
Map
vector = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (vector.containsKey(c)) {
vector.put(c, vector.get(c) + 1);
} else {
vector.put(c, 1);
}
}
return vector;
}

以上代码使用余弦相似度计算两个字符串之间的相似度。calculateCosineSimilarity 函数接受两个字符串 s1s2,返回它们的余弦相似度。这项技术可以用来衡量两个字符串的内容相似度。

Jaccard系数

Jaccard系数是一种用于计算两个集合之间相似度的方法,也可以用于度量两个字符串之间的相似度。以下是Jaccard系数的具体实现:

import java.util.HashSet;
import java.util.Set;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static double calculateJaccardSimilarity(String str1, String str2) {
Set
set1 = new HashSet<>();
for (char c : str1.toCharArray()) {
set1.add(c);
}
Set
set2 = new HashSet<>();
for (char c : str2.toCharArray()) {
set2.add(c);
}
Set
intersection = new HashSet<>(set1);
intersection.retainAll(set2);
Set
union = new HashSet<>(set1);
union.addAll(set2);
if (union.isEmpty()) {
return 0.0;
}
double jaccardSimilarity = (double) intersection.size() / union.size();
return jaccardSimilarity;
}
public static void main(String[] args) {
String str1 = "这两天,河北廊坊市人民医院退还核酸检测费的消息引发热议。奔流新闻记者从廊坊市人民医院财务科证实,'从5月20日开始对收到短信的市民退费,多数成年人已经完成退费,今天开始对青少年儿童退费。'";
String str2 = "5月20日,一些市民收到廊坊市人民医院发来的短信:按上级要求退还2020年至2021年核酸检测费。请持身份证于5月20日-6月20日工作日时间到市医院财务部退费。";
double similarity = calculateJaccardSimilarity(str1, str2);
System.out.println("Jaccard Similarity: " + similarity);
}
}

以上代码使用Jaccard系数计算两个字符串之间的相似度。calculateJaccardSimilarity 函数将两个字符串转换为字符集合,计算它们的交集和并集,然后返回Jaccard相似度。

这些方法各有优缺点,可以根据具体需求选择最合适的相似度计算方式。

上一篇:java判断某个点是否在所画范围内(多边形)
下一篇:JAVA判断32位还是64位,调用不同的DLL(转)

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年05月10日 06时02分13秒