我创建了一个名为Issuer
的对象,其中包含一个名为issuer_name
的成员。
我想利用fuzzywuzzy的process.extract()
函数,但它只接受一个字符串列表。我的目标是找到匹配项并返回issuer_name
匹配的对象列表。
我想出了下面这个方法,但它的运行速度非常慢。发行人列表包含100,000多个元素。
# (string, list of issuers , integer)
def fuzzyMatchWordToIssuers(word, issuers, threshold):
limit = 5
count = 0
res = []
for issuer in issuers:
calc = fuzz.token_set_ratio(word,issuer.issuer_name)
if calc >= threshold:
res.append(issuer)
count += 1
if count == limit:
return res
return res
是否有可能以某种方式使用process.extract()
,或加快速度?
作为参考,这里是github示例:
process.extract("new york jets", choices, limit=2)
答案 0 :(得分:1)
序言
我的解决方案经过了正确性测试。我需要能够搜索对象列表,这才是对我有用的解决方案。但是,我的解决方案没有经过性能测试,因此我也不在乎它,因为我的数据集很小。对于强烈建议使用大型第三方工具的大型数据集,基于云的搜索工具可能会具有可扩展性和合理的性能。
解决方案
fuzzywuzzy process.extract显然可以处理仅搜索值的字典,其结果是具有以下结构的元组列表
(query, score, key)
其中query
和score
与使用带有列表的摘录相同,并且key
是与字符串值匹配的键(值仍必须是字符串)。
因此,您将需要创建一个处理后的发行人名称字典,其键像这样的索引
issuer_names_dict = dict(enumerate([issuer.name for issuer in issuers]))
然后您可以将此字典传递给process.extract
(我认为您应该使用extractBests,因为您使用的是截止阈值)
best_issuers = process.extractBests(word, issuer_names_dict, score_cutoff=threshold, limit=5)
最后,您需要组装结果列表
res = [issuers[z] for (x,y,z) in best_issuers]