JAVA-简单实现文本相似度计算-余弦相似度

以你之姓@ 2022-12-23 06:46 311阅读 0赞

计算文本相似度方法

文本的相似度计算方法可以分为两大类:基于深度学习的方法和基于非深度学习的方法。
虽然小的我在自然语言处理与交互部,但我只是个开发,不是算法,所以这里采用简单的非深度学习的方法。
常用的几个计算方法:余弦相似度、最小编辑距离。。。。。
由于场景比较简单,所以并没有对文本进行分词,如果有需要,可以用jieba,hanlp等等

余弦相似度

  1. private static double getSimilarity(String doc1, String doc2) {
  2. if (StringUtils.isBlank(doc1) or StringUtils.isBlank(doc2)) {
  3. return 0L;
  4. }
  5. Map<Character,int[]> algMap=new HashMap<>();
  6. for (int i = 0; i<doc1.length(); i++) {
  7. char d1 = doc1.charAt(i);
  8. int[] fq = algMap.get(d1);
  9. if (fq != null && fq.length == 2) {
  10. fq[0]++;
  11. } else {
  12. fq = new int[2];
  13. fq[0] = 1;
  14. fq[1] = 0;
  15. algMap.put(d1, fq);
  16. }
  17. }
  18. for (int i = 0; i<doc2.length(); i++) {
  19. char d2 = doc2.charAt(i);
  20. int[] fq = algMap.get(d2);
  21. if (fq != null && fq.length == 2) {
  22. fq[1]++;
  23. } else {
  24. fq = new int[2];
  25. fq[0] = 0;
  26. fq[1] = 1;
  27. algMap.put(d2, fq);
  28. }
  29. }
  30. double sqdoc1 = 0;
  31. double sqdoc2 = 0;
  32. double denuminator = 0;
  33. for (Map.Entry entry : algMap.entrySet()) {
  34. int[] c = (int[]) entry.getValue();
  35. denuminator += c[0] * c[1];
  36. sqdoc1 += c[0] * c[0];
  37. sqdoc2 += c[1] * c[1];
  38. }
  39. return denuminator / Math.sqrt(sqdoc1 * sqdoc2);
  40. }

体会

这只是比较简单的实现,对比最小编辑距离,貌似余弦向量更适合我的场景。简单的方法速度会快一点,但是这是脱离语义的计算,如果有更高级的场景,可以自行选择分词器,这边是对单个字符的计算

参考

  1. 文本相似度计算_02
    https://segmentfault.com/a/1190000017469294?utm_source=tag-newest

发表评论

表情:
评论列表 (有 0 条评论,311人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ES计算余弦相似

    一、前言 最近在项目中做数据推荐的功能,比如,猜你喜欢。主动给用户推荐用户喜欢的商品。如何判断某个商品是不是用户喜欢的呢?在调研过程中,发现es可以做相似度的计算,相似度

    相关 文本相似计算余弦定理

    前言 > 余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中。用向量空间中两个向量夹角的余弦值作

    相关 余弦相似计算

    余弦相似度计算 余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。