将来自不同社交网络的好友列表组合成一个列表的好算法?

时间:2012-12-01 08:16:05

标签: java algorithm search probability fuzzy-search

在我的应用程序中,我有一个功能,用户可以连接到不同的社交网络以获取朋友列表。例如,您可以通过linkedIn和Facebook获取您的朋友。

我想提供一个朋友列表,这是将来自不同社交网络的各种列表组合在一起的结果。问题是如何确定不同列表中的名称是否可能是同一个人?例如,Facebook可能会说“Jim Smith”和Linked In可能会说“Jim Smith,Phd”,我希望我的应用程序检测到他们是同一个人。

我已经查看了Levenshtein距离函数的字符串,但我不确定在考虑两个名称之前设置阈值是什么,可能相同,75%的置信度。

以下是我正在考虑的事情:

  • 以小写字母进行所有比较
  • 在计算levenshtein距离之前,从正在比较的两个名称中删除所有空格
  • 将levenshtien距离转换为较短名称长度的百分比
  • 如果百分比为0则为完美匹配
  • 如果百分比是< x他们可能是相同的

我打算使用apache commons StringUtils.getLevenshteinDistance()进行Leventstien计算。

x的价值是多少? 10%,20%,30%......等等?这是一个很好的算法,我的数学技能非常生疏,我不确定这是否有效。

有更好的方法吗?是否有一个标准库,人们应该使用这样的东西?

1 个答案:

答案 0 :(得分:2)

我会选择一个自动算法来决定应该是什么阈值:

  1. 创建(手动)一组示例 - 有些是等效的,有些则不是。
  2. 使用各种阈值运行您的算法。
  3. 选择最大化结果的阈值。我会使用F-Measure,它会考虑precision(你说的有多少是“等价的”)和recall(有多少人是正确的标记为)。
  4. 使用statistical tools 确定不同阈值之间是否存在统计显着性(它会帮助您了解是否需要更多示例或您的设置是否合适)。在大多数情况下,Wilcoxon test是它的事实上的标准。

  5. 您可能需要考虑的替代方案是 machine learning - classification algorithms。在这里,如果user1与user2相同,则需要对(user1,user2)进行calssify,答案为true
    您可以使用相同的工具(统计测试,并使用cross-validation)来估计此方法的准确性。

    (免责声明:虽然我认为自己是经验丰富的ML开发人员,但我从未试图用这种方法做过类似的事情。)