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

