You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将超大文档词频嵌套字典转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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:23:26