从非常大的文件中删除罕见的单词

时间:2012-10-17 20:26:10

标签: python linux file unix words

给定一个非常大的文本文件,我想删除文件中只出现一次的所有单词。有没有简单有效的方法呢?

致以最诚挚的问候,

3 个答案:

答案 0 :(得分:7)

你必须在文件中进行2次传递:

在第1阶段:

  • 使用单词作为键及其出现次数构建字典(即每次读取单词时,在字典中将其值加1)
  • 然后预处理列表以删除值大于1的所有键。现在是您的“黑名单”

传球2:

  • 再次阅读该文件,删除黑名单中匹配的任何字词。

运行时:

  • 两次传递中读取文件的线性时间。
  • 将每个单词添加到字典中/在第1行中增加其值需要O(1)。
  • 将字典预处理到黑名单中需要O(n)。
  • 传递2中的黑名单查找需要O(1)。

O(n)复杂性

答案 1 :(得分:1)

2通过文件肯定是必要的。但是,如果罕见的单词真的很少见,那么您可以在第二遍中跳过对文件的大部分进行标记。首先逐字逐句传递文件并构建一个字典,其中包含遇到过的单词的找到位置或两次遇到的单词的占位符值。

MULTI_WORD = -1
word_locations = {}

for pos, word in tokenize(input_file):
    if word not in word_locations:
        word_locations[word] = pos
    else:
        word_locations[word] = MULTI_WORD

然后你可以过滤掉你需要编辑的位置,然后对其余部分进行简单的复制:

edit_points = [(pos, len(word)) for word, pos in word_locations.iteritems()
                                if pos != MULTI_WORD]

start_pos = 0
for end_pos, edit_length in edit_points:
    input_file.seek(start_pos)
    output_file.write(input_file.read(end_pos - start_pos))
    start_pos = end_pos + edit_length
input_file.seek(start_pos)
output_file.write(input_file.read())

您可能需要进行一些优化,例如以块为单位的复制过程来节省内存开销以及没有编辑点的特殊情况。

答案 2 :(得分:0)

如果没有特定的代码可以参考,很难知道,但一个好的起点可能是Natural Language Toolkit for Python