python - 使用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
解决方案
作为您自己答案的更快替代方案,您可以将 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)
推荐阅读
- python - 运行 pylint 最后会导致错误
- node.js - 如何收听电子邮件服务器的所有入站电子邮件
- sql - 交叉制表 - SAS 中的频率表
- firebase - 使用 firebase 在 listview 中显示所有用户图像
- javascript - 如何在浏览器中使用 JSX 导入 javascript 模块?
- django - 在 Django 中更新多对多关系时如何不触发“m2m_changed”信号?
- mongodb - Mongodb分页和按组ID排序
- git - 如何通过将代码保留在本地机器上来忽略 git 中的更改?
- java - 获取资源未找到 404 即使 URL 是正确的 spring boot
- elasticsearch - 在弹性搜索中,如何将数据从现有字段复制到新字段?