处理用于LDA分析的大量单词(> 1亿个)时的处理内存错误

时间:2018-09-05 11:49:19

标签: python out-of-memory gensim lda

我有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代码。奏效了!

1 个答案:

答案 0 :(得分:1)

  

因此,LDA要求先将文档标记为单词,然后   创建一个单词频率词典。

如果您唯一需要的输出是带有单词count的字典,我将执行以下操作:

一个循环处理文件。这样,您在内存中仅存储一个文件。处理它,然后移至下一个:

# 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就是关于这一点,并在那里描述了一些不错的选择。