[英]Data matching in python (fuzzy, levenstein?)
我想做类似 excel 模糊 v 查找,但在 python 中。 我有一个大约 10,000 个连接字符串的列表,例如:
JohnSmith5159LosAngeles
JaneDo7729NewYork
etc
我想在以相同方式格式化的列表中查找相似的字符串(并且我想指定 % 匹配),并将匹配放在相邻列中。 希望返回如下内容:
JohnSmith5159LosAngeles | JohnDSmith5159LosAngelez
JaneDo7729NewYork | JaneDoe7719NewYork
etc
有谁知道是否有一个简单的已知脚本或方法可以做到这一点? 请:)
内置的 difflib 能够返回字符串相似度的比率。
然后我写了一个 function 来返回最大相似度的字符串,只要两个字符串之间的相似度比大于等于 0.9。
有一个小快捷方式可以检查两个字符串的第一个字母是否匹配。 如果不是,则不运行计算。 这个想法来自这里: https://stackoverflow.com/a/20478493/42346
我假设你在 pandas 工作,所以我添加了一个示例,说明如何使用结果填充 pandas DataFrame。
from difflib import SequenceMatcher
def similar(a, b):
""" https://stackoverflow.com/a/17388505/42346 """
return SequenceMatcher(None, a, b).ratio()
def max_similar_string(s, l):
first_letter_match = [i for i in l if s[0] == i[0]]
if len(first_letter_match):
max_ratio = 0
max_ratio_string = ''
for i in l:
ratio = similar(i,s)
if ratio > max_ratio:
max_ratio = ratio
max_ratio_string = i
if max_ratio >= 0.9:
return (max_ratio_string,max_ratio)
else:
return (np.nan,np.nan)
l = ['JohnDSmith5159LosAngelez','JaneDoe7719NewYork']
df = pd.DataFrame({'s':['JohnSmith5159LosAngeles','JaneDo7729NewYork']})
for idx in df.index:
df.loc[idx,'similar'], df.loc[idx,'ratio'] = max_similar_string(df.loc[idx,'s'],l)
结果:
s similar ratio
0 JohnSmith5159LosAngeles JohnDSmith5159LosAngelez 0.936170
1 JaneDo7729NewYork JaneDoe7719NewYork 0.914286
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.