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

目录
相关文章
|
自然语言处理 算法 Java
Java如何判断两句话的相似度类型MySQL的match
【9月更文挑战第1天】Java如何判断两句话的相似度类型MySQL的match
148 2
|
算法 Java 索引
Java操作ElasticSearch,实现SimHash比较文章相似度
最近工作中要求实现相似文本查询的功能,我于是决定用SimHash实现。
657 0
|
Java
java判断字符串(含中文)的内容相似度
java判断字符串(含中文)的内容相似度
294 0
|
算法 Java 索引
java实现编辑距离算法(levenshtein distance),计算字符串或者是文本之间的相似度【附代码】
java实现编辑距离算法(levenshtein distance),计算字符串或者是文本之间的相似度【附代码】
911 0
|
自然语言处理 Java
Java利用hanlp完成语句相似度分析的案例详解
在做考试系统需求时,后台题库系统提供录入题目的功能。在录入题目的时候,由于题目来源广泛,且参与录入题目的人有多位,因此容易出现录入重复题目的情况。所以需要实现语句相似度分析功能,从而筛选出重复的题目并人工处理之。
2467 0
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
303 1
|
6月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
318 1
|
7月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
294 0