Gensim 构建字典而不将所有文本加载到内存中

Posted

技术标签:

【中文标题】Gensim 构建字典而不将所有文本加载到内存中【英文标题】:Gensim Contruct the dictionary without loading all texts into memory gensim 【发布时间】:2018-08-24 22:49:37 【问题描述】:

我如何从多个文档构建字典而不是从一个文档('mycorpus.txt')构建字典(每个文档大小为 25 MB,文件大小为 10,000 个文件),请注意我正在尝试“在不将所有文本加载到内存的情况下构建字典”通过 gensim

>>> from gensim import corpora
>>> from six import iteritems
>>> dictionary = corpora.Dictionary(line.lower().split() for line in open('mycorpus.txt'))
>>> stop_ids = [dictionary.token2id[stopword] for stopword in stoplist
>>>             if stopword in dictionary.token2id]
>>> once_ids = [tokenid for tokenid, docfreq in iteritems(dictionary.dfs) if docfreq == 1]
>>> dictionary.filter_tokens(stop_ids + once_ids)  # remove stop words and words that appear only once
>>> dictionary.compactify()  # remove gaps in id sequence after words that were removed
>>> print(dictionary)

【问题讨论】:

【参考方案1】:

为此,您需要iterator。 取自the gensim webiste:

class MySentences(object):
    def __init__(self, dirname):
        self.dirname = dirname

    def __iter__(self):
        for fname in os.listdir(self.dirname):
            for line in open(os.path.join(self.dirname, fname)):
                yield line.lower().split()

sentences = MySentences('/some/directory') # a memory-friendly iterator

sentences 是一个iterator,它将在需要时打开每个文件,使用它然后销毁实例。所以在任何时候,内存中只有一个文件。

来自网站:

如果我们的输入分布在磁盘上的多个文件中,每行一个句子,那么我们可以逐个文件逐行处理输入文件,而不是将所有内容加载到内存列表中

要在您的情况下使用它,只需将您的 dictionary 行替换为:

dictionary = corpora.Dictionary(line for line in sentences)

其中sentences 是我们之前定义的变量,它给出了包含多个.txt 文件的文件夹的路径。

要了解更多关于迭代器、迭代器和生成器的信息,请查看this blog。

【讨论】:

以上是关于Gensim 构建字典而不将所有文本加载到内存中的主要内容,如果未能解决你的问题,请参考以下文章

如何逐行读取大型文本文件,而不将其加载到内存中?

如何处理来自大型 ResultSet 的数据而不将它们全部加载到内存中?

Android:旋转图像而不将其加载到内存中

合并大文件而不将整个文件加载到内存中?

如何使用 Java 裁剪图像而不将其加载到内存中

python 以块的形式读取文件而不将整个文件加载到内存中。