python中的数据匹配(fuzzy,levenstein?)
我想做一些类似excel模糊v形查找的事情,但用python。 我有一个约10000个串联字符串的列表,如:python中的数据匹配(fuzzy,levenstein?),python,matching,levenshtein-distance,fuzzy,Python,Matching,Levenshtein Distance,Fuzzy,我想做一些类似excel模糊v形查找的事情,但用python。 我有一个约10000个串联字符串的列表,如: JohnSmith5159LosAngeles JaneDo7729NewYork etc 我希望在格式相同的列表中查找类似的字符串(我希望指定%match),并将匹配项放在相邻的列中。这可能会带来如下结果: JohnSmith5159LosAngeles | JohnDSmith5159LosAngelez JaneDo7729NewYork | JaneDoe771
JohnSmith5159LosAngeles
JaneDo7729NewYork
etc
我希望在格式相同的列表中查找类似的字符串(我希望指定%match),并将匹配项放在相邻的列中。这可能会带来如下结果:
JohnSmith5159LosAngeles | JohnDSmith5159LosAngelez
JaneDo7729NewYork | JaneDoe7719NewYork
etc
有人知道是否有一个简单的已知脚本或方法来实现这一点吗?Pleasse:)内置的difflib能够返回字符串相似性的比率 然后我编写了一个函数来返回最大相似性的字符串,只要两个字符串之间的相似性比大于或等于0.9 有一个小的快捷方式来检查两个字符串的第一个字母是否匹配。如果不是,则不运行计算。这个想法来自这里: 我假设您正在使用pandas,所以我添加了一个示例,说明如何使用结果填充pandas数据框
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
查一下水母图书馆。它有一系列字符串相似性度量。我在excel中编写了一个函数,但它太慢了,我不知道如何将它转换为python:/@scotthunter这非常有用!Thanks@HenriettaShalansky:不客气!很高兴见到你。