You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
4.2 KiB

"""
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() # 执行主函数