给定一个非常大的文本文件,我想删除文件中只出现一次的所有单词。有没有简单有效的方法呢?
致以最诚挚的问候,
答案 0 :(得分:7)
你必须在文件中进行2次传递:
在第1阶段:
传球2:
运行时:
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。