在pandas中使用Levenshtein比较字符串时提高Python代码的性能



我有这个代码正常运行,并产生我正在寻找的结果:

from thefuzz import fuzz
import pandas as pd
df = pd.read_csv('/folder/folder/2011_05-rc.csv', dtype=str, lineterminator='n')
df_compare = pd.DataFrame(
df['text'].apply(lambda row: [fuzz.partial_ratio(x, row) for x in df['text']]).to_list())
for i in df_compare.index:
for j in df_compare.columns[i:]:
df_compare.iloc[i, j] = 0
df[df_compare.max(axis=1) < 75].to_csv('/folder/folder/2011_05-ready.csv', index=False)
print('Done did')

然而,由于字符串比较是一个非常昂贵的操作,脚本非常慢,只能在5000-7000行相对较小的CSV文件上工作。任何大的(超过12MB)都需要几天的时间才能抛出与内存相关的错误消息。我尝试在32核32 gb内存的modin上运行它,但它没有改变任何东西,我最终得到了相同的结果。

import glob
from thefuzz import fuzz
import modin.pandas as pd
files = glob.glob('/folder/folder/2013/*.csv')
for file in files:
df = pd.read_csv(file, dtype=str, lineterminator='n')
f_compare = pd.DataFrame(
df['text'].apply(lambda row: [fuzz.partial_ratio(x, row) for x in df['text']]).to_list())
for i in df_compare.index:
for j in df_compare.columns[i:]:
df_compare.iloc[i, j] = 0
df[df_compare.max(axis=1) < 75].to_csv(f'{file[:-4]}-done.csv', index=False)
print(f'{file} has been done')

它可以将较小的文件作为单独的作业运行,但是文件太多,无法单独完成。是否有一种方法来优化这段代码或其他可能的解决方案?

数据是tweet的集合,而只比较一列(大约30列)。它看起来像这样:

似乎要求将每个句子与其他句子进行比较。考虑到这里的总体方法,我认为没有一个好的答案。你要做n^2次比较。当您的行数变大时,整个处理需求很快就会变成一个怪物。

要弄清楚可行性,您可以运行一些较小的测试,计算该测试的n^2,以获得每秒评估行数的度量。然后计算n^2对于你想要做的大数据集来得到所需的处理时间的概念。这是假设你的记忆可以处理它。也许在处理n^2的问题上做了一些功。也许你应该找找这样的东西

你做的工作是你需要做的两倍多。你把每件事都和其他事做两次比较,再和它本身做一次比较。但即使当事情变得很大,如果你只是做组合,n(n-1)/2仍然是可怕的。

最新更新