java如何比较字符串相似度百分比
时间: 2024-10-08 16:24:32 浏览: 12
在Java中,比较两个字符串的相似度通常涉及文本相似度算法,如余弦相似度、Jaccard相似系数或Levenshtein距离等。这里简单介绍一下Levenshtein距离,它计算的是从一个字符串转换成另一个字符串所需的最少单字符编辑(插入、删除或替换)次数。
以下是一个简单的示例,使用`java.text.Normalizer`和`java.util.HashMap`来计算两个字符串的相似度(以Levenshtein距离为基础):
```java
import java.text.Normalizer;
import java.util.HashMap;
import java.util.Map;
public double stringSimilarity(String str1, String str2) {
// 转换为小写并规范化所有字符
str1 = Normalizer.normalize(str1.toLowerCase(), Normalizer.Form.NFD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
str2 = Normalizer.normalize(str2.toLowerCase(), Normalizer.Form.NFD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
int[][] dp = new int[str1.length() + 1][str2.length() + 1];
for (int i = 0; i <= str1.length(); i++) {
dp[i][0] = i;
}
for (int j = 0; j <= str2.length(); j++) {
dp[0][j] = j;
}
// 使用动态规划填充dp数组
for (int i = 1; i <= str1.length(); i++) {
for (int j = 1; j <= str2.length(); j++) {
if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
}
}
}
// 计算相似度百分比(100减去编辑距离占较短字符串长度的比例)
return 100.0 * (double) str1.length() / Math.max(str1.length(), str2.length()) - (double) dp[str1.length()][str2.length()] / Math.max(str1.length(), str2.length());
}