我正在使用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
。
我还应该考虑其他可能性吗?