2014-10-30 69 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; 

    } 

}