【Python】模糊匹配搜索

1. 概述

利用python库:fuzzywuzzydifflib,两个库均可实现词粒度的模糊匹配,同时可设定模糊阈值,实现关键词的提取、地址匹配、语法检查等

2. fuzzywuzzy

pip install fuzzywuzzy

from fuzzywuzzy import process
from fuzzywuzzy import fuzz

2.1 fuzzy模块

(1)模糊匹配方法

  1. ratio()——简单匹配,使用纯Levenshtein Distance进行匹配。
  2. partial_ratio()——非完全匹配,基于最佳的子串(substrings)进行匹配
  3. token_set_ratio——忽略顺序匹配,对字符串进行标记(tokenizes)并在匹配之前按字母顺序对它们进行排序 
  4. token_set_ratio——去重子集匹配,对字符串进行标记(tokenizes)并比较交集和余数 

(2)实例

  • ratio() 简单匹配
fuzz.ratio("河南省", "河南省")
>>> 100

fuzz.ratio("河南", "河南省")
>>> 80
  • partial_ratio() 非完全匹配

 

fuzz.partial_ratio("河南省", "河南省")
>>> 100

fuzz.partial_ratio("河南", "河南省")
>>> 100
  • token_set_ratio() 忽略顺序匹配

 

fuzz.ratio("西藏 自治区", "自治区 西藏")
>>> 50
fuzz.ratio('I love YOU','YOU LOVE I')
>>> 30

fuzz.token_sort_ratio("西藏 自治区", "自治区 西藏") 
>>> 100
fuzz.token_sort_ratio('I love YOU','YOU LOVE I') 
>>> 100
  • token_set_ratio() 去重子集匹配
fuzz.ratio("西藏 西藏 自治区", "自治区 西藏")
>>> 40

fuzz.token_sort_ratio("西藏 西藏 自治区", "自治区 西藏")
>>> 80

fuzz.token_set_ratio("西藏 西藏 自治区", "自治区 西藏")
>>> 100

2.2 process模块

(1) extract提取多条数据

类似于爬虫中select,返回的是列表,其中会包含很多匹配的数据

choices = ["河南省", "郑州市", "湖北省", "武汉市"]
process.extract("郑州", choices, limit=2)
>>> [('郑州市', 90), ('河南省', 0)]
# extract之后的数据类型是列表,即使limit=1,最后还是列表,注意和下面extractOne的区别

(2)extractOne提取一条数据

提取匹配度最大的结果,返回 元组 类型, 还有就是匹配度最大的结果不一定是我们想要的数据,可以通过下面的示例和两个实战应用体会一下

process.extractOne("郑州", choices)
>>> ('郑州市', 90)

process.extractOne("北京", choices)
>>> ('湖北省', 45)

3. difflib

Difflib作为python的标准库,difflib模块提供的类和方法用来进行序列的差异化比较,它能够比对文件并生成差异结果文本或者html格式的差异化比较页面,而且支持输出可读性比较强的HTML文档

(0)get_close_matches(word, possibilities, n=3, cutoff=0.6)

import difflib
config_list = ['中国工商银行','中国农业银行','建设银行','中国人民银行','招商证券','中国农业发展银行']
query_word = '农行'

res = difflib.get_close_matches(query_word, config_list, 1, cutoff=0.5)
print(res)
>>>['中国农业银行']

扩展——文件比较

(1)difflib.Differ

此类比较的是文本行的差异并且产生适合人类阅读的差异结果或者增量结果,结果中各部分的表示如下:

(2)difflib.HtmlDiff

make_file(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])

make_table(fromlines, tolines [, fromdesc][, todesc][, context][, numlines])

 此类可以被用来创建HTML表格 (或者说包含表格的html文件) ,两边对应展示或者行对行的展示比对差异结果。以上两个方法都可以用来生成包含一个内容为比对结果的表格的html文件,并且部分内容会高亮显示。

(3)context_diff

difflib.context_diff(a, b[, fromfile][, tofile][, fromfiledate][, tofiledate][, n][, lineterm])

比较a与b(字符串列表),并且返回一个差异文本行的生成器

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> for line in context_diff(s1, s2, fromfile='before.py', tofile='after.py'):
...     sys.stdout.write(line)  
*** before.py
--- after.py
***************
*** 1,4 ****
! bacon
! eggs
! ham
  guido
--- 1,4 ----
! python
! eggy
! hamster
  guido

(4) 比对两个文件,然后生成一个展示差异结果的HTML文件

import difflib
hd = difflib.HtmlDiff()
file1 = ''
with open('xxx1.py','r') as load:
    file1 = load.readlines()
    load.close()

file2 = ''
with open('xxx2', 'r') as mem:
    file2 = mem.readlines()
    mem.close()

with open('htmlout.html','a+') as fo:
    fo.write(hd.make_file(file1,file2))
    fo.close()

总结:difflib多用于文本的差异比较,用于模糊匹配精度还是不太准的,一般词的模糊匹配可用fuzzywuzzy

参考链接

1. python difflib模块讲解示例

2.【python】字符串模糊匹配及在实战中的应用(FuzzyWuzzy库)

3. FuzzyWuzzy:Python中的模糊字符串匹配

  • 14
    点赞
  • 179
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值