Python:在大文本中替换单词

Python:在大文本中替换单词,python,text,replace,Python,Text,Replace,我有一个巨大的文本和一个单词列表~10K。 Python中用其他单词替换文本中所有这些单词的最快方法是什么 编辑: 文本大小>1Gb,文本是人工书写的,并且“非常标记化”(任何字母数字字符和任何其他单个符号都被拆分为新的标记) 单词数>10K,文本中每个单词的频率为1 替换词在所有替换中都是相同的。 Python2.5-2.7输入格式和搜索/替换对信息对于精炼这个答案是必要的,如果它接近于开始的话,但这将是我的第一次尝试(假设输入数据中有某种形式的规则性,下面的示例代码中用空格分隔) 这里的想法

我有一个巨大的文本和一个单词列表~10K。 Python中用其他单词替换文本中所有这些单词的最快方法是什么

编辑: 文本大小>1Gb,文本是人工书写的,并且“非常标记化”(任何字母数字字符和任何其他单个符号都被拆分为新的标记)

单词数>10K,文本中每个单词的频率为1 替换词在所有替换中都是相同的。
Python2.5-2.7

输入格式和搜索/替换对信息对于精炼这个答案是必要的,如果它接近于开始的话,但这将是我的第一次尝试(假设输入数据中有某种形式的规则性,下面的示例代码中用空格分隔)


这里的想法是将数据从输入文件重新定位到输出文件中。对于每行的每一个单词,我们检查它是否在我们的替换词典中。我们检索新值(如果是),或者通过
dict.get(key[,default])
方法返回未更改的单词。这可能不太理想,不能处理标点符号,可能会在输入文件中遇到问题,但可能是一种开始的方法。

输入格式和搜索/替换配对信息对于完善这个答案是必要的,如果它接近开始,但这将是我的第一次尝试(假设输入数据中存在某种形式的规则性,下面的示例代码中用空格分隔)


这里的想法是,我们将把数据从输入文件重新定位到输出文件中。对于每行的每个单词,我们检查它是否在替换字典中。如果是,我们检索新值,或者通过
dict.get(键[,默认])返回未更改的单词
方法。这可能不理想,不处理标点符号,可能会在输入文件中遇到问题,但可能是一种开始的方法。

哇!这一点不简单。以下是一个想法:

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.
哇!这一点都不微不足道。这里有一个想法:

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.
如果您有足够的内存,最快的方法可能是将文本作为字符串读取,然后使用正则表达式搜索并执行替换:

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()

如果您有足够的内存,最快的方法可能是将文本作为字符串读取,然后使用正则表达式搜索并执行替换:

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()

我建议一种简单的方法,一次替换一行:

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))

我建议一种简单的方法,一次替换一行:

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))


您的意思是列表中有10000个单词,还是文本的大小为10000字节?单词列表还是文本更大?文本大小>1Gb,单词数>10K。python的哪个版本?每个搜索词是否对应一个替换词,或者您是否用相同的替换词替换所有搜索词?文本的“规则性”如何o以“空格分隔、标点符号、变量”开始,文本由人类书写,并且“非常标记化”(任何字母数字字符和任何其他单个符号被拆分为新的标记);文本中的每个单词频率为1替换词在所有替换中都是相同的。Python 2.5-2.7您的意思是列表中有10000个单词,还是文本的大小为10000字节?哪个更大,单词列表还是文本?文本大小>1Gb,单词数>10K。Python的哪个版本?每个搜索词是否对应一个替换词,还是用相同的替换词替换所有搜索词?文本开头的“规则性”如何?空格分隔、标点符号、变量?文本是人工书写的,并且“非常标记化”(任何字母数字字符和任何其他单个符号被拆分为新标记);文本中的每个单词频率为1,替换词在所有替换中都是相同的。Python 2.5-2.7注意,我利用了支持多个文件的
的2.7语法。如果使用2.5或2.6,则必须嵌套语句才能处理两个文件(或创建一个处理多个文件的自定义上下文管理器)。谢谢,您的解决方案“”。在我的情况下,join(map(lambda w:replacements.get(w,w,words))非常快(加载内存中的所有数据+非常标记化的文本).@Alex-很高兴能提供帮助。如果你找到了一种有效的方法,确保人们不会继续试图为你解决问题,那么一定要标记一个答案。:)这在性能上与列表理解相比如何?out.write(“”.join([replacements.get(w,w)for w in line.split())@DashTreader-列表理解速度可能会更快,这是绝对可能的。我将更新答案,将其作为备选答案。谢谢!注意,我已经利用了支持多个文件的
的2.7语法。如果您使用的是2.5或2.6,则必须嵌套语句才能处理两个文件文件(或创建一个处理多个文件的自定义上下文管理器)。谢谢,您的解决方案“”。在我的情况下,join(map(lambda w:replacements.get(w,w,words))非常快(加载内存中的所有数据+非常标记化的文本).@Alex-很高兴能提供帮助。如果你找到了一种有效的方法,确保人们不会继续试图为你解决问题,那么一定要标记一个答案。:)这在性能上与列表理解相比如何?out.write(“”.join([replacements.get(w,w)for w in line.split())@DaskerTreader-列表理解可能会快一点,这是绝对可能的。我将更新答案,将其作为备选答案。谢谢!我遇到一个错误:OverflowerError:正则表达式代码大小超出限制PyPI上有一个正则表达式实现,应该能够处理它。我遇到一个错误:OverflowerError:regular表达式代码大小超出了限制PyPI上有一个正则表达式实现,应该能够处理它。