我有一个巨大的文字和一个单词列表~10K。 Python中用其他单词替换文本中所有这些单词的最快方法是什么?
编辑: 文字大小> 1Gb,文字是人为写的,“非常标记化”(任何字母数字字符和任何其他单个符号的分割都被分成新的标记)
多个单词> 10K,文本中的每个单词频率为1 替换词在所有替换中都是相同的。 Python 2.5-2.7
答案 0 :(得分:3)
输入格式和搜索/替换配对信息是必要的,以便在接近开始时改进这个答案,但这将是我最初的尝试(假设输入数据中有某种形式的规律性,空格分隔在我的示例代码如下)。
replacements = {
's1': 'r1',
's2': 'r2'
...
}
with open('input.txt') as fhi, open('output.txt', 'w') as fho:
for line in fhi:
words = line.split(' ')
fho.write(' '.join(map(lambda w: replacements.get(w, w), words))
# Or as a list comprehension from the comments.
fho.write(' '.join([replacements.get(w, w) for w in words]))
这里的想法是我们将数据从输入文件重定位到输出文件中。对于每一行的每个单词,我们检查它是否在我们的替换词典中。如果是,则检索新值,否则通过dict.get(key[, default])
方法返回未更改的单词。这可能不太理想,不处理标点符号,可能会在没有分成行等的输入文件上出现问题,但可能是一种入门方式。
答案 1 :(得分:1)
哇!这根本不是微不足道的。这是一个想法:
Step 1: Quantize the text into words, signs etc. The function quantize accepts text as an argument, the output is the list of words and signs. def quantize(text: str) -> list: ... An inverse function that can construct the a from a given list: def dequantize(lst: list) -> str: .... Step 2: Build a dictionary of quantized list, so that d_rep[word] = word Then, use the replacements word lists to transform this dictionary as follows: d_rep[word] = replacement Step 3: Go through every word in quantized list and replace it with a value from d_rep dictionary. It might be the original word or a replacement. Step 4: Dequantize the list and restore the text.
如果你有一个大文本和大量的搜索/替换单词,这应该是最佳的。祝好运!问,如果您有任何实施问题。
<强>更新强> 使用单个替换字,更容易,从'10K'单词列表创建一个集合,然后对于量化列表中的每个单词,如果集合中的单词,则替换该列表中的单词。
在伪python代码中:
qlist = quantize(text)
for i in range(0, len(qlist)):
word = qlist[i]
if word in wordlist_set:
qlist[i] = 'replacement'
text = dequantize(qlist)
答案 2 :(得分:0)
如果你有足够的内存,最快的方法可能是将文本作为字符串读取并使用正则表达式搜索并执行替换:
def replace(matched):
# Matched.group(0) is the word that was found
# Return the replacement
return "REPLACEMENT"
# The \b ensure that only whole words are matched.
text = re.sub(r"\b(%s)\b" % "|".join(words), replace, text)
如果您没有内存,请尝试以块的形式进行,也许:
# Read a chunk and a line to ensure that you're not truncating a word.
chunk = text_file.read(1024 ** 2) + text_file.readline()
答案 3 :(得分:0)
我建议采用一种简单的方法,一次更换一行:
pattern1 = 'foo'
pattern2 = 'bar'
with open('input.txt') as input, open('output.txt', 'w') as output:
for line in input:
output.write(line.replace(pattern1, pattern2))