课题名称 | 基于Bert模型对微博的言论情感分析设计与实现 | ||||
课题来源 | 课题类型 | BY | 指导教师 | ||
学生姓名 | 专 业 | 计算机科学与技术 | 学 号 | ||
开题报告内容:(调研资料的准备,设计/论文的目的、要求、思路与预期成果;任务完成的阶段内容及时间安排;完成设计所具备的条件因素等。) 一、选题背景 互联网技术的高速发展和人们在社交媒体上的活跃群体数量日益增加,人们已经习惯于采用社交媒体平台来创建各种话题进行讨论,最终形成海量的数据。其中,以新浪微博为主的社交媒体平台每天都产生大量的文本信息,用户在平台上的大量交互,使得部分文本中蕴含的观点在互联网上广泛传播。一些负面的,甚至是有害的信息若长期存在于网络且被广泛传播,这对网络空间生态的影响不言而喻,因此需要进行文本情感分类分析。当前,情感分析的研究主要是微博文本[1]、外卖评论[2]、中文新闻文本[3]等方面,情感分析对于深入探究社会问题,提高社会满意度方面也具有重要意义。本研究利用BERT自注意力的优点,将BERT当作embedding接入到CNN模型,进行微博文本情感分类,并在同一个数据集进行训练和验证,最后将各个模型的指标进行比较。 二、设计目的和要求 设计目的:
设计要求:
三、设计内容和思路 设计内容:
设计思路:
四、预期成果 (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)