python - 列表性能中的Python模糊匹配字符串
问题描述
我正在检查 4 个相同的数据框列中是否有类似的结果(模糊匹配),并且我有以下代码作为示例。当我将它应用到真正的 40.000 行 x 4 列数据集时,它会一直在 eternum 中运行。问题是代码太慢了。例如,如果我将数据集限制为 10 个用户,计算需要 8 分钟,而计算需要 20、19 分钟。有什么我想念的吗?我不知道为什么要花那么长时间。我希望在 2 小时或更短的时间内获得所有结果。任何提示或帮助将不胜感激。
from fuzzywuzzy import process
dataframecolumn = ["apple","tb"]
compare = ["adfad","apple","asple","tab"]
Ratios = [process.extract(x,compare) for x in dataframecolumn]
result = list()
for ratio in Ratios:
for match in ratio:
if match[1] != 100:
result.append(match)
break
print (result)
输出:[('asple', 80), ('tab', 80)]
解决方案
主要的速度改进来自于编写矢量化操作和避免循环
导入必要的包
from fuzzywuzzy import fuzz
import pandas as pd
import numpy as np
从第一个列表创建数据框
dataframecolumn = pd.DataFrame(["apple","tb"])
dataframecolumn.columns = ['Match']
从第二个列表创建数据框
compare = pd.DataFrame(["adfad","apple","asple","tab"])
compare.columns = ['compare']
合并 - 通过引入键(自连接)的笛卡尔积
dataframecolumn['Key'] = 1
compare['Key'] = 1
combined_dataframe = dataframecolumn.merge(compare,on="Key",how="left")
combined_dataframe = combined_dataframe[~(combined_dataframe.Match==combined_dataframe.compare)]
矢量化
def partial_match(x,y):
return(fuzz.ratio(x,y))
partial_match_vector = np.vectorize(partial_match)
使用矢量化并通过在分数上设置阈值来获得所需的结果
combined_dataframe['score']=partial_match_vector(combined_dataframe['Match'],combined_dataframe['compare'])
combined_dataframe = combined_dataframe[combined_dataframe.score>=80]
结果
+--------+-----+--------+------+
| Match | Key | compare | score
+--------+-----+--------+------+
| apple | 1 | asple | 80
| tb | 1 | tab | 80
+--------+-----+--------+------+
推荐阅读
- javascript - Chrome / Safari firing click event at different times
- r - 如何在 R 中调整绘图类型 n 的“线”粗细
- postgresql - docker中的数据库连接超时
- java - 每次在 firebase DB 中更改数据时都会调用 onDataChange()
- java - 如何解决原因:java.lang.ClassNotFoundException: javax.xml.bind.JAXBException 迁移到 Java 11(Openjdk-11.0.1)
- sql - 如何从两个不同的源表在单个表中插入值
- google-bigquery - BigQuery ML 无法识别数据中的标签列
- mysql - 从不同表中划分 2 个值的问题
- java - 将项目添加到文本文件
- sql - 是否有任何更快、更少资源消耗的查询用于相同目的?