【代码】Java 匹配文本相似度 基于 Cosine Similarity

2025-12-15 17:23:20  阅读 75 次 评论 0 条

直接上代码(返回0-1的小数,数值越大匹配度越高)

import java.util.HashMap;
import java.util.Map;

public class CosineSimilarityUtil {
    //计算两个字符串的字符频向量
    private static Map<String, Integer> getCharacterFrequency(String text) {
        Map<String, Integer> frequencyMap = new HashMap<>();
        char[] chars = text.toCharArray();//按字符分割
        for (char c : chars) {
            String charStr = String.valueOf(c);
            frequencyMap.put(charStr, frequencyMap.getOrDefault(charStr, 0) + 1);
        }
        return frequencyMap;
    }

    //计算Cosine相似度
    public static double calculateCosineSimilarity(String text1, String text2) {
        Map<String, Integer> freqMap1 = getCharacterFrequency(text1);
        Map<String, Integer> freqMap2 = getCharacterFrequency(text2);

        //计算点积
        double dotProduct = 0;
        for (String charStr : freqMap1.keySet()) {
            if (freqMap2.containsKey(charStr)) {
                dotProduct += freqMap1.get(charStr) * freqMap2.get(charStr);
            }
        }



        //计算模长
        double magnitude1 = 0;
        for (int freq : freqMap1.values()) {
            magnitude1 += Math.pow(freq, 2);
        }
        magnitude1 = Math.sqrt(magnitude1);

        double magnitude2 = 0;
        for (int freq : freqMap2.values()) {
            magnitude2 += Math.pow(freq, 2);
        }
        magnitude2 = Math.sqrt(magnitude2);


        //计算余弦相似度
        if (magnitude1 == 0 || magnitude2 == 0) {
            return 0.0;//避免除以0
        }

        return dotProduct / (magnitude1 * magnitude2);
    }

    public static void main(String[] args) {
        String targetText = "相卡整盒";
        String matchingText1 = "相卡随机一发";
        String matchingText2 = "吧唧随机一发";
        String matchingText3 = "路飞相卡";



        System.out.println("相卡随机一发: " + calculateCosineSimilarity(targetText, matchingText1));
        System.out.println("吧唧随机一发: " + calculateCosineSimilarity(targetText, matchingText2));
        System.out.println("路飞相卡: " + calculateCosineSimilarity(targetText, matchingText3));
    }
}



微信扫码查看本文
本文地址:https://www.yangguangdream.com/?id=2267
版权声明:本文为原创文章,版权归 编辑君 所有,欢迎分享本文,转载请保留出处!
NEXT:已经是最新一篇了

发表评论


表情

还没有留言,还不快点抢沙发?