繁体   English   中英

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

[英]How to match names and email addresses in a list of names and a list of email addresses?

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

例如,给定名称John Smith,Jennifer Lopez,Michael Jordan以及电子邮件johns @ email.com,jlopez @ xyz.com。 我想将John Smith与johns@email.com相关联,将Jennifer Lopez与jlopez@xyz.com相关联,将Michael Jordan无关。

请注意,一个人的电子邮件可能与名字有些相关,但是匹配可能非常模糊。 例如,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中如何执行示例代码吗?

我同意bjkistad的意见,也许有更好的地方提出这个问题,但是话虽这么说,天真的实现是使用Levenshtein差异

我将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

正如我所说的那样,这是一个非常幼稚的版本,有更好的模式匹配算法和库...只要问Google。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM