【问题标题】:Handling Memory Error when dealing with really large number of words (>100 million) for LDA analysis处理大量单词(>1 亿)以进行 LDA 分析时处理内存错误
【发布时间】:2018-09-05 11:49:19
【问题描述】:

我有 50,000k 个文件 - 总共有 1.62 亿字。我想使用 Gensim 进行主题建模,类似于本教程here

因此,LDA 需要将文档标记为单词,然后创建词频词典。

所以,我将这些文件读入 pandas 数据框(“内容”列包含文本)并执行以下操作以创建文本列表。image of dataframe attached here

texts = [[word for word in row[1]['content'].lower().split() if word not in stopwords] for row in df.iterrows()]

但是,由于字数过多,我遇到了内存错误。

我还尝试了 Python 中的 TokenVectorizer。我也遇到了内存错误。

def simple_tokenizer(str_input):
    words = re.sub(r"[^A-Za-z0-9\-]", " ", str_input).lower().split()
    return words
vectorizer = TfidfVectorizer(use_idf=True, tokenizer=simple_tokenizer, stop_words='english')
X = vectorizer.fit_transform(df['content'])

我如何处理对这些非常长的文档进行标记化处理,以便进行 LDA 分析?

如果重要的话,我有一个 i7、16GB 台式机。

编辑

因为 Python 无法存储非常大的列表。我实际上重写了代码,读取每个文件(最初存储为 HTML),将其转换为文本,创建文本向量,将其附加到列表中,然后将其发送到 LDA 代码。成功了!

【问题讨论】:

  • 我认为 gensim 有一个在线 LDA 模型(:您应该为您提供编辑(也许还有更多细节)作为答案并接受它。顺便说一句,这样做是完全可以接受的,尽管我通常会等待也给别人一个机会。

标签: python out-of-memory gensim lda


【解决方案1】:

因此,LDA 需要将文档标记为单词,然后 创建词频词典。

如果您需要的唯一输出是包含字数的字典,我会执行以下操作:

在循环中一个一个地处理文件。这样,您只在内存中存储一​​个文件。处理它,然后转到下一个:

# for all files in your directory/directories:
with open(current_file, 'r') as f:
    for line in f:
        # your logic to update the dictionary with the word count

# here the file is closed and the loop moves to the next one

编辑:当谈到在内存中保存一个非常大的字典的问题时,您必须记住 Python 保留了大量内存来保持 dict 低密度 - 一个价格快速查找的可能性。因此,您必须寻找另一种存储键值对的方式,例如元组列表,但查找的成本会慢得多。 This question 就是这样,并在那里描述了一些不错的替代方案。

【讨论】:

  • 挑战在于,超过 10,000 个文件左右,更新后的字典本身就太大了。
猜你喜欢
  • 2013-11-24
  • 2011-02-08
  • 2014-06-11
  • 1970-01-01
  • 2017-07-15
  • 2011-12-08
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多