簡體   English   中英

在Python中快速進行多重搜索和替換

[英]Fast multiple search and replace in Python

對於單個大文本(約4GB),我需要搜索約100萬個短語並將其替換為補充短語。 原始文本和替換文本都可以輕松地存儲在內存中。 天真的解決方案從字面上看將需要數年才能完成,因為一次更換大約需要一分鍾。

天真的解決方案:

for search, replace in replacements.iteritems():
    text = text.replace(search, replace)

使用re.sub的regex方法要慢10 re.sub

for search, replace in replacements.iteritems():
    text = re.sub(search, replace, text)

無論如何,這似乎是使用Boyer-Moore弦線或Aho-Corasick的好地方; 但通常實現的這些方法僅用於搜索字符串,而不替換字符串。

另外,任何可以快速完成此操作的工具(Python之外)也將受到贊賞。

謝謝!

在python之外, sed通常用於這種事情。

例如(從此處獲取 ),將sue.txt文件中的ugly替換為beautiful:

sed -i 's/ugly/beautiful/g' /home/bruno/old-friends/sue.txt

您尚未發布任何代碼配置文件,應在進行任何過早的優化之前嘗試一些計時。 搜索和替換4GB文件的文本一項計算量大的操作。

替代要求:我應該完全這樣做嗎? -

您將在下面討論在10毫秒內完成整個搜索和替換Wikipedia語料庫的過程。 這聽起來像是很棒的設計,但會敲響一些警鍾。 除非有明顯的理由,否則您不應該修改用於顯示和/或加載以執行搜索和替換的任何代碼,因為正在加載/查看數據的子集。 您不太可能會對整個4GB的數據執行許多操作,因此將搜索和替換操作限制為實際正在處理的內容。 此外,您的時間安排仍然非常不精確,因為您不知道要處理的文件有多大。

最后一點,您注意到:

加速必須是算法,不能鏈接數百萬個sed調用

但是您指出您正在使用的數據是“單個大文本(〜4GB)”,因此,如果我正確理解您的意思,則不應該涉及任何更改。

更新:在下面您指示對〜4KB文件(我假設)執行操作需要90秒鍾,這對我來說似乎很奇怪-sed操作通常不需要花費任何時間。 如果文件實際上是4MB(我希望是),則需要24小時才能評估(不理想,但可能可以接受嗎?)

可能有比這更好的方法:

re.sub('|'.join(replacements), lambda match: replacements[match.group()], text)

這會進行一次搜索,但這不是非常有效的搜索。 re2模塊可能會大大加快速度。

我也有這個用例,我需要在Wikipedia全文上進行約100,000個搜索和替換操作。 使用sedawkperl將花費數年。 我找不到能進行搜索和替換的Aho-Corasick的任何實現,因此我編寫了自己的文件: fsed 該工具恰巧是用Python編寫的(因此,您可以根據需要破解代碼),但是它被打包為一個命令行工具,運行方式類似於sed

您可以通過以下方式獲得它:

pip install fsed

它們通常僅用於搜索字符串而不替換它

完美,這正是您所需要的。 在4G文本中使用無效算法進行搜索已經足夠糟糕,但是進行多次替換可能會更糟...您可能不得不移動數千兆字節的文本,以便為源文本和目標文本的大小差異導致的擴展/縮小留出空間。

只需找到位置,然后將零件與替換零件連接起來即可。

因此,一個愚蠢的類比是"_".join( "abc".split(" ") ) ,但是您當然不想像split那樣創建副本。

注意:是否有任何理由在python中執行此操作?

暫無
暫無

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

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