如何匹配名称列表和电子邮件地址列表中的姓名和电子邮件地址?

时间:2016-05-18 02:07:37

标签: python email fuzzy-search

鉴于一些人名和一些电子邮件(名称数量不少于电子邮件数量),我想将这些名称与电子邮件相匹配。我假设每个名字最多只有一封电子邮件是他/她的真实邮件,每封电子邮件必须是一个真实的电子邮件,只有一个给定的人。

例如,给出John Smith,Jennifer Lopez,Michael Jordan和电子邮件的名称,johns @ email.com,jlopez @ xzz.com。我想将约翰史密斯与johns@email.com,詹妮弗洛佩兹与jlopez@xyz.com和迈克尔乔丹联系在一起。

请注意,某个人的电子邮件可能与该名称有些相关,但匹配可能非常模糊。例如,John Smith可能具有以下任何电子邮件地址。

  • jsmith@email.com
  • johns@email.com
  • johnsmith@email.com
  • john.smith@email.com
  • smithjohn@email.com
  • smithj@email.com
  • sjohn@email.com
  • johnsmith000@email.com

似乎需要编写几个规则来解密电子邮件地址和人名来执行模糊匹配。有没有人有关于如何在python中完成这个的示例代码?

1 个答案:

答案 0 :(得分:1)

我和bjkistad合作,可能有更好的地方可以提出这个问题,但据说这是一个天真的实现,就是使用Levenshtein Difference

我将Levenshtein差异函数的实现作为学生的练习......(你可以在网上找到很多实现。

def levenshtein(a, b):
    pass

human_name = 'John Smith'
addresses = ['jsmith@email.com', 'johns@email.com',
             'johnsmith@email.com', 'john.smith@email.com',
             'smithjohn@email.com', 'smithj@email.com',
             'sjohn@email.com', 'johnsmith000@email.com']
name_parts = [address.split('@')[0] for address in addresses]
lev_diff = [levenshtein(ename, human_name) for ename in name_parts]
index, score = min(enumerate(lev_name), key=operator.itemgetter(1))
best_match addresses[index]

print "The best match %s has the score %d" % (best_match, score)

#OUTPUT:
# The best match johnsmith@email.com has the score 3

正如我所说,这是一个非常天真的版本,有更好的模式匹配算法和库...只要问谷歌。