diff --git a/analyse.py b/analyse.py new file mode 100644 index 0000000..f9ec5c4 --- /dev/null +++ b/analyse.py @@ -0,0 +1,113 @@ +""" +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() # 执行主函数