Java如何判断两句话的相似度?

简介: 【8月更文挑战第28天】Java如何判断两句话的相似度?

在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等。

目录
相关文章
|
13天前
|
自然语言处理 算法 Java
Java如何判断两句话的相似度类型MySQL的match
【9月更文挑战第1天】Java如何判断两句话的相似度类型MySQL的match
17 2
|
算法 Java 索引
Java操作ElasticSearch,实现SimHash比较文章相似度
最近工作中要求实现相似文本查询的功能,我于是决定用SimHash实现。
292 0
|
Java
java判断字符串(含中文)的内容相似度
java判断字符串(含中文)的内容相似度
106 0
|
算法 Java 索引
java实现编辑距离算法(levenshtein distance),计算字符串或者是文本之间的相似度【附代码】
java实现编辑距离算法(levenshtein distance),计算字符串或者是文本之间的相似度【附代码】
544 0
|
自然语言处理 Java
Java利用hanlp完成语句相似度分析的案例详解
在做考试系统需求时,后台题库系统提供录入题目的功能。在录入题目的时候,由于题目来源广泛,且参与录入题目的人有多位,因此容易出现录入重复题目的情况。所以需要实现语句相似度分析功能,从而筛选出重复的题目并人工处理之。
2116 0
|
11天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
73 6
【Java学习】多线程&JUC万字超详解
|
4天前
|
Java 调度 开发者
Java并发编程:深入理解线程池
在Java的世界中,线程池是提升应用性能、实现高效并发处理的关键工具。本文将深入浅出地介绍线程池的核心概念、工作原理以及如何在实际应用中有效利用线程池来优化资源管理和任务调度。通过本文的学习,读者能够掌握线程池的基本使用技巧,并理解其背后的设计哲学。
|
4天前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
5天前
|
缓存 监控 Java
java中线程池的使用
java中线程池的使用