针对社交媒体谣言识别准确率不足的问题,本研究设计并实现了一个基于Flask框架和图神经网络的谣言检测系统。系统通过分析微博传播数据的转发关系构建传播网络图,提取节点数量、传播深度、时间跨度等结构特征,采用图注意力网络(GAT)模型进行自动分类。使用中文谣言数据集进行训练和测试,实验结果显示系统准确率达到90.3%,相比随机森林、LSTM等传统方法提升约9%-12%。研究验证了传播网络特征对谣言识别的重要性,其中传播深度、时间跨度和网络密度等指标具有较强区分度。系统通过Flask框架实现前后端交互,提供数据上传、结果展示和传播网络可视化功能。不足之处在于处理超大规模传播数据时响应速度下降,未来可通过模型轻量化改进。该成果为社交媒体内容监管提供了一种新思路,具有实际应用价值。
关键字:Flask框架;图神经网络;谣言检测;图注意力网络
2.4 传播树构建
传播树构建是从原始微博数据生成图结构的关键步骤。系统根据每条微博的parent字段判断转发关系,例如当用户A转发用户B的微博时,B的微博作为父节点,A的微博作为子节点连接到树上。使用NetworkX库提供的图结构对象,可以方便地通过add_node和add_edge方法逐步搭建传播网络。每个节点存储微博ID、发布时间等原始信息,边则默认不附加属性,仅表示转发行为的连接方向。这种设计既保留了完整的传播路径信息,又避免了复杂的数据结构设计。
具体实现时需要解决两个主要问题。首先是节点标识问题,原始数据中的微博ID(mid)是字符串类型,直接作为节点索引会导致效率低下。系统采用自动编号机制,将每个mid映射为整数索引,例如用字典mid_to_index保存映射关系。其次是孤儿节点处理,部分转发数据可能缺失父节点信息,系统采取忽略策略,仅保留有效连接关系。构建过程中采用两阶段处理:第一阶段遍历所有数据创建节点并建立映射表,第二阶段再次遍历数据,根据parent字段查找已存在的父节点并添加边。这种方式虽然需要两次遍历,但避免了动态修改映射表导致的逻辑混乱。
4.1 系统架构设计
系统采用前后端分离的架构模式,由用户界面、业务逻辑和数据处理三部分组成。前端使用HTML+CSS搭建基础页面,通过JavaScript实现文件上传和结果展示功能。后端基于Flask框架开发,包含四个核心服务模块:数据接收模块处理用户上传的JSON文件或文本输入,格式校验通过后触发解析流程;图构建模块调用NetworkX库生成传播树,记录节点属性和边关系;特征计算模块遍历图结构提取八类数值特征,转换为模型输入格式;预测模块加载预训练好的GAT模型进行分类,结果通过模板引擎渲染到前端页面。各模块通过函数调用串联,数据以字典或张量格式在模块间传递,整体形成线性处理流程。
4.2数据处理模块设计
数据处理模块负责对原始社交媒体数据进行规范化处理,为后续传播树构建和模型训练提供标准化输入。该模块分为数据加载、数据清洗、数据存储三个部分。
1 数据加载流程
系统通过读取JSON格式的微博传播数据文件,解析其中的关键字段。数据加载过程中需处理以下内容:
(1)字段提取:从JSON文件中提取每条微博的ID(mid)、用户ID(uid)、文本内容(text)、发布时间(date)及转发关系(parent)。
(2)异常处理:对缺失字段或格式错误的数据进行自动填充或剔除。例如,若某条微博缺少mid字段,则直接跳过该数据并记录错误日志。
(3)数据缓存:将解析后的数据临时存储为Python字典格式,便于后续处理。
核心代码如下:
def load_data(file_path):
data_list = []
try:
with open(file_path, 'r', encoding='utf-8') as f:
raw_data = json.load(f)
for item in raw_data:
# 提取必要字段,缺失时填充默认值
mid = item.get('mid', 'unknown_mid')
parent = item.get('parent', '')
data_list.append({
'mid': mid,
'uid': item.get('uid', 'unknown_uid'),
'text': item.get('text', ''),
'date': item.get('date', '1970-01-01'),
'parent': parent
})
return data_list
except Exception as e:
print(f"数据加载失败:{str(e)}")
return []
2.数据清洗规则
为保证数据质量,系统采用以下清洗规则:
(1)去重处理:根据mid字段去除重复微博数据。
(2)时间格式化:将非标准时间字符串(如2023年12月31日)转换为统一格式(2023-12-31)。
(3)无效内容过滤:剔除文本内容为空或仅包含特殊符号(如“转发微博”)的数据。
4.3传播树构建模块设计
传播树构建模块将清洗后的数据转换为图结构,反映微博信息的传播路径。该模块包含传播树结构定义、节点关系映射、特征计算三个核心功能。
1 传播树结构设计
传播树以有向图形式表示,节点代表单条微博,边表示转发关系,具体规则如下:
(1)根节点识别:无parent字段的微博视为原创内容,作为传播树的根节点。
(2)子节点连接:若微博A的parent字段指向微博B的mid,则添加一条从B到A的有向边。
(3)节点属性:每个节点存储mid、uid、text、date等原始信息。
核心代码如下:
def build_tree(data_list):
graph = nx.DiGraph()
mid_to_node = {}# 映射微博ID到节点编号
# 添加所有节点
for idx, item in enumerate(data_list):
mid = item['mid']
mid_to_node[mid] = idx
graph.add_node(idx, **item)
# 添加边
for idx, item in enumerate(data_list):
parent_mid = item['parent']
if parent_mid in mid_to_node:
parent_idx = mid_to_node[parent_mid]
graph.add_edge(parent_idx, idx)
return graph
2.特征提取方法
系统从传播树中提取8类结构特征,用于描述信息传播模式特征计算逻辑如下:
(1)基础统计:直接计算节点数、边数、最大深度等。
(2)复杂指标:通过图算法计算聚类系数、连通分量数等。
表4-1 传播树特征列表
特征名称
计算方式
示例值
节点数量
图中所有节点的总数
45
最大深度
根节点到最远子节点的路径长度
6
平均转发速度
时间跨度 / 节点数量
0.75 h
特征计算代码核心部分如下:
def calc_max_depth(graph):
root_nodes = [n for n in graph.nodes if graph.in_degree(n) == 0]
max_depth = 0
for root in root_nodes:
depths = nx.single_source_shortest_path_length(graph, root)
max_depth = max(max_depth, max(depths.values()))
return max_depth
5.1谣言检测
谣言检测系统代码运行后,访问端口,进入检测界面,该界面的主要作用便是上传微博传播数据,AI将分析其是否为谣言。通过上传JSON格式的微博传播数据,文件应包含微博ID、用户ID、文本内容、日期和转发关系等信息。点击开始检测。下方检测结果DIV中便会展示该文件的检测结果。如下图5-1所示:
图5-1 谣言检测界面图
5.2文件选择
点击选择文件,弹出文件选择的界面窗口,窗口访问系统的文件系统,选择相应的JSON文件进行检测。如下图5-2所示:
图5-2 文件选择界面图
5.3文本检测
下方文本框中,可直接输入JSON格式的微博传播数据进行检测。输入数据后,点击使用文本数据检测。检测结果框中也会生成检测结果。最下方的使用说明栏中介绍描述输入数据的格式要求和关于模型介绍。如下图5-3所示:
图5-3 文本检测界面图