基于NLTK ConditionalFreqDist实现按月份聚合词频的技术求助
基于NLTK ConditionalFreqDist实现按月份聚合的词频统计问题
需求说明
- 统计每个语料库文件中
Apple、Microsoft这两个目标词的出现频率 - 展示目标词的频次数据
- 基于文件ID中的日期信息,按月份聚合词频(不显示单个文档的词频,只展示月度汇总结果)
文件ID格式示例:2024-10-23 TitleName,多个文件可能共享同一日期。
当前问题
你编写的代码返回的是对应年月下所有文件ID的总长度,而非目标词的聚合词频,代码如下:
cfd = ConditionalFreqDist( (target, file) for target in ['Apple','Microsoft'] for file in corpus.fileids() for word in corpus.words(file))
解决方案
核心思路
- 从文件ID中提取
年-月作为聚合维度 - 逐个文件统计目标词的出现次数
- 将同一月份下所有文件的目标词频次累加,用ConditionalFreqDist存储(条件为目标词,事件为年月)
修正后的代码
from nltk import ConditionalFreqDist # 定义需要统计的目标词 target_words = ['Apple', 'Microsoft'] # 准备构建CFD的数据源 cfd_entries = [] for file_id in corpus.fileids(): # 从文件ID中提取年月:拆分日期部分,取年和月 date_segment = file_id.split()[0] year_month = '-'.join(date_segment.split('-')[:2]) # 获取当前文件的所有词 file_words = corpus.words(file_id) # 统计每个目标词在当前文件中的出现次数 for word in target_words: word_count = file_words.count(word) # 只有当词出现过,才生成对应条目(CFD通过计数条目重复次数来统计频次) if word_count > 0: cfd_entries.extend([(word, year_month)] * word_count) # 构建条件频率分布 cfd = ConditionalFreqDist(cfd_entries)
结果展示
可以通过以下代码查看或可视化聚合后的词频:
# 打印Apple的月度词频 print("Apple 月度词频统计:") for month in cfd['Apple']: print(f"{month}: {cfd['Apple'][month]}") # 打印Microsoft的月度词频 print("\nMicrosoft 月度词频统计:") for month in cfd['Microsoft']: print(f"{month}: {cfd['Microsoft'][month]}") # 生成可视化图表(需要matplotlib支持) cfd.plot()
代码说明
- 原代码的问题在于循环逻辑错误:遍历所有词时,不管是否是目标词都会生成
(target, file)元组,导致统计的是文件的总词数而非目标词的频次 - 修正后的代码先单独统计每个文件中目标词的出现次数,再将次数转化为CFD需要的重复条目,确保统计的是目标词的实际出现频次
- 通过提取
年-月作为事件维度,实现了按月份聚合的需求
内容的提问来源于stack exchange,提问作者kynik0s
相关产品推荐
相关产品推荐

