精华内容
下载资源
问答
  • Python实现模糊匹配

    2018-10-17 22:41:45
    Python实现字符串的模糊匹配,‘?’代表一个字符, ‘*’代表任意多个字符。给一段明确字符比如avdjnd 以及模糊字符比如*dj?dji?ejj,判断二者是否匹配。若能匹配输出”Yes”, 否则输出“No”
  • python实现模糊匹配

    万次阅读 2018-10-17 22:39:30
    题目:模糊匹配, ‘?’代表一个字符, *代表任意多个字符。给一段明确字符比如avdjnd 以及模糊字符比如*dj?dji?ejj,判断二者是否匹配。若能匹配输出”Yes”, 否则输出“No” (为了方便阅读,代码里面输出Ture or ...

    题目:模糊匹配, ‘?’代表一个字符, *代表任意多个字符。给一段明确字符比如avdjnd 以及模糊字符比如*dj?dji?ejj,判断二者是否匹配。若能匹配输出”Yes”, 否则输出“No”
    (为了方便阅读,代码里面输出Ture or False)

    解题的思路:通过明确终止条件通过递归的方式求解
    终止的条件:
    (1) Str为空 以及 pattern为空或者pattern元素只有[*], 输出True (yes) 例如:“” | “*****”
    (2) Str为空、pattern为非空或者str为空pattern元素不只有【*】,输出False 例如:“”|“abc” “” “a*”
    (3) Str为非空 以及pattern为空 输出False.例如:“abc” |“”
    下面分类第一个是否是否为*,第二个是否为*分类讨论。
    第一个字符为*, 那么str和pattern分别后移
    第一个字符不为*
    判断第二个字符是否为*,如果是根据第一个字符是否相等分为两种情况
    第一个字符相等(包括pattern为?):str同时移到一个位置,递归
    第一个字符不相等:让str后移一位,递归
    代码,下载

    展开全文
  • python实现模糊匹配

    千次阅读 2017-11-12 13:46:00
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #!/usr/bin/envpythong #_*_coding:utf-8_*_ importre # data=[ 'tantianranphone118', ...
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #!/usr/bin/env pythong
    #_*_ coding:utf-8 _*_
    import re
    #
    data = [
    'tantianran phone 118',
    'tanyongxing phone 110',
    'tansufen phone 119',
    'dengwenyi phone 118',
    'dengwenqing phone 520',
    'laowang phone 110',
    'zhongjianwei 112'
    ]
     
    def findes(user_input,data):
    sugge = []
    pat = '.*'.join(user_input)
    regex = re.compile(pat)
    for item in data:
    match = regex.search(item)
    if match:
    sugge.append(item)
    return sugge
     
    strs = raw_input('输入查找的字符:')
    print '查找结果'
    for in findes(strs,data):
    print "\033[31m %s \033[0m" % i



    本文转自 TtrToby 51CTO博客,原文链接:http://blog.51cto.com/freshair/1869828
    展开全文
  • 利用python库:fuzzywuzzy及difflib,两个库均可实现词粒度的模糊匹配,同时可设定模糊阈值,实现关键词的提取、地址匹配、语法检查等 2. fuzzywuzzy pip install fuzzywuzzy from fuzzywuzzy import process ...

    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中的模糊字符串匹配

    展开全文
  • FuzzyWuzzy一个简单易用的模糊字符串匹配工具包。让你轻松解决烦恼的匹配问题! 前言 在处理数据的过程中,难免会遇到下面类似的场景,自己手里头获得的是简化版的数据字段,但是要比对的或者要合并的却是完整版的...

    参考链接:https://mp.weixin.qq.com/s/5qzPb7HOCfRRGJICYUsAOQ
    FuzzyWuzzy一个简单易用的模糊字符串匹配工具包。让你轻松解决烦恼的匹配问题!

    1. 前言

    在处理数据的过程中,难免会遇到下面类似的场景,自己手里头获得的是简化版的数据字段,但是要比对的或者要合并的却是完整版的数据(有时候也会反过来)

    最常见的一个例子就是:在进行地理可视化中,自己收集的数据只保留的缩写,比如北京,广西,新疆,西藏等,但是待匹配的字段数据却是北京市,广西壮族自治区,新疆维吾尔自治区,西藏自治区等,如下。因此就需要有没有一种方式可以很快速便捷的直接进行对应字段的匹配并将结果单独生成一列,就可以用到FuzzyWuzzy库。

    图片

    1. FuzzyWuzzy库介绍

    FuzzyWuzzy 是一个简单易用的模糊字符串匹配工具包。它依据 Levenshtein Distance 算法,计算两个序列之间的差异。

    Levenshtein Distance算法,又叫 Edit Distance算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。

    这里使用的是Anaconda下的jupyter notebook编程环境,因此在Anaconda的命令行中输入一下指令进行第三方库安装。

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple FuzzyWuzzy

    2.1 fuzz模块

    该模块下主要介绍四个函数(方法),分别为:简单匹配(Ratio)、非完全匹配(Partial Ratio)、忽略顺序匹配(Token Sort Ratio)和去重子集匹配(Token Set Ratio)

    注意: 如果直接导入这个模块的话,系统会提示warning,当然这不代表报错,程序依旧可以运行(使用的默认算法,执行速度较慢),可以按照系统的提示安装python-Levenshtein库进行辅助,这有利于提高计算的速度。

    图片

    2.1.1 简单匹配(Ratio)

    简单的了解一下就行,这个不怎么精确,也不常用

    fuzz.ratio(“河南省”, “河南省”)

    100

    fuzz.ratio(“河南”, “河南省”)

    80

    2.1.2 非完全匹配(Partial Ratio)

    尽量使用非完全匹配,精度较高

    fuzz.partial_ratio(“河南省”, “河南省”)

    100

    fuzz.partial_ratio(“河南”, “河南省”)

    100

    2.1.3 忽略顺序匹配(Token Sort 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

    2.1.4 去重子集匹配(Token Set Ratio)

    相当于比对之前有一个集合去重的过程,注意最后两个,可理解为该方法是在token_sort_ratio方法的基础上添加了集合去重的功能,下面三个匹配的都是倒序

    fuzz.ratio(“西藏 西藏 自治区”, “自治区 西藏”)

    40

    fuzz.token_sort_ratio(“西藏 西藏 自治区”, “自治区 西藏”)

    80

    fuzz.token_set_ratio(“西藏 西藏 自治区”, “自治区 西藏”)

    100

    fuzz这几个ratio()函数(方法)最后得到的结果都是数字,如果需要获得匹配度最高的字符串结果,还需要依旧自己的数据类型选择不同的函数,然后再进行结果提取,如果但看文本数据的匹配程度使用这种方式是可以量化的,但是对于我们要提取匹配的结果来说就不是很方便了,因此就有了process模块。

    2.2 process模块

    用于处理备选答案有限的情况,返回模糊匹配的字符串和相似度。

    2.2.1 extract提取多条数据

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

    choices = [“河南省”, “郑州市”, “湖北省”, “武汉市”]
    process.extract(“郑州”, choices, limit=2)

    [(‘郑州市’, 90), (‘河南省’, 0)]

    extract之后的数据类型是列表,即使limit=1,最后还是列表,注意和下面extractOne的区别

    2.2.2 extractOne提取一条数据

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

    process.extractOne(“郑州”, choices)

    (‘郑州市’, 90)

    process.extractOne(“北京”, choices)

    (‘湖北省’, 45)

    1. 实战应用

    这里举两个实战应用的小例子,第一个是公司名称字段的模糊匹配,第二个是省市字段的模糊匹配

    3.1 公司名称字段模糊匹配

    数据及待匹配的数据样式如下:自己获取到的数据字段的名称很简洁,并不是公司的全称,因此需要进行两个字段的合并

    图片

    直接将代码封装为函数,主要是为了方便日后的调用,这里参数设置的比较详细,执行结果如下:

    图片

    3.1.1 参数讲解:

    ① 第一个参数df_1是自己获取的欲合并的左侧数据(这里是data变量);

    ② 第二个参数df_2是待匹配的欲合并的右侧数据(这里是company变量);

    ③ 第三个参数key1是df_1中要处理的字段名称(这里是data变量里的‘公司名称’字段)

    ④ 第四个参数key2是df_2中要匹配的字段名称(这里是company变量里的‘公司名称’字段)

    ⑤ 第五个参数threshold是设定提取结果匹配度的标准。注意这里就是对extractOne方法的完善,提取到的最大匹配度的结果并不一定是我们需要的,所以需要设定一个阈值来评判,这个值就为90,只有是大于等于90,这个匹配结果我们才可以接受

    ⑥ 第六个参数,默认参数就是只返回两个匹配成功的结果

    ⑦ 返回值:为df_1添加‘matches’字段后的新的DataFrame数据

    3.1.2 核心代码讲解

    第一部分代码如下,可以参考上面讲解process.extract方法,这里就是直接使用,所以返回的结果m就是列表中嵌套元祖的数据格式,样式为: [(‘郑州市’, 90), (‘河南省’, 0)],因此第一次写入到’matches’字段中的数据也就是这种格式

    注意,注意: 元祖中的第一个是匹配成功的字符串,第二个就是设置的threshold参数比对的数字对象

    s = df_2[key2].tolist()
    m = df_1[key1].apply(lambda x: process.extract(x, s, limit=limit))
    df_1[‘matches’] = m

    第二部分的核心代码如下,有了上面的梳理,明确了‘matches’字段中的数据类型,然后就是进行数据的提取了,需要处理的部分有两点需要注意的:

    ① 提取匹配成功的字符串,并对阈值小于90的数据填充空值

    ② 最后把数据添加到‘matches’字段

    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 ‘’)
    #要理解第一个‘matches’字段返回的数据类型是什么样子的,就不难理解这行代码了
    #参考一下这个格式:[(‘郑州市’, 90), (‘河南省’, 0)]
    df_1[‘matches’] = m2

    return df_1

    3.2 省份字段模糊匹配

    自己的数据和待匹配的数据背景介绍中已经有图片显示了,上面也已经封装了模糊匹配的函数,这里直接调用上面的函数,输入相应的参数即可,代码以及执行结果如下:

    图片

    数据处理完成,经过封装后的函数可以直接放在自己自定义的模块名文件下面,以后可以方便直接导入函数名即可,可以参考将自定义常用的一些函数封装成可以直接调用的模块方法。

    1. 全部函数代码

    #模糊匹配

    def fuzzy_merge(df_1, df_2, key1, key2, threshold=90, limit=2):
    “”"
    :param df_1: the left table to join
    :param df_2: the right table to join
    :param key1: key column of the left table
    :param key2: key column of the right table
    :param threshold: how close the matches should be to return a match, based on Levenshtein distance
    :param limit: the amount of matches that will get returned, these are sorted high to low
    :return: dataframe with boths keys and matches
    “”"
    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 fuzz
    from fuzzywuzzy import process

    df = fuzzy_merge(data, company, ‘公司名称’, ‘公司名称’, threshold=90)
    df

    展开全文
  • 今天小编就为大家分享一篇python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 3行实现模糊匹配

    千次阅读 2016-08-16 20:36:22
    python实现模糊查询
  • Python:利用原生函数count或正则表达式compile、findall、finditer实现匹配统计(包括模糊匹配的贪婪匹配、懒惰匹配) 目录 利用原生函数count或正则表达式compile、findall、finditer实现匹配统计(包括...
  • 原文链接:...经过一些改动,编辑距离同样可以用于子串的模糊匹配。 例子: 子串:“abc” 匹配对象:“c abba c
  • stuList = [ (‘201758709’,‘官方’,‘男’), (‘201750743’,‘公会’,‘男’), (‘201752322’,‘愚人节’,‘男’)] ... 谁知道这个要怎么做才能实现模糊的字符串匹配,例如输入官字,就会输出官方,求大神帮忙啊!
  • # 给定的字符串,希望能在数据库查到它的模糊匹配结果 keywd = "color ball pen" # 打开数据库连接 conn = create_engine('mysql+pymysql://username:password@192.168.2.xxx:3306/db??charset...
  • 主要介绍了使用Python完成公司名称和地址的模糊匹配实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 利用FuzzyWuzzy库匹配字符串1. 背景前言2. FuzzyWuzzy库介绍2.1 安装2.1 fuzz模块2.1.1 简单匹配(Ratio)2.1.2 非完全匹配(Partial Ratio)2.1.3 ... pandas实战应用3.1 公司名称字段模糊匹配3.1.1 参数讲解:3.1.2
  • Python 代码实现模糊查询 1、导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的文件名,并提供一个推荐列表供用户选择。 ...
  • Fuzzyset-用于python模糊字符串集。 Fuzzyset是一种数据结构,对数据执行类似于全文搜索的操作,以确定可能的拼写错误和近似的字符串匹配。 用法 用法很简单。 只需将一个字符串添加到集合中,然后使用.get或[]...
  • python调用mysql执行模糊匹配查询语句问题–已解决 在项目操作里,需要调用mysql查询数据库,根据返回的结果和请求返回结果字段做匹配判断 正常的模糊匹配语句是这样的: select * from table_a where date like ...
  • 10 行 Python 代码实现模糊查询/智能提示   1、导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的文件名,并提供一个推荐列表供...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 193
精华内容 77
关键字:

python实现模糊匹配

python 订阅