Python 在fuzzyfuzzy中传递多个参数

Python 在fuzzyfuzzy中传递多个参数,python,Python,我在9000多条记录的数据集上应用了模糊wuzzy函数 如图所示: def fuzzy(name, column): all = [] #fuzzy set set = process.extract(name, column, scorer=fuzz.token_set_ratio) for set_result in set: set_data = {} set_data['name'] = set_result[0

我在9000多条记录的数据集上应用了模糊wuzzy函数 如图所示:

def fuzzy(name, column):
    all = []     
    #fuzzy set 
    set = process.extract(name, column, scorer=fuzz.token_set_ratio)
    for set_result in set:
        set_data = {}
        set_data['name'] = set_result[0] 
        set_data['Matching Score'] = set_result[1]
        set_data['Function'] = "set" 
        all.append(set_data)
    return all  

     
#apply similrty  
def Get_all(name): 
    fuzzy_all= []
    fuzzy= fuzzy(name,table.Name)
    fuzzy2= fuzzy(soundex.encode_word(name),table["name_encoded"])
    fuzzy_all=fuzzy+fuzzy2
    return fuzzy_all
是否有一种方法可以改进函数并同时传递多个参数(
名称
),只调用fuzzy一次,这样fuzzy就不必多次访问整个数据集?

process.extract 首先,我将解释什么是
过程。extract
可以用于什么,以及可以传递给它的所有参数的含义,因为它经常被误用,这会对性能产生很大影响。在解释中,我将始终参考图书馆(我是作者)。Rapidfuzz实现了相同的字符串匹配算法,并且具有非常相似的接口(当它们有助于提高性能时,存在一些差异)

rapidfuzz中的
process.extract
具有以下接口:

def scorer(s1, s2, processor, score_cutoff)
提取(
查询
选择,
记分员=,
处理器=,
限值=5,
分数(截止值=0)
该函数用于在选项列表中查找查询的最佳匹配项

查询 query是要查找的字符串

选择 选项支持两种影响函数返回内容的输入

  • 具有方法
    项的类型。例如
    dicts
    pandas.Series
    在这种情况下,函数将比较映射到查询的所有值,并以[(,),…]的形式返回结果的排序列表。 例如,使用熊猫系列
    ,您将收到[(,),…]

  • 可编辑的任何类型,例如列表或生成器 在这种情况下,函数将把Iterable的所有值与查询进行比较,并以[(,),…]的形式返回结果的排序列表

  • 加工机 processor是一个函数,用于在比较查询和每个选项之前对其进行预处理。这可以是任何接受字符串作为参数并返回字符串的函数。 默认情况下,这是
    rapidfuzz.utils.default_process
    ,它将降低字符串的大小写,删除非字母数字字符,并删除字符串开头/结尾的空格

    记分员 scorer是用于将查询与每个选项进行比较的函数,需要以下界面:

    def scorer(s1, s2, processor, score_cutoff)
    
    s1和s2是两个字符串。处理器通常在
    进程中作为None传递。extract
    可停用预处理,因为这已在
    进程内完成。extract
    。Score_cutoff是两个字符串之间所需的最小相似性。如果未达到此相似性,则应返回0

    默认情况下,该记分器为
    fuzz.WRatio
    ,它将多个不同的比率组合在一起并对它们进行加权。其他可用得分手可在此处找到: 或者,您可以使用类似的接口创建自己的函数来执行比较

    分数线 如上所述,score_cutoff用于设置字符串匹配的最小相似性。低于此相似度的元素将不会添加到结果中。提供此参数有助于提高性能,因为它允许rapidfuzz使用更快的算法来比较字符串: 当未提供评分截止值时,rapidfuzz将始终使用具有O(N*M)运行时间的levenshtein距离。但是,当通过时,它将:

  • 比较两个字符串的长度,以确定是否可以在恒定时间内达到分数_截止值,如果无法达到,则返回0(分数至少与levenshtein距离一样高)
  • 它将计算O(N+M)时间内一个字符串中出现但另一个字符串中不出现的字符数,以确定是否可以达到分数截止值,如果不能,则提前退出(分数至少与levenshtein距离一样高)
  • 只有当它不能提前退出时,才计算levenshtein距离
  • 限度 使用此参数可以将结果量限制为
    选项中的
    限制
    最佳匹配。默认情况下,这是5,因此您将只获得5个最佳结果。通过设置
    limit=None
    您将获得所有结果,只要它们没有被
    score\u截止值过滤掉

    函数中最耗时的部分是调用
    process.extract

    extract(查询、选择、处理器=默认处理器、计分器=默认计分器、限制=5):
    
    改进性能的可能性 以下几点可能有助于您实现更好的绩效:

  • 您可能应该使用,因为它要快得多。这是因为我在C++中实现了所有的东西,而且很多模糊算法都可以得到很大的改进。
  • 您可以通过将
    processor=None
    传递到
    process.extract
    来取消对字符串的预处理。当您需要对数据进行预处理时,您可以提前执行一次,这样您就不必在调用
    Get\u all

  • 如上所述,提供
    分数\u截止值可以帮助提高性能

  • 最后一个选项是编写一个优化版本的
    process.extract
    。现在它计算通过的所有选择的分数。但是,在找到分数高于
    分数线的
    限制
    选项后,可以将
    分数线
    增加到结果中的最小分数。然而,这需要维护一个当前最佳结果的排序列表,因此它可能值得,也可能不值得。当您只对最佳结果
    过程感兴趣时。extractOne
    已经在使用此技术来改进运行时

  • 提取过程 我将首先解释一下什么是
    过程。extract
    可以用于什么,以及可以传递给它的所有参数的含义,因为它经常被误用,这会对