在大文本文件中替换一组单词

问题描述 投票:0回答:1

我有一个大的txt文件(大约20GB),我想替换此大文件中的单词列表的所有实例。我正在努力寻找一种优化此代码的方法。这导致我长时间处理此文件。

我可以改善什么?

    corpus_input =  open(corpus_in,"rt")
    corpus_out = open(corpus_out,"wt")
    for line in corpus_input:
        temp_str=line
        for word in dict_keys:
            if word in line:
                new_word = word+"_lauren_ipsum"
                temp_str = re.sub(fr'\b{word}\b',new_word,temp_str)

            else:
                continue
        
        corpus_out.writelines(temp_str)

     corpus_input.close()
     corpus_out.close()
python optimization nlp bigdata
1个回答
0
投票

最重要的优化是了解,到底什么表现不佳。然后,您可以看到可以优化的内容。

例如,如果读写花费了99%的时间,那么优化数据处理就不值得了。即使您可以将处理速度提高10倍,如果阅读消耗了99%,您也只会获得0.9%的收益]

我建议测量和比较某些版本,并发布性能差异。这可能会导致潜在的进一步建议得到优化。

在以下所有示例中,我都将writelines替换为write

1。)只是阅读和写作

with open(corpus_in,"rt") as corpus_input, open(corpus_out,"wt")
 as corpus_out:
   for line in corpus_input:
       corpus_out.write(line)

2。)只是阅读和写作具有更大的缓冲区

import io

BUF_SIZE = 10 * io.DEFAULT_BUFFER_SIZE # try other buffer sizes if you see an impact
with open(corpus_in,"rt"m BUF_SIZE) as corpus_input, open(corpus_out,"wt", BUF_SIZE)
 as corpus_out:
   for line in corpus_input:
corpus_out.write(line)

3。)将搜索正则表达式和替换生成移出循环。

   rules = []
   for word in dict_keys:
       rules.append((re.compile(fr'\b{word}\b'), word + "_lorem_ipsum"))

   for line in corpus_input:
       for regexp, new_word in rules: 
           line = regexp.sub(new_word, line)
       corpus_out.write(line)

4。)如果您真的总是用word + "_lorem_ipsum"替换,则将正则表达式合并为一个

   words = "|".join(dict_keys)
   regexp = re.compile(fr'\b({"|".join(dict_keys)})\b')

   for line in corpus_input:
       line = regexp.sub("\1_lorem_ipsum", line)
       corpus_out.write(line)

5)如果要替换的单词不同,您仍然可以尝试组合正则表达式并使用函数进行替换

   replace_table = {
      "word1": "word1_laram_apsam",
      "word2": "word2_lerem_epsem",
      "word3": "word3_lorom_opsom",

   }

   def repl(match):
      return replace_table[match.group(1)]

   regexp = re.compile(fr'\b({"|".join(dict_keys)})\b')

   for line in corpus_input:
       line = regexp.sub(repl, line)
       corpus_out.write(line)
© www.soinside.com 2019 - 2024. All rights reserved.