繁体   English   中英

python 中的数据匹配(模糊,levenstein?)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM