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

基于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))

解决方案

核心思路

  1. 从文件ID中提取年-月作为聚合维度
  2. 逐个文件统计目标词的出现次数
  3. 将同一月份下所有文件的目标词频次累加,用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:47:16