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