【发布时间】:2013-12-08 23:37:33
【问题描述】:
我正在尝试使用 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 个内核而不是一个内核来处理这个问题,但匹配仍然需要很多时间。
【问题讨论】:
-
´Levenshtein.distance(g, publastnames[0]´ 这里的 g 和 publastnames[0] 是什么?
-
抱歉,这是旧版本遗留下来的。 Levenshtein 函数比较姓氏和全名中的一个单词。我已经纠正了错误。
-
如果您只打算执行第一个字母相同的计算,您可能希望将列表分解为由第一个字母索引的字典。然后你可以只在可行的候选人之间进行比较,而不是在所有人之间进行比较。这是否会提高性能取决于花费在此开销上的时间比例,而不是距离计算。
-
您可以先将名称按长度拆分为子列表。
n长度差异的两个字符串的 Levenstein 差异不能小于n。
标签: python python-2.7 nested-loops levenshtein-distance