如何使用 fuzzywuzzy 的 process.extract 函数按特定属性处理对象列表?
How to use fuzzywuzzy's process.extract function to process a list of objects by a particular attribute?
我创建了一个名为 Issuer
的对象,其中包含一个名为 issuer_name
的成员。
我想利用 fuzzywuzzy 的 process.extract()
函数,但它只接受字符串列表。我的目标是找到匹配项和 return 与 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)
前言
我的解决方案已经过正确性测试。我需要能够搜索对象列表,这是对我有用的解决方案。但是,我的解决方案没有经过性能测试,我也不关心它,因为我的数据集很小。对于大型数据集,我强烈建议使用第三方工具,可能一些基于云的搜索工具具有可扩展性和合理的性能。
解决方案
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)
最后你需要assemble结果列表
res = [issuers[z] for (x,y,z) in best_issuers]
我创建了一个名为 Issuer
的对象,其中包含一个名为 issuer_name
的成员。
我想利用 fuzzywuzzy 的 process.extract()
函数,但它只接受字符串列表。我的目标是找到匹配项和 return 与 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)
前言
我的解决方案已经过正确性测试。我需要能够搜索对象列表,这是对我有用的解决方案。但是,我的解决方案没有经过性能测试,我也不关心它,因为我的数据集很小。对于大型数据集,我强烈建议使用第三方工具,可能一些基于云的搜索工具具有可扩展性和合理的性能。
解决方案
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)
最后你需要assemble结果列表
res = [issuers[z] for (x,y,z) in best_issuers]