使用模糊模糊

2024-09-28 21:41:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

因此,除其他原因外,我改变了模糊字符串搜索的方法。我想为我的模糊查找算法提供引用字符串:'/ist'和'İstanbul'-这些是要在我的地址列中查找的引用值

包含我想要捕捉的短语的行的示例:

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

这些都是完整地址,所以我发现部分_比率与比率相比工作得更好

我的目标是在行级别使用fuzzywuzzy.partial_ratio和字符串'伊斯坦布尔'或'/ist。并使用score partial_ratio返回值为该行索引的首选列(在代码中被引用为'istanbul mu')获取True或False

我开发的代码如下所示,但每次运行时它都会停在大约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

Tags: 方法字符串indf地址字符partialratio
2条回答

这种方法做得更好。使用.process可能会获得更好的结果,但仅供参考:

def applyfuzzy(row):
    if fuzz.partial_ratio('the string', row['column holding the address to be queried']) > 65:
        return True
    else:
        return False
df['preferredcolumn'] = df.apply(applyfuzzy, axis=1)

作为您自己答案的快速替代,您可以用RapidFuzz替换FuzzyWuzzy,它具有更快的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)

相关问题 更多 >