如何使用fuzzywuzzy的process.extract函数来处理特定属性的对象列表?

时间:2018-05-21 03:04:36

标签: python fuzzywuzzy

我创建了一个名为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)

1 个答案:

答案 0 :(得分:1)

序言

我的解决方案经过了正确性测试。我需要能够搜索对象列表,这才是对我有用的解决方案。但是,我的解决方案没有经过性能测试,因此我也不在乎它,因为我的数据集很小。对于强烈建议使用大型第三方工具的大型数据集,基于云的搜索工具可能会具有可扩展性和合理的性能。

解决方案

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)

最后,您需要组装结果列表

res = [issuers[z] for (x,y,z) in best_issuers]