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
相关产品推荐
相关产品推荐

