Java基于余弦方法实现的计算两个字符串相似度算法示例
时间: 2023-12-11 10:02:44 浏览: 153
JAVA文本相似度查重代码及示例
在Java中,可以使用余弦相似度算法来计算两个字符串的相似度。下面是一个简单的示例:
```java
public class CosineSimilarity {
public static void main(String[] args) {
String s1 = "Hello world";
String s2 = "Hello Java";
double similarity = cosineSimilarity(s1, s2);
System.out.println("Similarity between '" + s1 + "' and '" + s2 + "' is: " + similarity);
}
public static double cosineSimilarity(String s1, String s2) {
// 将字符串转换为向量
double[] v1 = toVector(s1);
double[] v2 = toVector(s2);
// 计算余弦相似度
return cosineSimilarity(v1, v2);
}
private static double[] toVector(String s) {
// 将字符串转换为小写,并去除标点符号
s = s.toLowerCase().replaceAll("\\pP", "");
// 将字符串分割为单词
String[] words = s.split(" ");
// 统计每个单词出现的次数
Map<String, Integer> counts = new HashMap<>();
for (String word : words) {
counts.put(word, counts.getOrDefault(word, 0) + 1);
}
// 将每个单词的出现次数作为向量的一个分量
double[] vector = new double[counts.size()];
int i = 0;
for (int count : counts.values()) {
vector[i++] = count;
}
return vector;
}
private static double cosineSimilarity(double[] vectorA, double[] vectorB) {
double dotProduct = 0.0;
double normA = 0.0;
double normB = 0.0;
for (int i = 0; i < vectorA.length; i++) {
dotProduct += vectorA[i] * vectorB[i];
normA += Math.pow(vectorA[i], 2);
normB += Math.pow(vectorB[i], 2);
}
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
}
}
```
在上面的示例中,首先将两个字符串转换为向量,然后计算它们的余弦相似度。在toVector方法中,将字符串转换为小写并去除标点符号,然后将每个单词出现的次数作为向量的一个分量。在cosineSimilarity方法中,首先计算向量的内积,然后计算向量的模长,并最终计算余弦相似度。最后,在main方法中,使用示例字符串测试余弦相似度算法。
阅读全文