我想使用Python 2.7和Levenshtein函数将姓氏列表匹配到全名列表。为了减少工作量,我只在第一个字母相同的情况下才会匹配(尽管这在性能上似乎没有太大区别)。如果找到匹配项,则从全名中删除匹配的词(以使后续的名字匹配更容易)。这两个列表都包含几万个条目,所以我的解决方案相当慢。我如何在不解析完整名称的情况下加快速度? 这里是我迄今为止(对于情况下,我省略了一些,如果条件在lastnames由若干字):Python,嵌套循环,匹配和性能
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核处理问题而不仅仅是一个,但匹配仍需要很长时间。
'Levenshtein.distance(G,publastnames [0]' 什么是G和publastnames [0]这里? – M4rtini
对不起,那是一个遗留的从旧版本。在莱文斯坦功能比较姓和一个字 – MrFancypants
如果只打算执行第一个字母相同的计算,则可能需要将列表拆分为第一个字母索引的字典,然后您可以执行只有可行的候选人之间进行比较,而不是所有人之间的比较,这是否会提高性能取决于花在这个开销上的时间是多少,而不是距离计算的结果 – DSM