【问题标题】:vector space model algorithm in Java to get the similarity score between two peopleJava中的向量空间模型算法获得两个人之间的相似度分数
【发布时间】:2013-03-22 04:07:36
【问题描述】:

我正在尝试在 Java 中使用/实现向量空间模型算法,以根据其关键字获取两个人之间的相似度得分。所以我有以下课程:

Person - 有一个关键字列表;

关键字 - 字符串文本; 整数分数;

关键字得分是该人对关键字的提及次数。

关于如何在 Java 中实现这一点有什么建议吗?

问候

【问题讨论】:

  • 您有什么特别的理由必须自己在 Java 中实现 VSM?就个人而言,我会使用 WEKA 来做这样的事情。
  • 重新发明轮子的理由比功课要多。我不认为这个问题是完全不合理的。
  • 在 WEKA 中,我可以在哪里获得能够为我执行此操作的类/方法?这里不需要机器学习,只想根据关键字比较两个人。提取关键字的模块已经使用了一些机器算法来改进其工作。
  • 为什么需要使用Weka?只需计算两个特征向量之间的余弦相似度(或其他度量)。

标签: java algorithm vector artificial-intelligence text-mining


【解决方案1】:

这很容易。

  1. 首先,您应该为每个人创建矢量表示,例如表示其关键字的地图。
  2. 其次你应该选择指标,我推荐http://en.wikipedia.org/wiki/Cosine_similarity

现在是真正的代码:

  static double cosine_similarity(Map<String, Double> v1, Map<String, Double> v2) {
            Set<String> both = Sets.newHashSet(v1.keySet());
            both.retainAll(v2.keySet());
            double sclar = 0, norm1 = 0, norm2 = 0;
            for (String k : both) sclar += v1.get(k) * v2.get(k);
            for (String k : v1.keySet()) norm1 += v1.get(k) * v1.get(k);
            for (String k : v2.keySet()) norm2 += v2.get(k) * v2.get(k);
            return sclar / Math.sqrt(norm1 * norm2);
    }

【讨论】:

  • 另外,'both.removeAll' 应该是 'both.retainAll',因为我们想要找到两个集合 v1 和 v2 的交集
【解决方案2】:

我认为上面的示例代码中存在错误。更正后的代码如下。

static double cosine_similarity(Map<String, Double> v1, Map<String, Double> v2) {
        Set<String> both = Sets.newHashSet(v1.keySet());
        both.removeAll(v2.keySet());

        double sclar = 0, norm1 = 0, norm2 = 0;

        /* We need to perform cosine similarity only on words that 
         * exist in both lists */
        for (String k : both)  {
           sclar += v1.get(k) * v2.get(k);
           norm1 += v1.get(k) * v1.get(k);
           norm2 += v2.get(k) * v2.get(k);
        }
        return sclar / Math.sqrt(norm1 * norm2);
}

【讨论】:

  • 其实yura是对的。在计算norm1norm2 时,您需要分别循环遍历每个映射。这样,我们可以考虑两个字符串之间的不匹配。否则只会在共享词上计算相似度,sim分数会被虚夸。
猜你喜欢
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2019-12-27
相关资源
最近更新 更多