一、fuzz模块 该模块下主要介绍四个函数(方法),分别为:简单匹配(Ratio)、非完全匹配(Partial Ratio)、忽略顺序匹配(Token Sort Ratio)和去重子集匹配(Token Set Ratio)
1、简单匹配(Ratio) 这个不怎么精确,也不常用。
1 2 3 4 5 6 from fuzzywuzzy import fuzzprint (fuzz.ratio("河南省" , "河南省" ))print (fuzz.ratio("河南" , "河南省" ))
2、非完全匹配(Partial Ratio) 尽量使用非完全匹配,精度较高。
1 2 3 4 5 6 from fuzzywuzzy import fuzzprint (fuzz.partial_ratio("河南省" , "河南省" ))print (fuzz.partial_ratio("河南" , "河南省" ))
3、忽略顺序匹配(Token Sort Ratio) 原理在于:以 空格 为分隔符,小写 化所有字母,无视空格外的其它标点符号。
1 2 3 4 5 6 7 8 9 10 11 from fuzzywuzzy import fuzzprint (fuzz.partial_ratio("西藏 自治区" , "自治区 西藏" ))print (fuzz.partial_ratio("I love YOU" , "YOU LOVE I" ))print (fuzz.token_sort_ratio("西藏 自治区" , "自治区 西藏" ))print (fuzz.token_sort_ratio("I love YOU" , "YOU LOVE I" ))
4、去重子集匹配(Token Set Ratio) 可理解为该方法是在token_sort_ratio方法的基础上添加了集合去重的功能。
1 2 3 4 5 6 from fuzzywuzzy import fuzzprint (fuzz.token_sort_ratio("西藏 西藏 自治区" , "自治区 西藏" ))print (fuzz.token_set_ratio("西藏 西藏 自治区" , "自治区 西藏" ))
二、process模块 用于处理备选答案有限的情况,返回模糊匹配的字符串和相似度。
类似于爬虫中select,返回的是列表,其中会包含很多匹配的数据。
1 2 3 4 from fuzzywuzzy import processchoices = ["河南省" , "郑州市" , "湖北省" , "武汉市" ] print (process.extract("郑州" , choices, limit=2 ))
如果要提取匹配度最大的结果,可以使用extractOne,注意这里返回的是元组类型,还有就是匹配度最大的结果不一定是我们想要的数据。
1 2 3 4 5 from fuzzywuzzy import processchoices = ["河南省" , "郑州市" , "湖北省" , "武汉市" ] print (process.extractOne("郑州" , choices))print (process.extractOne("北京" , choices))
三、示例 公司名称匹配,设置相似度阈值为90。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 def fuzzy_merge (df_1, df_2, key1, key2, threshold=90 , limit=2 ): s = df_2[key2].tolist() m = df_1[key1].apply(lambda x: process.extract(x, s, limit=limit)) df_1['matches' ] = m m2 = df_1['matches' ].apply(lambda x: [i[0 ] for i in x if i[1 ] >= threshold][0 ] if len ([i[0 ] for i in x if i[1 ] >= threshold]) > 0 else '' ) df_1['matches' ] = m2 return df_1 from fuzzywuzzy import fuzzfrom fuzzywuzzy import processdf = fuzzy_merge(data, company, '公司名称' , '公司名称' , threshold=90 )