Nlp 是否有一种基于配置文件数据匹配两个配置文件的方法

Nlp 是否有一种基于配置文件数据匹配两个配置文件的方法,nlp,artificial-intelligence,opennlp,Nlp,Artificial Intelligence,Opennlp,我需要衡量两个配置文件之间的相似性,在这两个配置文件中,我们将用文字描述它们。现在使用概要数据,我需要找到它们之间的相似性。你能给我提个建议吗 您可以对此问题进行文献回顾,将问题分解为子问题,或者根据您对问题的看法应用现有解决方案。例如,如果将此问题视为文本聚类的应用,则可以应用现有的句子相似性度量 关键字匹配似乎是最简单的解决方案。此基线仅要求您标识命名实体并计算匹配项。在此过程中,您可以进行一些术语加权 解决方案的复杂性取决于文本的结构(档案更像LinkedIn档案还是简历?)和误报的可能性

我需要衡量两个配置文件之间的相似性,在这两个配置文件中,我们将用文字描述它们。现在使用概要数据,我需要找到它们之间的相似性。你能给我提个建议吗

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

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


解决方案的复杂性取决于文本的结构(档案更像LinkedIn档案还是简历?)和误报的可能性(姓名和出生日期是否总是存在,是否足以建立相似性?)。您没有提供一个示例供我们查看。

在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;

  }

}
import java.util.HashSet;
导入java.util.Set;
导入java.util.SortedMap;
导入java.util.TreeMap;
/**
*
*粗略地比较两个字符串
*/
公共类SimpleProfileComparer{
公共静态void main(字符串[]args){
String[]profileA=“鲍勃喜欢骑自行车和徒步旅行”。split(“”);
String[]profileB=“吉姆喜欢自行车,也喜欢徒步旅行”;;
SortedMap a=新树映射();
for(字符串:profileA){
a、 put(字符串,1d);
}
SortedMap b=新树映射();
for(字符串:profileB){
b、 put(字符串,1d);
}
Setkeys=newhashset();
addAll(a.keySet());
addAll(b.keySet());
用于(字符串:键){
如果(!a.containsKey(字符串)){
a、 put(字符串,0d);
}
如果(!b.containsKey(字符串)){
b、 put(字符串,0d);
}
}
双重比较=比较(a,b);
System.out.println(比较);
}
公共静态双重比较(分类地图a、分类地图b){
//两个向量必须具有相同的模式(在此调用之前进行规范化)
如果(a.键集().size()!=b.键集().size()){
抛出新的IllegalArgumentException(“向量必须具有相同的长度”);
}
双magA=0;
双磁极=0;
double dotProd=0;
for(字符串键:a.keySet()){
双intA=a.get(键);
双intB=b.get(键);
/*
*平方和计算
*/
magA+=intA*intA;
磁极+=intB*intB;
/**
*点生产计算
*/
dotProd+=intA*intB;
}
magA=数学sqrt(magA);
magB=数学sqrt(magB);
双重相似性=dotProd/(magA*magB);
返回相似性;
}
}