我正在尝试使用 Python 2.7 和 Levenshtein 函数将姓氏列表与全名列表进行匹配。为了减少工作量,我仅在第一个字母相同的情况下进行匹配(尽管这似乎在性能方面没有太大差异)。如果找到匹配项,则将从全名中删除匹配的单词(以使后续的名字匹配更容易)。
两个列表都包含数万个条目,因此我的解决方案相当慢。在不解析全名的情况下如何加快速度?
这是我到目前为止所得到的(对于姓氏由多个单词组成的情况,我省略了一些 if 条件):
import Levenshtein
listoflastnames=(['Jones', 'Sallah'])
listoffullnames=(['Henry', 'Jones', 'Junior'],['Indiana', 'Jones'])
def match_strings(lastname, listofnames):
match=0
matchedidx=[]
for index, nameelement in enumerate(listofnames):
if lastname[0]==nameelement [0]:
if Levenshtein.distance(nameelement, lastname)<2:
matchedidx.append(index)
match=match+1
if match==1:
newnamelist = [i for j, i in enumerate(listofnames) if j not in matchedidx]
return 1, newnamelist
return 0, listofnames
for x in listoflastnames:
for y in listoffullnames:
match, newlistofnames=match_strings(x,y)
if match==1:
#go to first name match...
任何帮助,将不胜感激!
更新:与此同时,我使用了多处理模块来让我的所有 4 个核心而不是仅一个核心来处理该问题,但匹配仍然需要很多时间。
这简化了for
循环中match_string
功能,但在我的测试中并没有明显提高速度。最大的损失在于两个for
循环使用姓氏和全名。
def match_strings(lastname, listofnames):
firstCaseMatched = [name for name in listofnames if lastname[0] == name[0]]
if len(firstCaseMatched):
matchedidx = [index for index, ame in enumerate(firstCaseMatched) if Levenshtein.distance(lastname, name) < 2]
match = len(matchedidx)
else:
match = 0
if match == 1:
newnamelist = [i for j, i in enumerate(listofnames) if j not in matchedidx]
return 1, newnamelist
return 0, listofnames
您可能需要对已知姓氏列表进行排序,将它们分成dict
对于每个起始字符。然后将名称列表中的每个名称与该名称进行匹配。
假设全名列表始终将名字作为第一个元素。您可以将比较限制为仅与其他元素进行比较。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)