2014-10-30 67 views

回答

0

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

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

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

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; 

    } 

}