difflib的速度助手

时间:2014-04-01 16:04:02

标签: python difflib

我正在使用difflib(SequenceMatcher)执行此任务:对于有错字的3000本书籍,在数据库中找到最接近的匹配,其中128500个标题(据称)无故障。代码很简单:

# imp and dbf are lists of ordered dicts 
# imp contains the messy titles to match (in imp['Titel:'] in each dict)
# dbf contains the clean titles to match against (in dbf['ti']) 

threshold = 0.65

for imprec in imp:
    bestmatch = threshold
    mpair = []

    try: 
        i = imprec['Titel:'][0]
    except KeyError: 
        print('record with InvNo %s has no title' % imprec['InvNo:'])
        continue

    for rec in dbf: 
        try: 
            r = rec['ti'][0]
        except KeyError:
            # record has no title. Do not make screen output.. 
            # print('record with priref %s has no title' % rec['%0'])
            continue

        m = SequenceMatcher(None, i, r)
        if m.ratio() > bestmatch: 
            bestmatch = m.ratio()
            mpair = [bestmatch, imprec, rec]
            print('{} matches for {:4.1f}% with {}'.format(i, m.ratio()*100, r))

    if bestmatch > threshold:
        match.append(mpair)
    else:
        nonmatch.append(imprec)

它有效,但速度很慢。大约100个小时之后,它在3000的列表中大约为40%。问题当然是:128500个标题的3000次迭代= SequenceMatcher的3.855个调用。

我正在寻找优化方法。在this post中,OP创建了一个索引,查询了该索引,并且SequenceMatched了该查询的yield。我认为这是一个很好的方法,但如何实现呢?

脚本只是一次性的,没有花哨的应用程序或任何东西。我的小时预算有限。

修改 Whoosh支持fuzzy term queries。 SQLite有LIKE

我还应该考虑其他可能性吗?

0 个答案:

没有答案