簡體   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