首页 > 解决方案 > 使用fuzzywuzzy

问题描述

我拥有的数据集是手动填写的地址。

我要寻找的城市是“伊斯坦布尔”。它有一个土耳其字符,我也遇到了一些编码问题。例如,在 İstanbul 中使用 lower()'ing İ 不会返回我可以使用正则表达式模式中的常规“i”拾取的字符。

因此,以及其他原因,我改变了模糊字符串搜索的方法。我想为我的模糊查找算法提供参考字符串:“/ist”和“İstanbul”——这些是要在我的地址列中查找的参考值。

我想捕捉的带有短语的行示例:

...İSYTANBUL...
...isanbul...
...Istanbul...
...İ/STANBUL...
...,STANBUL/ÜSKÜDAR...
isatanbul
iatanbul
İSTRANBUL
isytanbul
/isanbul

这些是完整的地址,所以我发现 partial_ratio 与 ratio 相比工作得更好。

我的目标是在行级别使用带有字符串 'istanbul' 或 '/ist. 并使用分数 partial_ratio 返回来获取该行索引的首选列的 True 或 False —'istanbul mu'在代码中引用。

我开发的代码如下,但每次运行时它都会停在大约 25k 行。而且速度非常慢。你认为有更高效的方式来完成任务吗?

def fuzzy(string, df, columnname):
        fullrange = len(df[columnname])
        for i in range(fullrange):
            if fuzz.partial_ratio(string, df[columnname][i]) > 70:
                df.loc[df.index == i, 'istanbul mu'] = True
            else:
                df.loc[df.index == i, 'istanbul mu'] = False

标签: pythonpandasfuzzy-searchfuzzywuzzy

解决方案


作为您自己答案的更快替代方案,您可以将 FuzzyWuzzy 替换为RapidFuzz,它具有更快的实现fuzz.partial_ratio

from rapidfuzz import fuzz
def applyfuzzy(row):
    return fuzz.partial_ratio('the string', row['address_column'], score_cutoff=70) > 70

df['column'] = df.apply(applyfuzzy, axis=1)

推荐阅读