计算机毕业设计Python+Spark知识图谱微博预警系统 微博推荐系统 微博可视化 微博数据分析 微博大数据 微博爬虫 微博预测系统 大数据毕业设计

课题名称

基于Bert模型对微博的言论情感分析设计与实现 

课题来源

课题类型

BY

指导教师

学生姓名

专    业

计算机科学与技术

学    号

开题报告内容:(调研资料的准备,设计/论文的目的、要求、思路与预期成果;任务完成的阶段内容及时间安排;完成设计所具备的条件因素等。)

一、选题背景   

   互联网技术的高速发展和人们在社交媒体上的活跃群体数量日益增加,人们已经习惯于采用社交媒体平台来创建各种话题进行讨论,最终形成海量的数据。其中,以新浪微博为主的社交媒体平台每天都产生大量的文本信息,用户在平台上的大量交互,使得部分文本中蕴含的观点在互联网上广泛传播。一些负面的,甚至是有害的信息若长期存在于网络且被广泛传播,这对网络空间生态的影响不言而喻,因此需要进行文本情感分类分析。当前,情感分析的研究主要是微博文本[1]、外卖评论[2]、中文新闻文本[3]等方面,情感分析对于深入探究社会问题,提高社会满意度方面也具有重要意义。本研究利用BERT自注意力的优点,将BERT当作embedding接入到CNN模型,进行微博文本情感分类,并在同一个数据集进行训练和验证,最后将各个模型的指标进行比较。

二、设计目的和要求

设计目的:

  • 情感分析:对微博上的文本进行情感分析,判断其是正面、负面还是中性的情感。这有助于了解公众对某些话题或事件的态度和情绪。
  • 话题监控:实时监测微博上的热门话题,分析其情感倾向,以把握舆论动态。
  • 危机预警:对于负面情感聚集的话题,可以进行预警,以便及时采取应对措施。
  • 市场调研:分析消费者对产品的反馈情感,为企业提供市场策略依据。
  • 社交网络研究:从情感角度深入了解社交网络中的信息传播模式和用户行为。

设计要求:

  • 实时性:系统应能实时处理大量的微博数据,提供实时的情感分析结果。
  • 准确性:情感分析的结果应尽量准确,减少误判。
  • 可扩展性:考虑到微博内容的多样性,系统应具备可扩展性,能够适应不断变化的语料库。
  • 易用性:对于非技术人员,系统应提供友好的用户界面,便于查看和分析结果。
  • 可复用性:设计的模型和方法应具有一定的通用性,不仅适用于微博,也可应用于其他社交媒体平台。
  • 数据安全与隐私保护:在处理用户数据时,应确保数据的安全性和用户的隐私不受侵犯。
  • 反馈机制:系统应提供反馈接口,允许用户对情感分析结果进行标注和修正,以不断优化模型。
  • 通过以上目的和要求,设计并实现一个基于Bert模型的微博言论情感分析系统将有助于多方面的应用和研究。

三、设计内容和思路

设计内容:

  • 数据收集:收集一定时间范围内的微博数据,包括文本内容和相关的标签或分类信息。
  • 预处理:对收集到的微博数据进行清洗和预处理,包括去除无关字符、停用词过滤、词干提取等。
  • 模型选择与训练:选择BERT模型作为基础模型,根据需求调整模型架构和参数。利用处理后的微博数据对模型进行训练,使其能够识别出正面、负面和中性的情感。
  • 特征提取:利用BERT模型提取微博文本的特征,这有助于更准确地判断其情感倾向。
  • 情感分类:基于提取的特征,使用分类器对微博文本进行情感分类。
  • 后处理与展示:对分类结果进行后处理,如统计不同情感的占比、生成情感热力图等。通过友好的界面展示分析结果,便于用户查看和分析。
  • 模型优化与迭代:根据实际应用中的反馈,持续优化模型以提高准确率。

设计思路:

  • 深入理解BERT模型:为了更好地应用BERT模型,需要深入了解其工作原理和特点。
  • 对比实验:为了验证BERT模型在微博情感分析中的效果,可与其他常见模型进行对比实验,如LSTM、CNN等。
  • 特征融合:考虑将BERT提取的文本特征与其他手工设计的特征或外部知识图谱进行融合,以提高分类准确率。
  • 多任务学习:考虑使用多任务学习的方法,使模型在情感分类的同时也能处理其他相关任务,如主题分类、关键词提取等。
  • 持续学习与更新:由于微博内容经常更新,考虑设计一个持续学习的机制,使模型能够不断适应新的数据分布。
  • 可解释性研究:为了更好地理解模型的决策过程,可以研究BERT模型的可解释性,从而增强用户对系统的信任度。

