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

统计DataFrame中已分词内容的词频:求优化方案及修复方法

统计Pandas DataFrame中分词语列的词频:优化方案与问题修复

先来说说你遇到的方法1的问题——你用str(df.example)把整个Series转换成了一个大字符串,所以NLTK的FreqDist实际上在统计这个长字符串里每个字符的出现次数,而不是你想要的单词频率,这就是结果不对的原因。

修复方法1

要让NLTK正确统计单词频率,你需要先把所有行的分词列表展开成一个一维的单词序列,再传给FreqDist:

import nltk
from nltk.probability import FreqDist
# 展开所有分词列表,得到单个单词的迭代器
all_words = [word for sublist in df.example for word in sublist]
word_dist = nltk.FreqDist(all_words)
rslt = pd.DataFrame(word_dist.most_common(10), columns=['Word', 'Frequency'])

这样就能得到正确的单词频率统计了。

更简洁的Pandas原生方案

其实不用额外依赖NLTK,用Pandas内置的方法就能高效完成这个任务,代码更简洁,性能也更好(尤其是数据量大的时候):

# 把列表列拆分成每行一个单词,然后直接统计词频
word_freq_df = df['example'].explode().value_counts().reset_index()
word_freq_df.columns = ['Word', 'Frequency']

explode()会把每个列表里的元素拆成单独的行,接着value_counts()自动统计每个单词的出现次数,最后重置索引并修改列名就得到了规整的结果。

scikit-learn实现方案

如果你的工作流已经在使用scikit-learn,也可以用CountVectorizer来实现,只需要自定义一个简单的分词器(因为我们已经分好词了):

from sklearn.feature_extraction.text import CountVectorizer

# 自定义分词器,直接返回已有的分词列表
def dummy_tokenizer(doc):
    return doc

# 初始化CountVectorizer,跳过默认的文本预处理和分词步骤
vec = CountVectorizer(tokenizer=dummy_tokenizer, preprocessor=lambda x: x)
word_counts = vec.fit_transform(df['example'])

# 把统计结果转换成DataFrame并排序
word_freq_df = pd.DataFrame(
    word_counts.toarray().sum(axis=0),
    index=vec.get_feature_names_out(),
    columns=['Frequency']
).sort_values('Frequency', ascending=False)

这个方案的好处是可以无缝集成到scikit-learn的其他文本处理流程中(比如后续计算TF-IDF、训练模型等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:41:37