[英]Handling Memory Error when dealing with really large number of words (>100 million) for LDA analysis
我有 50,000k 文件 - 总共有 1.62 亿字。 我想在这里使用类似于本教程的 Gensim 进行主题建模
因此,LDA 需要将文档标记为单词,然后创建一个词频词典。
因此,我将这些文件读入了 Pandas 数据框(“内容”列包含文本)并执行以下操作以创建文本列表。 附在此处的数据框图像
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 代码。 有效!
因此,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
低密度 - 这是快速查找可能性的代价。 因此,您必须搜索另一种存储键值对的方法,例如元组列表,但查找的成本会慢得多。 这个问题是关于那个的,并且在那里描述了一些不错的替代方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.