""" analyse.py - 对弹幕进行读取、筛选、统计和保存的模块 """ from collections import Counter import pandas as pd def read_danmakus(filename): """ 从 Excel 文件中读取弹幕内容,并返回弹幕列表。 :param filename: Excel 文件名 :return: 弹幕内容列表 """ try: data_frame = pd.read_excel(filename) # 读取 Excel 文件 return data_frame['弹幕内容'].tolist() # 返回弹幕内容列的列表 except FileNotFoundError: print(f"文件 {filename} 未找到。") return [] except pd.errors.EmptyDataError: print(f"文件 {filename} 是空的。") return [] def filter_danmakus(danmakus, keywords): """ 根据关键词筛选弹幕内容。 :param danmakus: 弹幕内容列表 :param keywords: 关键词列表 :return: 筛选后的弹幕内容列表 """ # 根据关键词筛选弹幕 filtered_danmakus = [] # 存储筛选后的弹幕 for danmaku in danmakus: # 如果弹幕中包含任意一个关键词,则添加到筛选列表 if any(keyword in danmaku for keyword in keywords): filtered_danmakus.append(danmaku) return filtered_danmakus # 返回筛选后的弹幕列表 def count_danmakus(danmakus): """ 统计弹幕出现的频率。 :param danmakus: 弹幕内容列表 :return: 弹幕频率计数器 """ # 使用 Counter 统计弹幕出现频率 return Counter(danmakus) # 返回弹幕频率的计数器 def get_top_danmakus(counter, top_n=8): """ 获取出现频率最高的 N 条弹幕。 :param counter: 弹幕频率计数器 :param top_n: 需要返回的弹幕数量 :return: 出现频率最高的弹幕列表 """ # 获取出现频率最高的 N 个弹幕 return counter.most_common(top_n) # 返回出现频率最高的弹幕及其数量 def save_top_danmakus_to_excel(top_danmakus, output_filename): """ 将统计结果保存到 Excel 文件中。 :param top_danmakus: 频率最高的弹幕列表 :param output_filename: 输出文件名 """ try: # 将统计结果保存到 Excel 文件中 data_frame = pd.DataFrame(top_danmakus, columns=["弹幕内容", "数量"]) # 创建 DataFrame data_frame.to_excel(output_filename, index=False) # 保存到 Excel 文件 print(f"统计结果已保存到 {output_filename}") # 输出保存结果的提示信息 except FileNotFoundError: print(f"输出文件路径 {output_filename} 未找到,请检查路径是否正确。") except ValueError as value_error: print(f"数据转换错误: {value_error}. 请检查数据格式。") except PermissionError: print(f"没有权限写入文件 {output_filename}。请检查文件权限。") def main(): """ 主函数,执行弹幕读取、筛选、统计和保存结果的逻辑。 """ # 读取弹幕文件 input_filename = "all_danmakus.xlsx" # 输入文件名 danmakus = read_danmakus(input_filename) # 读取弹幕内容 if not danmakus: print("没有读取到任何弹幕内容。") return # 定义关键词列表 keywords = ["AI技术", "智能", "科技", "应用", "数据", "科学技术", "光影数字", "视觉"] # 筛选与关键词相关的弹幕 filtered_danmakus = filter_danmakus(danmakus, keywords) # 筛选相关弹幕 print(f"筛选出 {len(filtered_danmakus)} 条与关键词相关的弹幕。") # 输出筛选结果数量 # 统计弹幕 danmaku_counter = count_danmakus(filtered_danmakus) # 统计弹幕频率 # 获取排名前 8 的弹幕 top_danmakus = get_top_danmakus(danmaku_counter) # 获取频率最高的弹幕 # 输出统计结果 for content, count in top_danmakus: print(f"弹幕: {content}, 数量: {count}") # 输出每条弹幕及其出现次数 # 保存到 Excel output_filename = "top_danmakus.xlsx" # 输出文件名 save_top_danmakus_to_excel(top_danmakus, output_filename) # 保存结果到 Excel if __name__ == "__main__": main() # 执行主函数