四、预期成果

1编写系统源代码;

2毕业设计说明书

五、设计时间安排

第1周:查阅相关资料,完成文献综述。

第2周:结合课题要求,提交开题报告,并完成开题答辩。

第3~5周:进行系统分析、总体设计和详细设计。

第6~9周:实现系统编码、调试及软件测试撰写毕业设计。

10~12周:修改毕业设计至定稿,资格审查。

第13~14周:毕业设计答辩及资料归档。

六、完成设计所需要的条件

(1)软硬件环境:硬件环境有win10笔记本电脑配置有16G内存、256G固态硬盘(用于存储、计算、开发);软件环境有Python、JDK1.8、Hadoop、Spark、Hive、Maven、nodejs等。

(2)数据库:MySQL数据库

(3)开发环境与工具:Vmvare、IDEA、Pycharm、Navicat

七、参考文献                                                                       

[1] 融合知识图谱与Bert+CNN的图书文本分类研究[J]. 孔令蓉;迟呈英;战学刚.电脑编程技巧与维护,2023(01)

[2] 基于CNN与Bi-LSTM混合模型的中文文本分类方法[J]. 王佳慧.软件导刊,2023(01)

[3] 基于BERT-CNN的新闻文本分类的知识蒸馏方法研究[M]. 叶榕;邵剑飞;张小为;邵建龙.电子技术应用,2023(01)

[4] 基于BERT变种模型的情感分析实现[J]. 毛银;赵俊.现代计算机,2022(18)

[5] 基于文本分词朴素贝叶斯分类的图书采访机制探索[J]. 王红;王雅琴;黄建国.现代情报,2021(09)

[6] 基于改进的BERT-CNN模型的新闻文本分类研究[J]. 张小为;邵剑飞.电视技术,2021(07)

[1] 融合知识图谱与Bert+CNN的图书文本分类研究[J]. 孔令蓉;迟呈英;战学刚.电脑编程技巧与维护,2023(01)

[2] 基于CNN与Bi-LSTM混合模型的中文文本分类方法[J]. 王佳慧.软件导刊,2023(01)

[3] 基于BERT-CNN的新闻文本分类的知识蒸馏方法研究[M]. 叶榕;邵剑飞;张小为;邵建龙.电子技术应用,2023(01)

[4] 基于BERT变种模型的情感分析实现[J]. 毛银;赵俊.现代计算机,2022(18)

[5] 基于文本分词朴素贝叶斯分类的图书采访机制探索[J]. 王红;王雅琴;黄建国.现代情报,2021(09)

[6] 基于改进的BERT-CNN模型的新闻文本分类研究[J]. 张小为;邵剑飞.电视技术,2021(07)

[7] 基于BERT模型的文本情感分类研究[D]. 王杭涛.桂林电子科技大学,2022

[8] 面向文本分类的BERT-CNN模型[M]. 秦全;易军凯.北京信息科技大学学报(自然科学版),2023

[9] 基于BERT-CNN中间任务转移模型的短文本讽刺文本分类研究[J]. 周海波;李天.智能计算机与应用,2023

[10] 基于BERT-BiLSTM-CRF的SPECT诊断文本病灶提取研究[J]. 张淋均.信息与电脑(理论版),2021

[11] 基于BERT模型的文本评论情感分析[J]. 杨杰;杨文军.天津理工大学学报,2021

[12] 一种基于BERT的文本实体链接方法[J]. 谢世超;黄蔚;任祥辉.计算机与现代化,2023

[13] 结合Bert与超图卷积网络的文本分类模型[J]. 李全鑫;庞俊;朱峰冉.计算机工程与应用,2023

[14] 分层文本分类在警情数据中的应用[J]. 殷小科;王威;王婕;张沛然;乐汉;林基伟;张海婷.现代计算机,2021

[15] 基于BERT的金融文本情感分析模型[M]. 朱鹤;陆小锋;薛雷.上海大学学报(自然科学版),2023

