我在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
是否有一种方法可以改进函数并同时传递多个参数(column
或name
),只调用fuzzy一次,这样fuzzy就不必多次访问整个数据集
提取过程
我将首先解释
process.extract
可以用于什么,以及可以传递给它的所有参数的含义,因为它经常被误用,这会对性能产生很大影响。在解释中,我将始终参考库rapidfuzz(我是作者)。Rapidfuzz实现了相同的字符串匹配算法,并且具有非常相似的接口(当它们有助于提高性能时,存在一些差异)rapidfuzz中的
process.extract
具有以下接口:该函数用于在选项列表中查找查询的最佳匹配项
质疑
query是要查找的字符串
选择
选项支持两种影响函数返回内容的输入
具有方法
items
的类型。例如dicts
或pandas.Series
在这种情况下,函数将比较映射到查询的所有值,并以[(<;value>;,<;score>;,<;key>;),…]的形式返回结果的排序列表。 例如,使用pandas.Series
您将收到[(<;value>;,<;score>;,<;index>;),…]可编辑的任何类型,例如列表或生成器 在这种情况下,函数将比较Iterable的所有值与查询,并以[(<;value>;,<;score>;),…]的形式返回结果的排序列表
处理机
processor是一个函数,用于在比较查询和每个选项之前对其进行预处理。这可以是任何接受字符串作为参数并返回字符串的函数。 默认情况下,这是
rapidfuzz.utils.default_process
,它将降低字符串的大小写,删除非字母数字字符,并删除字符串开头/结尾的空格记分员
scorer是用于将查询与每个选项进行比较的函数,需要以下界面:
s1和s2是两个字符串。处理器通常被
process.extract
作为None传递以停用预处理,因为这已经在process.extract
内完成。Score_cutoff是两个字符串之间所需的最小相似性。如果未达到此相似性,则应返回0默认情况下,这个记分器是
fuzz.WRatio
,它将多个不同的比率组合起来并对它们进行加权。其他可用的记分员可以在这里找到:scorer docs 或者,您可以使用类似的接口创建自己的函数来执行比较分数线
如上所述,score_cutoff用于设置字符串匹配的最小相似性。低于此相似度的元素将不会添加到结果中。提供此参数有助于提高性能,因为它允许rapidfuzz使用更快的算法来比较字符串: 当未提供评分截止值时,rapidfuzz将始终使用具有O(N*M)运行时间的levenshtein距离。但是,当通过时,它将:
极限
使用此参数可以将结果量限制为
choices
中的limit
最佳匹配。默认情况下,这是5,因此您将只获得5个最佳结果。通过设置limit=None
,您将获得所有结果,只要它们没有被score_cutoff
过滤掉函数中最耗时的部分是对
process.extract
的调用改进性能的可能性
有几件事可能会帮助你达成一个目标更好的性能:
您可能应该使用rapidfuzz,因为它要快得多。这是因为我在C++中实现了所有的东西,而且很多模糊算法都可以得到很大的改进。p>
您可以通过将
processor=None
传递给process.extract
来停用对字符串的预处理。当您需要对数据进行预处理时,您可以提前执行一次,这样您就不必在调用Get_all
时执行预处理如上所述,提供
score_cutoff
有助于提高性能最后一个选项是编写
process.extract
的优化版本。现在它计算通过的所有选择的分数。然而,在找到得分高于score_cutoff
的limit
选择后,有可能将score_cutoff
增加到结果中的最小得分。然而,这需要维护一个当前最佳结果的排序列表,因此它可能值得,也可能不值得。当您只对最佳结果感兴趣时process.extractOne
已经在使用此技术来改进运行时相关问题 更多 >
编程相关推荐