如何使用 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)

其中 queryscore 与使用列表提取相同,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]