有没有办法根据配置文件数据匹配两个配置文件

时间:2014-10-30 06:27:13

标签: nlp artificial-intelligence opennlp

我需要测量两个配置文件之间的相似性,我们将在其中用文字描述它们。现在使用配置文件数据,我需要找到它们之间的相似性。你能建议我一个方法吗?

2 个答案:

答案 0 :(得分:0)

您可以对此问题进行文献综述,将问题分解为子问题,或根据您查看问题的方式应用现有解决方案。例如,如果将此问题视为文本聚类的应用程序,则可以应用现有的句子相似性度量。

关键字匹配似乎是最简单的解决方案。此基线仅要求您标识命名实体并计算匹配。你可以在这个过程中做一些术语加权。

解决方案的复杂性取决于文本的结构(概况更像LinkedIn简介或简历?)和误报的可能性(名称和出生日期总是存在,是否足以建立相似性? )。你没有提供我们看到的例子。

答案 1 :(得分:0)

在OpenNLP中没有真正的实用工具。我建议你先采取一种简单的方法,然后从那里开始工作。我建议的简单方法是对每个配置文件描述进行矢量化,然后使用标准相似性度量来比较它们。以下是使用余弦相似性的示例。您可能遇到的下一个问题是尝试将它们全部相互比较......然后您将进入需要进行聚类的领域。您还应该考虑噪声消除和停用词,并可能产生更好的令牌。这个例子只是一个例子,你要做的最重要的决定就是向你的载体添加什么。

import java.util.HashSet;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;

/**
 *
 * Crudely compares two strings
 */
public class SimpleProfileComparer {

  public static void main(String[] args) {
    String[] profileA = "bob likes to ride bikes and hiking".split(" ");
    String[] profileB = "jim likes bikes and also enjoys hiking".split(" ");;
    SortedMap<String, Double> a = new TreeMap<>();
    for (String string : profileA) {
      a.put(string, 1d);
    }
    SortedMap<String, Double> b = new TreeMap<>();
    for (String string : profileB) {
      b.put(string, 1d);
    }
    Set<String>keys = new HashSet<>();
    keys.addAll(a.keySet());
    keys.addAll(b.keySet());
    for (String string : keys) {
      if(!a.containsKey(string)){
        a.put(string, 0d);
      }
      if(!b.containsKey(string)){
        b.put(string, 0d);
      }
    }
    Double compare = compare(a, b);
    System.out.println(compare);
  }

  public static Double compare(SortedMap<String, Double> a, SortedMap<String, Double> b) {
    //both vectors must be of the same schema (normed prior to this call)
    if (a.keySet().size() != b.keySet().size()) {
      throw new IllegalArgumentException("vectors must be the same length");
    }
    double magA = 0;
    double magB = 0;
    double dotProd = 0;
    for (String key : a.keySet()) {
      Double intA = a.get(key);
      Double intB = b.get(key);
      /*
       * sum of squares calcs
       */
      magA += intA * intA;
      magB += intB * intB;
      /**
       * dot prod calc
       */
      dotProd += intA * intB;
    }
    magA = Math.sqrt(magA);
    magB = Math.sqrt(magB);
    Double similarity = dotProd / (magA * magB);
    return similarity;

  }

}