我尝试使用Python2.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个内核都能处理这个问题,而不仅仅是一个,但是匹配仍然需要很多时间。在
这简化了
match_string
函数中的for
循环,但在我的测试中并没有显著提高速度。最大的损失是在具有姓氏和全名的两个for
循环中。在您可能需要对已知姓氏的列表进行排序,将它们拆分为每个起始字符的
dict
。然后将名单中的每个名字与之对应。在假定第一个元素的全名始终为第一个元素。您可以将比较限制为仅对其他元素进行比较。在
相关问题 更多 >
编程相关推荐