0

在我的应用程序中,我有一个功能,用户可以连接到不同的社交网络以获取朋友列表。例如,您可以从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%……等等?这是一个很好的算法吗?我的数学技能很生疏,我不确定这是否可行。

有更好的方法吗?是否有一个标准库可以用于这样的事情?

4

1 回答 1

2

我会选择一个自动算法来决定阈值:

  1. 创建(手动)一组示例- 有些是等效的,有些不是。
  2. 使用各种阈值运行您的算法。
  3. 选择最大化您的结果的阈值。我会使用F-Measure,它考虑了精度(你所说的“等效”确实是多少)和召回率(有多少正确的被标记为这样)。
  4. 使用统计工具来确定不同阈值之间是否存在统计显着性(这将帮助您了解是否需要更多示例或您的集合就可以了)。在大多数情况下, Wilcoxon 测试是它的事实标准。

您可能要考虑的另一种选择是机器学习分类算法领域。在这里,您想进行分类(user1,user2),答案是trueuser1 是否与 user2 相同。
您可以使用相同的工具(统计测试和使用交叉验证)来估计这种方法的准确性。

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

于 2012-12-01T08:22:42.330 回答