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

Python中筛选词袋模型高频词并生成指定维度DataFrame

解决词袋模型词汇量过大导致DataFrame卡顿的问题

这问题我之前也碰到过!当词汇量爆炸的时候,直接把Counter列表转DataFrame确实会因为内存占用过高导致卡顿,核心思路是先全局筛选高频词汇,再基于这个缩小后的词汇表生成词袋,这样就能把列数控制在10000以内,具体实现步骤如下:

步骤1:全局统计所有词的出现频率,筛选Top10000词汇

首先我们需要遍历整个语料,统计所有词的全局出现次数,然后选出最频繁的10000个词作为目标词汇表。这样可以避免把所有出现过的词都作为DataFrame的列。

from collections import Counter
import pandas as pd
import string
from nltk.corpus import stopwords

# 初始化停用词和标点集合
stop_words = set(stopwords.words('english'))
punctuation = set(string.punctuation)

# 预处理语料并统计全局词频
global_counter = Counter()
clean_corpus = []  # 存储每个样本的清洗后词汇列表

for tokenized_text in corpus:
    # 清洗文本:转小写、移除标点和停用词
    clean_text = [tok.lower() for tok in tokenized_text if tok not in punctuation and tok not in stop_words]
    clean_corpus.append(clean_text)
    # 更新全局词频统计
    global_counter.update(clean_text)

# 获取出现频率最高的10000个词
top_10k_words = [word for word, _ in global_counter.most_common(10000)]
top_10k_set = set(top_10k_words)  # 转集合用于快速查找

步骤2:基于Top10000词汇生成每个样本的词袋

接下来,我们遍历每个清洗后的样本,只统计Top10000词汇的出现次数,缺失的词汇填0,这样每个样本的词袋都只有10000个维度。

bow_list = []
for clean_text in clean_corpus:
    # 统计当前样本的词频,但只保留Top10000内的词
    sample_counter = Counter(clean_text)
    # 构造当前样本的词袋字典:对每个Top词,取计数或0
    sample_bow = {word: sample_counter.get(word, 0) for word in top_10k_words}
    bow_list.append(sample_bow)

步骤3:转换为目标形状的DataFrame

最后把词袋列表转成DataFrame,此时列数正好是10000,行数等于样本数,不会再出现卡顿问题。

df_bows = pd.DataFrame(bow_list, columns=top_10k_words)
# 验证形状:应该是(num_samples, 10000)
print(df_bows.shape)

为什么这个方法有效?

原来的代码中,每个样本的Counter可能会引入新的词汇作为DataFrame的列,最终导致列数超过50000,内存占用急剧上升。而通过全局筛选高频词汇,我们把列数固定为10000,既保留了语料中最有信息量的词汇,又大幅降低了内存开销,解决了卡顿问题。

内容的提问来源于stack exchange,提问作者CrashingWater

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:27:10