在Java中,可以使用余弦相似度算法来判断两句话的相似度。余弦相似度是通过计算两个向量之间的夹角余弦值来衡量它们的相似度的。首先需要将句子转换为向量,然后计算这两个向量的余弦相似度。
以下是一个简单的Java代码示例,用于计算两个句子的余弦相似度:
import java.util.HashMap;
import java.util.Map;
public class CosineSimilarity {
public static void main(String[] args) {
String sentence1 = "我喜欢吃苹果";
String sentence2 = "我喜欢吃香蕉";
double similarity = cosineSimilarity(sentence1, sentence2);
System.out.println("相似度: " + similarity);
}
public static double cosineSimilarity(String s1, String s2) {
Map<String, Integer> wordCount1 = getWordCount(s1);
Map<String, Integer> wordCount2 = getWordCount(s2);
double dotProduct = 0.0;
double magnitude1 = 0.0;
double magnitude2 = 0.0;
for (String word : wordCount1.keySet()) {
int count1 = wordCount1.get(word);
int count2 = wordCount2.getOrDefault(word, 0);
dotProduct += count1 * count2;
magnitude1 += Math.pow(count1, 2);
}
for (int count : wordCount2.values()) {
magnitude2 += Math.pow(count, 2);
}
if (magnitude1 == 0.0 || magnitude2 == 0.0) {
return 0.0;
}
return dotProduct / (Math.sqrt(magnitude1) * Math.sqrt(magnitude2));
}
private static Map<String, Integer> getWordCount(String sentence) {
Map<String, Integer> wordCount = new HashMap<>();
for (char c : sentence.toCharArray()) {
if (Character.isLetter(c)) {
String word = String.valueOf(c);
wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
}
}
return wordCount;
}
}
这个示例中,我们首先定义了一个cosineSimilarity
方法,它接受两个字符串参数。然后,我们使用getWordCount
方法将每个句子转换为一个词频映射。接下来,我们计算两个词频映射的点积和各自的大小,最后计算并返回余弦相似度。
需要注意的是,这个示例仅适用于简单的中文字符计数,对于更复杂的中文分词和停用词处理,可以考虑使用现有的中文分词库,如HanLP、jieba等。