[16] 基于文本双表示模型的微博热点话题发现[J]. 刘梦颖;王勇.计算机与现代化,2021

[17] 基于BERT的文本情感分析[J]. 刘思琴;冯胥睿瑞.信息安全研究,2020

指导教师签名:     指导教师手签  2023.1.6-1.13定稿时删除该说明)        年   月    日                                                                  

核心算法代码分享如下:

import sys

import numpy as np
from torch.utils.data import DataLoader
from torch import nn
import torch.nn.functional as F
import torch
from sklearn.metrics import precision_score,recall_score,accuracy_score

import dataloader


class ALS_MLP (nn.Module):
    def __init__(self, n_users, n_items, dim):
        super(ALS_MLP, self).__init__()
        '''
        :param n_users: 用户数量
        :param n_items: 物品数量
        :param dim: 向量维度
        '''
        # 随机初始化用户的向量,
        self.users = nn.Embedding( n_users, dim, max_norm=1 )
        # 随机初始化物品的向量
        self.items = nn.Embedding( n_items, dim, max_norm=1 )

        #初始化用户向量的隐层
        self.u_hidden_layer1 = self.dense_layer(dim, dim // 2)
        self.u_hidden_layer2 = self.dense_layer(dim//2, dim // 4)

        #初始化物品向量的隐层
        self.i_hidden_layer1 = self.dense_layer(dim, dim // 2)
        self.i_hidden_layer2 = self.dense_layer(dim//2, dim // 4)

        self.sigmoid = nn.Sigmoid()

    def dense_layer(self,in_features,out_features):
        #每一个mlp单元包含一个线性层和激活层,当前代码中激活层采取Tanh双曲正切函数。
        return nn.Sequential(
            nn.Linear(in_features, out_features),
            nn.Tanh()
        )

    def forward(self, u, v, isTrain=True):
        '''
         :param u: 用户索引id shape:[batch_size]
         :param i: 用户索引id shape:[batch_size]
         :return: 用户向量与物品向量的内积 shape:[batch_size]
         '''
        u = self.users(u)
        v = self.items(v)

        u = self.u_hidden_layer1(u)
        u = self.u_hidden_layer2(u)

        v = self.i_hidden_layer1(v)
        v = self.i_hidden_layer2(v)

        #训练时采取dropout来防止过拟合
        if isTrain:
            u = F.dropout(u)
            v = F.dropout(v)

        uv = torch.sum( u*v, axis = 1)
        logit = self.sigmoid(uv*3)
        return logit

def doEva(net, d):
    d = torch.LongTensor(d)
    u, i, r = d[:, 0], d[:, 1], d[:, 2]
    with torch.no_grad():
        out = net(u,i,False)
    y_pred = np.array([1 if i >= 0.5 else 0 for i in out])
    y_true = r.detach().numpy()
    p = precision_score(y_true, y_pred)
    r = recall_score(y_true, y_pred)
    acc = accuracy_score(y_true,y_pred)
    return p,r,acc

def train( epochs = 10, batchSize = 1024, lr = 0.001, dim = 256, eva_per_epochs = 1):
    '''
    :param epochs: 迭代次数
    :param batchSize: 一批次的数量
    :param lr: 学习率
    :param dim: 用户物品向量的维度
    :param eva_per_epochs: 设定每几次进行一次验证
    '''
    #读取数据
    user_set, item_set, train_set, test_set = \
        dataloader.readRecData(test_ratio = 0.1)
    #初始化ALS模型
    net = ALS_MLP(len(user_set), len(item_set), dim)
    #定义优化器
    optimizer = torch.optim.AdamW( net.parameters(), lr = lr, weight_decay=0.2)
    #定义损失函数
    criterion = torch.nn.BCELoss()
    #开始迭代
    for e in range(epochs):
        all_lose = 0
        #每一批次地读取数据
        for u, i, r in DataLoader(train_set,batch_size = batchSize, shuffle = True):
            optimizer.zero_grad()
            r = torch.FloatTensor(r.detach().numpy())
            result = net(u,i)
            loss = criterion(result,r)
            all_lose += loss
            loss.backward()
            optimizer.step()
        print('epoch {}, avg_loss = {:.4f}'.format(e,all_lose/(len(train_set)//batchSize)))

        #评估模型
        if e % eva_per_epochs==0:
            p, r, acc = doEva(net, train_set)
            print('train: Precision {:.4f} | Recall {:.4f} | accuracy {:.4f}'.format(p, r, acc))
            p, r, acc = doEva(net, test_set)
            print('test: Precision {:.4f} | Recall {:.4f} | accuracy {:.4f}'.format(p, r, acc))

def als_mlp_predict(userId=1, itemSize=100, count=4, dim=64):
    # 读取数据
    user_set, item_set, train_set, test_set = \
        dataloader.readRecData( test_ratio=0.1)

    # 预测一个用户的所有的评分形成一个元祖
    train_set = []
    for i in range(1, itemSize):
        train_set.append((userId, i, 0))
    # print(train_set)
    # print(train_set)
    # 初始化ALS模型
    net = ALS_MLP(len(user_set), len(item_set), dim)

    d = torch.LongTensor(train_set)
    u, i, r = d[:, 0], d[:, 1], d[:, 2]
    with torch.no_grad():
        out = net(u, i)

    predict = []
    preds = out.tolist()
    # print(len(preds))
    # 找出最大值,通过这种方式可以求出多个
    for i in range(0, count):
        m = max(preds)
        idx = preds.index(m)
        predict.append(dict(iid=idx, score=m))
        del preds[idx]

    # print(predict)
    return predict

def test(dim = 64):
    result = als_mlp_predict(1, 2000, 5)
    print(result)

if __name__ == '__main__':
    # train()
    # test()
    param1 = sys.argv[1]
    # param1 = "1"
    result = als_mlp_predict(int(param1), 55, 4)
    list = []
    # print(result)
    for r in result:
        list.append(dict(iid=r['iid'], rate=r['score']))
    print(list)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/756606.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汽车免拆诊断案例 | 2016 款吉利帝豪EV车无法加速

故障现象 一辆2016款吉利帝豪EV车,累计行驶里程约为28.4万km,车主反映车辆无法加速。 故障诊断 接车后路试,行驶约1 km,踩下加速踏板,无法加速,车速为20 km/h左右,同时组合仪表上的电机及控制…

CST--如何在PCB三维模型中自由创建离散端口

在使用CST电磁仿真软件进行PCB的三维建模时,经常会遇到不能自动创建离散端口的问题,原因有很多,比如:缺少元器件封装、开路端口、多端子模型等等,这个时候,很多人会选择手动进行端口创建,但是&a…

centos 7.2 离线部署 mysql 5.7.37

1.安装依赖 清楚mysql从图的依赖 rpm -qa|grep mariadb 存在冲突依赖,进行卸载 rpm -e --nodeps mariadb-libs-5.5.44-2.el7.centos.x86_64 确认gcc版本 ldd --version 安装mysql5.7所需要的依赖 mkdir -p /root/AllInstalls 只下载不安装,用于放到其他机器: yum inst…

Java对象创建过程

在日常开发中,我们常常需要创建对象,那么通过new关键字创建对象的执行中涉及到哪些流程呢?本文主要围绕这个问题来展开。 类的加载 创建对象时我们常常使用new关键字。如下 ObjectA o new ObjectA();对虚拟机来讲首先需要判断ObjectA类的…

一款轻量级的通信协议---MQTT (内含Linux环境搭建)

目录 MQTT MQTT的关键特点: 应用场景 Linux环境搭建: 1. 安装mosquitto 2. Linux下客户端进行通信 3. PC端和Linux下进行通信 安装MQTT. fx 4. MQTT.fx的使用 1. 点击连接 ​编辑 2. 连接成功 3. 订阅主题或者给别的主题发送消息 遇到的问…

Qt 5.14.2+Android环境搭建

1. 安装QT5.14.2的过程中,选中套件(kit) qt for android。 如果已经安装了qt creator但没有安装该套件,可以找到在qt安装目录下的MaintenanceTool.exe,运行该程序添加套件。 2. 安装jdk8,android sdk&…

2.1 大语言模型的训练过程 —— 《带你自学大语言模型》系列

《带你自学大语言模型》系列部分目录及计划,完整版目录见: 带你自学大语言模型系列 —— 前言 第一部分 走进大语言模型(科普向) 第一章 走进大语言模型1.1 从图灵机到GPT,人工智能经历了什么?1.2 如何让…

【全球首个开源AI数字人】DUIX数字人-打造你的AI伴侣!

目录 1. 引言1.1 数字人技术的发展背景1.2 DUIX数字人项目的开源意义1.3 DUIX数字人技术的独特价值1.4 本文目的与结构 2. DUIX数字人概述2.1 定义与核心概念2.2 硅基智能与DUIX的关系2.3 技术架构2.4 开源优势2.5 应用场景2.6 安全与合规性 3. DUIX数字人技术特点3.1 开源性与…

数据结构-分析期末选择题考点(图)

我是梦中传彩笔 欲书花叶寄朝云 目录 图的常见考点(一)图的概念题 图的常见考点(二)图的邻接矩阵、邻接表 图的常见考点(三)拓扑排序 图的常见考点(四)关键路径 图的常见考点&#x…

List接口, ArrayList Vector LinkedList

Collection接口的子接口 子类Vector,ArrayList,LinkedList 1.元素的添加顺序和取出顺序一致,且可重复 2.每个元素都有其对应的顺序索引 方法 在index 1 的位置插入一个对象,list.add(1,list2)获取指定index位置的元素&#…

【你也能从零基础学会网站开发】认识数据库和数据库中的基本概念

🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 学习目标 认识…

VMware ESXi 8.0U3 macOS Unlocker OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动

VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动 VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U3 集成驱动版,在个人电脑上运行企业级工作负载 请访…

【51单片机入门】速通定时器

文章目录 前言定时器是什么初始化定时器初始化的大概步骤TMOD寄存器C/T寄存器 触发定时器中断是什么中断函数定时器点亮led 总结 前言 在嵌入式系统的开发中,定时器是一个非常重要的组成部分。它们可以用于产生精确的时间延迟,或者在特定的时间间隔内触…

Solr安装IK中文分词器

Solr安装IK中文分词器 如何安装Solr与导入数据?为什么要安装中文分词器下载与安装IK分词器1.1、下载IK分词器1.2、安装IK  第一步:非常简单,我们直接将在下的Ik分词器的jar包移动到以下文件夹中  第二步:修改Core文件夹名下\c…

linux的常用系统维护命令

1.ps显示某个时间点的程序运行情况 -a :显示所有用户的进程 -u :显示用户名和启动时间 -x :显示 没有控制终端的进程 -e :显示所有进程,包括没有控制终端的进程 -l :长格式显示 -w :宽…

什么是机器学习,机器学习与人工智能的区别是什么(一)?

人工智能和计算机游戏领域的先驱阿瑟塞缪尔(Arthur Samuel)创造了 "机器学习"一词。他将机器学习定义为 “一个让计算机无需明确编程即可学习的研究领域” 。通俗地说,机器学习(ML)可以解释为根据计算机的经…

从零开始搭建spring boot多模块项目

一、搭建父级模块 1、打开idea,选择file–new–project 2、选择Spring Initializr,选择相关java版本,点击“Next” 3、填写父级模块信息 选择/填写group、artifact、type、language、packaging(后面需要修改)、java version(后面需要修改成和第2步中版本一致)。点击“…

llamafactory-llama3微调中文数据集

一、定义 https://github.com/SmartFlowAI/Llama3-Tutorial/tree/main 基准模型测试opencompass 离线测评数据准备微调训练合并测试人工审核对比 二、实现 基准模型测试 基准模型 llama3-8b https://zhuanlan.zhihu.com/p/694818596? https://github.com/SmartFlowAI/Llam…

计算机网络知识整理笔记

目录 1.对网络协议的分层? 2.TCP/IP和UDP之间的区别? 3.建立TCP连接的三次握手? 4.断开TCP连接的四次挥手? 5.TCP协议如何保证可靠性传输? 6.什么是TCP的拥塞控制? 7.什么是HTTP协议? 8…

QGroundControl@Jetson Orin Nano - 从代码编译安装

QGroundControlJetson Orin Nano - Build from Source 1. 源由2. 步骤2.1 QT 编译2.1.1 下载2.1.2 版本2.1.3 初始化2.1.4 配置2.1.5 编译2.1.6 安装 2.2 QGC 编译2.2.1 下载2.2.2 版本2.2.3 初始化2.2.4 配置2.2.5 编译2.2.6 安装2.2.7 QT5命令备注 3. 可行方案4. 总结5. 补充…