Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从非常大的文件中删除罕见的单词_Python_Linux_File_Unix_Words - Fatal编程技术网

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删除单词。