簡體   English   中英

在 pandas 中使用 Levenshtein 比較字符串時提高 Python 代碼性能

[英]Improving Python code performance when comparing strings using Levenshtein in pandas

我有這段代碼可以正常運行並產生我正在尋找的結果:

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 GB 內存的 32 個內核上使用 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')

它適用於作為單獨作業運行的較小文件,但文件太多而無法單獨完成。 有沒有辦法優化這段代碼或其他可能的解決方案?

數據是推文的集合,而只有一列被比較(大約 30 列中)。 它看起來像這樣:

ID 文本
11213 我要去電影院
23213 黑色是我最喜歡的顏色
35455 我和你一起去看電影
421323 我的朋友認為我是個好人。

似乎要求是將每個句子與其他句子進行比較。 鑒於這里的整體方法,我認為沒有一個好的答案。 您正在查看 n^2 比較。 隨着您的行數變大,整體處理需求很快就會變成怪物。

要弄清楚可行性,您可以運行一些較小的測試來計算該測試的 n^2 以獲得每秒評估行數指標。 然后為您想要做的大數據集計算 n^2 以了解所需的處理時間。 那是假設你的記憶可以處理它。 也許已經完成了處理 n^2 問題的工作。 可能想四處尋找類似的東西。

你做的工作是你需要做的兩倍多。 您將所有事物與所有事物進行兩次比較,並與自身進行比較。 但即便如此,當事情變大時,如果你只是進行組合,n(n-1)/2 仍然是可怕的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM