将超大文档词频嵌套字典转pd.DataFrame致Linux死机,求替代方案
超大文档-词频字典转DataFrame的高效方案
直接用pd.DataFrame.from_dict()处理8万+文档、50万+词汇的字典会导致内存爆炸,因为它会生成稠密矩阵——哪怕99%的元素都是0,也会占用全部内存空间(80000×500000=4e10个元素,完全超出常规机器内存)。解决核心是用稀疏数据结构只存储非零词频,具体步骤如下:
步骤1:将嵌套字典转换为三元组列表
先把每个文档的词频拆解成(文档ID, 词汇, 词频)的三元组,只保留有实际词频的条目,大幅降低内存占用:
from collections import Counter # 处理你的超大字典(示例仅作演示) my_dict = {"id1": Counter({'a': 1, 'b': 2, 'c': 3}), "id2": Counter({'a': 4, 'd': 9, 'e': 2})} data_tuples = [] for doc_id, word_counter in my_dict.items(): for word, count in word_counter.items(): data_tuples.append( (doc_id, word, count) )
步骤2:对文档ID和词汇做整数编码
稀疏矩阵需要用整数下标定位元素,用LabelEncoder把字符串类型的文档ID和词汇转换成连续整数:
import pandas as pd from sklearn.preprocessing import LabelEncoder # 拆分三元组的各个字段 doc_ids = [t[0] for t in data_tuples] words = [t[1] for t in data_tuples] counts = [t[2] for t in data_tuples] # 编码文档ID doc_encoder = LabelEncoder() doc_indices = doc_encoder.fit_transform(doc_ids) # 编码词汇 word_encoder = LabelEncoder() word_indices = word_encoder.fit_transform(words)
步骤3:构建稀疏矩阵并转换为DataFrame
用scipy.sparse.csr_matrix构建高效的稀疏矩阵,再转换成稀疏DataFrame(仅存储非零值):
from scipy.sparse import csr_matrix # 构建CSR稀疏矩阵(适合行切片操作,符合文档-词汇矩阵的使用场景) sparse_matrix = csr_matrix( (counts, (doc_indices, word_indices)), shape=(len(doc_encoder.classes_), len(word_encoder.classes_)) ) # 转换成稀疏DataFrame,保留原文档ID和词汇名作为索引/列名 sparse_df = pd.DataFrame.sparse.from_spmatrix( sparse_matrix, index=doc_encoder.classes_, columns=word_encoder.classes_ )
额外提示
如果你的后续任务是NLP建模(如文本分类、TF-IDF转换),可以直接使用csr_matrix作为输入——scikit-learn的绝大多数模型都支持稀疏矩阵,无需转换成DataFrame,能进一步节省内存。
内容的提问来源于stack exchange,提问作者Artem Tartakovskiy
相关产品推荐
相关产品推荐

