Python 从非常大的文件中删除罕见的单词
给定一个非常大的文本文件,我想删除文件中只出现一次的所有单词。有什么简单有效的方法吗Python 从非常大的文件中删除罕见的单词,python,linux,file,unix,words,Python,Linux,File,Unix,Words,给定一个非常大的文本文件,我想删除文件中只出现一次的所有单词。有什么简单有效的方法吗 致以最诚挚的问候,如果没有具体的代码可供参考,很难知道,但一个好的开始位置可能是。如果没有具体的代码可供参考,很难知道,但是一个好的开始位置可能是。您必须对文件进行两次遍历: 在第1阶段: 使用单词作为键并将其出现次数作为值构建词典,即每次阅读单词时,在词典中为其值添加1 然后预处理列表以删除值大于1的所有键。这是你的黑名单 第二关: 再次通读该文件并删除黑名单中任何匹配的单词。 运行时间: 两次读取文件的线性
致以最诚挚的问候,如果没有具体的代码可供参考,很难知道,但一个好的开始位置可能是。如果没有具体的代码可供参考,很难知道,但是一个好的开始位置可能是。您必须对文件进行两次遍历: 在第1阶段: 使用单词作为键并将其出现次数作为值构建词典,即每次阅读单词时,在词典中为其值添加1 然后预处理列表以删除值大于1的所有键。这是你的黑名单 第二关: 再次通读该文件并删除黑名单中任何匹配的单词。 运行时间: 两次读取文件的线性时间。 需要O1才能将每个单词添加到字典中/在第1步中增加其值。 它需要将字典预处理到黑名单中。 需要O1才能在第2关中查找黑名单。
在复杂性方面您必须对文件进行两次遍历: 在第1阶段: 使用单词作为键并将其出现次数作为值构建词典,即每次阅读单词时,在词典中为其值添加1 然后预处理列表以删除值大于1的所有键。这是你的黑名单 第二关: 再次通读该文件并删除黑名单中任何匹配的单词。 运行时间: 两次读取文件的线性时间。 需要O1才能将每个单词添加到字典中/在第1步中增加其值。 它需要将字典预处理到黑名单中。 需要O1才能在第2关中查找黑名单。
在复杂性方面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次文件传递是绝对必要的。但是,如果稀有词确实稀有,那么您可以在第二遍跳过标记文件的大部分。首先,逐字遍历文件,并构建一个字典,其中包含一次遇到的单词的查找位置或两次遇到的单词的占位符值
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())
您可能需要进行更多的优化,例如使用块复制过程来节省内存开销,以及无编辑点的特殊情况。文件是否需要保持有序?列表是否已排序?nltk字数->一次获取所有单词->使用regext删除文件大小可能为GB,行数可能为数百万。输出文件不应包含任何频率为1的单词。换句话说,这些罕见的单词只是从文件中删除,其他所有内容都将保持不变。向您问好,文件是否需要保持有序?列表是否已排序?nltk字数->一次获取所有单词->使用regext删除文件大小可能为GB,行数可能为数百万。输出文件不应包含任何频率为1的单词。换句话说,这些罕见的单词只是从文件中删除,其他所有内容都将保持不变。请注意,文件大小可能为GB,行数可能为数百万。输出文件不应包含任何频率为1的单词。换句话说,这些罕见的单词只是从文件中删除,其他所有内容都将保持不变。我想@sampson chen的答案对你最合适。文件大小可能是GB,行数可能是几百万。输出文件不应包含任何频率为1的单词。换句话说,这些罕见的单词只是从文件中删除,其他所有内容都将保持不变。致以最良好的问候,我认为@sampson chen的答案对您最合适。第2步会再次通过文件,同样也会像第1步一样。字典操作是。@ovgolovin我相信如果键的数量足够大,它们就是Olog n;但是在这种情况下,如果我们假设一种自然语言,那么所有可能的有效单词集都将进行查找O1,因为这个集合是一个相对固定的数字。@sampson chen字典是用实现的。因此,没有理由将复杂性设置为Ologn。@sampson chen噢,没有打开,但O1.Pass 2会再次通过文件,因此也像Pass 1一样。字典操作是。@ovgolovin我相信它们是Olog n if number
钥匙的数量足够大;但是在这种情况下,如果我们假设一种自然语言,那么所有可能的有效单词集都将进行查找O1,因为这个集合是一个相对固定的数字。@sampson chen字典是用实现的。所以没有理由将复杂性设为Ologn。@sampson chen哦,不是开,而是O1。您还可以使用内存映射,然后使用seek删除单词。您还可以使用内存映射,然后使用seek删除单词。