【数据挖掘实战】——舆情分析:对微博文本进行情绪分类

news2024/11/23 15:06:52

🤵‍♂️ 个人主页:@Lingxw_w的个人主页

✍🏻作者简介:计算机科学与技术研究生在读
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+

 目录

一、背景介绍

二、比赛任务

三、评审规则

1. 数据说明

2. 评估指标

3. 评测及排行

四、作品提交要求

五、解题思路

1、读取数据和预处理

2、TFIDF和逻辑回归

3、transformers bert模型


一、背景介绍

疫情发生对人们生活生产的方方面面产生了重要影响,并引发了国内舆论的广泛关注,众多网民也参与到了疫情相关话题的讨论中。大众日常的情绪波动在疫情期间会放大,并寻求在自媒体和社交媒体上发布和评论。

比赛地址:http://challenge.xfyun.cn/topic/info?type=epidemic-weibo&option=ssgy&ch=ds22-dw-zmt05

为了掌握真实社会舆论情况,科学高效地做好防控宣传和舆情引导工作,针对疫情相关话题开展网民情绪识别是重要任务。本次我们重点关注微博平台上的用户情绪,希望各位选手能搭建自然语言处理模型,对疫情下微博文本的情绪进行识别。

二、比赛任务

本次赛题需要选手对微博文本进行情绪分类,分为正向情绪和负面情绪。数据样例如下:

赛题数据由训练集和测试集组成,本次竞赛的评价标准采用准确率指标,最高分为1。

三、评审规则

1. 数据说明

赛题数据由训练集和测试集组成,训练集数据集读取代码:

import pandas as pd

pd.read_csv('train.csv',sep='\t')

2. 评估指标

本次竞赛的评价标准采用准确率指标,最高分为1。

计算方法参考地址:

sklearn.metrics.accuracy_score — scikit-learn 1.2.2 documentation ,

评估代码参考:

from sklearn.metrics import accuracy_score
y_pred = [0,2,1,3]
y_true = [0,1,2,3]
accuracy _score(y _true, y_pred)

3. 评测及排行

1、赛事提供下载数据,选手在本地进行算法调试,在比赛页面提交结果。

2、每支团队每天最多提交3次。

3、排行按照得分从高到低排序,排行榜将选择团队的历史最优成绩进行排名。

四、作品提交要求

文件格式:预测结果文件按照csv格式提交

文件大小:无要求

提交次数限制:每支队伍每天最多3次

预测结果文件详细说明:

1) 以csv格式提交,编码为UTF-8,第一行为表头;

2) 标签顺序需要与测试集文本保持一致;

3) 提交前请确保预测结果的格式与sample_submit.csv中的格式一致。

具体格式如下:

label
1
1
1
1

五、解题思路

赛题是一个非常典型的文本分类赛题,接下来我们将使用TFIDF和BERT模型两者思路来完成建模。

导入需要的一些库;

import pandas as pd
import jieba
import matplotlib.pyplot as plt
import seaborn as sns

1、读取数据和预处理

读取数据 

train_df = pd.read_csv("train.csv",sep='\t')
test_df = pd.read_csv("test.csv",sep='\t')

print("train size: {} \ntest size {}".format(len(train_df),len(test_df)))

# 测试 emojiswitch 效果
import emojiswitch
emojiswitch.demojize('心中千万只🐑🐑🐑呼啸而过',delimiters=("",""), lang="zh")
'心中千万只母羊母羊母羊呼啸而过'
import re
def clean_str(text):
    text = emojiswitch.demojize(text,delimiters=("",""), lang="zh") # Emoji转文字
    return text.strip()

train_df['text'] = train_df['text'].apply(lambda x: clean_str(x))
test_df['text'] = test_df['text'].apply(lambda x: clean_str(x))
# 处理后的数据一览
train_df.head(6)

# 绘制讯飞数据集的文本长度分
train_df['len'] = [len(i) for i in train_df["text"]]
test_df['len'] = [len(i) for i in test_df["text"]]
print(train_df['len'].quantile(0.995))
plt.title("text length")
sns.distplot(train_df['len'],bins=10,color='r')
sns.distplot(test_df['len'],bins=10,color='g')
plt.show()

 

# 查看标签label分布
print(train_df['label'].value_counts())
plt.title("label distribution")
sns.countplot(y='label',data=train_df)
0 31962 
1 28038
Name: label, dtype: int64

1.jieba是python中的中文分词第三方库,可以将中文的文本通过分词获得单个词语,返回类型为列表类型。

2.jieba分词共有三种模式:精确模式、全模式、搜索引擎模式。

(1)精确模式语法:jieba.lcut(字符串,cut_all=False),默认时为cut_all=False,表示为精确模型。精确模式是把文章词语精确的分开,并且不存在冗余词语,切分后词语总词数与文章总词数相同。

(2)全模式语法:ieba.lcut(字符串,cut_all=True),其中cut_all=True表示采用全模型进行分词。全模式会把文章中有可能的词语都扫描出来,有冗余,即在文本中从不同的角度分词,变成不同的词语。

(3)搜索引擎模式:在精确模式的基础上,对长词语再次切分。

train_df['words'] = train_df['text'].apply(lambda x:' '.join(jieba.lcut(x)))
test_df['words'] = test_df['text'].apply(lambda x: ' '.join(jieba.lcut(x)))

2、TFIDF和逻辑回归

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline # 组合流水线
# 训练TFIDF和逻辑回归
pipline = make_pipeline(
    TfidfVectorizer(),
    LogisticRegression()
)
pipline.fit(
    train_df['words'].tolist(),
    train_df['label'].tolist()
)

pd.DataFrame(
    {
        'label': pipline.predict(test_df['words'])
    }
).to_csv('lr_submit.csv', index=None) # 86左右

 准确率指标大概0.86左右。

3、transformers bert模型

# pip install transformers
# transformers bert相关的模型使用和加载
from transformers import BertTokenizer
# 分词器,词典

tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
train_encoding = tokenizer(train_df['text'].tolist(), truncation=True, padding=True, max_length=128)
test_encoding = tokenizer(test_df['text'].tolist(), truncation=True, padding=True, max_length=128)
from torch.utils.data import Dataset, DataLoader, TensorDataset
import torch

# 数据集读取
class NewsDataset(Dataset):
    def __init__(self, encodings, labels):
        self.encodings = encodings
        self.labels = labels
    
    # 读取单个样本
    def __getitem__(self, idx):
        item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
        item['labels'] = torch.tensor(int(self.labels[idx]))
        return item
    
    def __len__(self):
        return len(self.labels)

train_dataset = NewsDataset(train_encoding, train_df['label'])
test_dataset = NewsDataset(test_encoding, [0] * len(test_df))
from torch.utils.data import Dataset, DataLoader, TensorDataset
import torch

# 数据集读取
class NewsDataset(Dataset):
    def __init__(self, encodings, labels):
        self.encodings = encodings
        self.labels = labels
    
    # 读取单个样本
    def __getitem__(self, idx):
        item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
        item['labels'] = torch.tensor(int(self.labels[idx]))
        return item
    
    def __len__(self):
        return len(self.labels)

train_dataset = NewsDataset(train_encoding, train_df['label'])
test_dataset = NewsDataset(test_encoding, [0] * len(test_df))

 精度计算

# 精度计算
def flat_accuracy(preds, labels):
    pred_flat = np.argmax(preds, axis=1).flatten()
    labels_flat = labels.flatten()
    return np.sum(pred_flat == labels_flat) / len(labels_flat)
from transformers import BertForSequenceClassification, AdamW, get_linear_schedule_with_warmup
model = BertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=2)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

# 单个读取到批量读取
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
test_dataloader = DataLoader(test_dataset, batch_size=16, shuffle=False)

# 优化方法
optim = AdamW(model.parameters(), lr=2e-5)
total_steps = len(train_loader) * 1

 训练函数

# 训练函数
def train():
    model.train()
    total_train_loss = 0
    iter_num = 0
    total_iter = len(train_loader)
    for batch in train_loader:
        # 正向传播
        optim.zero_grad()
        
        input_ids = batch['input_ids'].to(device)
        attention_mask = batch['attention_mask'].to(device)
        labels = batch['labels'].to(device)
        
        outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
        loss = outputs[0]
        total_train_loss += loss.item()
        
        # 反向梯度信息
        loss.backward()
        torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
        
        # 参数更新
        optim.step()

        iter_num += 1
        if(iter_num % 100==0):
            print("epoth: %d, iter_num: %d, loss: %.4f, %.2f%%" % (epoch, iter_num, loss.item(), iter_num/total_iter*100))
        
    print("Epoch: %d, Average training loss: %.4f"%(epoch, total_train_loss/len(train_loader)))

for epoch in range(1):
    print("------------Epoch: %d ----------------" % epoch)
    train()
------------Epoch: 0 ----------------
epoth: 0, iter_num: 100, loss: 0.0293, 2.67%
epoth: 0, iter_num: 200, loss: 0.0087, 5.33%
epoth: 0, iter_num: 300, loss: 0.1835, 8.00%
epoth: 0, iter_num: 400, loss: 0.0722, 10.67%
epoth: 0, iter_num: 500, loss: 0.0275, 13.33%
epoth: 0, iter_num: 600, loss: 0.0207, 16.00%
epoth: 0, iter_num: 700, loss: 0.0315, 18.67%
epoth: 0, iter_num: 800, loss: 0.0209, 21.33%
epoth: 0, iter_num: 900, loss: 0.4200, 24.00%
epoth: 0, iter_num: 1000, loss: 0.1209, 26.67%
epoth: 0, iter_num: 1100, loss: 0.0093, 29.33%
epoth: 0, iter_num: 1200, loss: 0.0229, 32.00%
epoth: 0, iter_num: 1300, loss: 0.0164, 34.67%
epoth: 0, iter_num: 1400, loss: 0.1712, 37.33%
epoth: 0, iter_num: 1500, loss: 0.0070, 40.00%
epoth: 0, iter_num: 1600, loss: 0.3227, 42.67%
epoth: 0, iter_num: 1700, loss: 0.2320, 45.33%
epoth: 0, iter_num: 1800, loss: 0.0102, 48.00%
epoth: 0, iter_num: 1900, loss: 0.0195, 50.67%
epoth: 0, iter_num: 2000, loss: 0.4099, 53.33%
epoth: 0, iter_num: 2100, loss: 0.0076, 56.00%
epoth: 0, iter_num: 2200, loss: 0.0008, 58.67%
epoth: 0, iter_num: 2300, loss: 0.0496, 61.33%
epoth: 0, iter_num: 2400, loss: 0.2253, 64.00%
epoth: 0, iter_num: 2500, loss: 0.0046, 66.67%
epoth: 0, iter_num: 2600, loss: 0.0968, 69.33%
epoth: 0, iter_num: 2700, loss: 0.0118, 72.00%
epoth: 0, iter_num: 2800, loss: 0.0165, 74.67%
epoth: 0, iter_num: 2900, loss: 0.3721, 77.33%
epoth: 0, iter_num: 3000, loss: 0.2609, 80.00%
epoth: 0, iter_num: 3100, loss: 0.2001, 82.67%
epoth: 0, iter_num: 3200, loss: 0.3607, 85.33%
epoth: 0, iter_num: 3300, loss: 0.1450, 88.00%
epoth: 0, iter_num: 3400, loss: 0.0155, 90.67%
epoth: 0, iter_num: 3500, loss: 0.0164, 93.33%
epoth: 0, iter_num: 3600, loss: 0.3011, 96.00%
epoth: 0, iter_num: 3700, loss: 0.0728, 98.67%
Epoch: 0, Average training loss: 0.1361
with torch.no_grad():
    pred_label = []
    for batch in test_dataloader:
        # 正向传播
        optim.zero_grad()
        
        input_ids = batch['input_ids'].to(device)
        attention_mask = batch['attention_mask'].to(device)
        
        outputs = model(input_ids, attention_mask=attention_mask)
        pred_label += list(outputs.logits.argmax(1).cpu().data.numpy())
pd.DataFrame(
    {
        'label': pred_label
    }
).to_csv('bert_submit.csv', index=None) # 96左右

  准确率指标大概0.96左右。

参考:

竞赛日历 - Coggle数据科学

疫情微博情绪识别挑战赛Baseline(PaddlePaddle)-0.9735 - 飞桨AI Studio

其他数据挖掘实战案例: [订阅链接]

【数据挖掘实战】——航空公司客户价值分析(K-Means聚类案例)

【数据挖掘实战】——中医证型的关联规则挖掘(Apriori算法)

【数据挖掘实战】——家用电器用户行为分析及事件识别(BP神经网络)

【数据挖掘实战】——应用系统负载分析与容量预测(ARIMA模型)

【数据挖掘实战】——电力窃漏电用户自动识别(LM神经网络和决策树)

【数据挖掘实战】——基于水色图像的水质评价(LM神经网络和决策树)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tomcat部署及多实例部署

Tomcat部署及多实例部署 一、什么是Tomcat二、Tomcat核心组件1.什么是servlet2.什么是 JSP 三、Tomcat 功能组件结构1.Connector2.Container2.1Container 包含四个子容器 3.Service 四、Tomcat 请求过程五、Tomcat 服务部署1.关闭防火墙2.上传jdk包,查看jdk版本&…

SpringCloud Gateway网关多路由配置访问404解决方案

文章目录 一、问题描述:SpringCloud GateWay Eureka访问出现404,Not Found二、解决方案:1、 配置 filters: - StripPrefix12、删除冲突依赖3、检查启动类4、检查配置文件 一、问题描述:SpringCloud GateWay Eureka访问出现404&#xff0c…

如何用新范式解决安全难题?数字安全免疫力研讨论坛给你答案!

6月13日,腾讯安全、腾讯研究院将联动IDC、《中国信息安全》杂志社、CIO 时代、新基建创新研究院等多家行业机构、媒体共同发起「数字安全免疫力」研讨论坛,汇聚产学研各界专家,研判安全态势、分享最佳实践,碰撞新一代的安全理念&a…

【Java基础学习打卡02】计算机硬件与软件

目录 引言一、硬件组成二、软件组成三、软硬件工作流程四、性能指标五、选购建议总结 引言 本小节将认识计算机硬件与软件,以及软硬件工作流程,还要知道计算机性能指标,并可以指导我们购买电脑。还是那句话,了解计算机工作流程对…

Qt6之样式表

Qt的样式表主要是受到CSS的启发,通过调用QWidget::setStyleSheet()或QApplication::setStyleSheet(),你可以为一个独立的子部件、整个窗口,甚至是整个应用程序指定一个样式表。样式表由影响窗口部件绘制的样式规则组成。这些规则都是普通文本…

stable-diffusion领域prompt集合

有什么写实的stable diffusion模型? - 知乎试了试这个模型,感觉勉强,大佬们知道有没有更写实的模型?https://huggingface.co/CompVis/stable-diff…https://www.zhihu.com/question/567026134Stable Diffusion好看的御姐风AI美女P…

数据仓库分析工具Hive

数据仓库分析工具Hive 概述Hive简介Hive与Hadoop生态系统中其他组件的关系Hive与传统数据库的对比 Hive系统架构概述Hive组成模块Hive工作原理SQL语句转换成MapReduce的基本原理Hive中SQL查询转换成MapReduce作业的过程 从外部访问Hive的典型方式 Hive的应用Hive在报表中心的应…

jmeter性能测试实战--web程序

目录 前言: 项目背景 测试步骤 前言: JMeter是开源的Java性能测试工具,广泛应用于Web、移动应用程序等领域的性能测试中。在Web应用程序中,JMeter能够模拟多用户并发请求,验证系统在高负载情况下的性能&#xff0c…

【王道考研】王道数据结构与算法详细笔记(全)

目录 第一章 数据结构绪论 1.1 数据结构的基本概念 1.2 数据结构的三要素 1.2.1. 数据的逻辑结构 1.2.2. 数据的存储结构(物理结构) 1.2.3. 数据的运算 1.2.4. 数据类型和抽线数据类型 1.3 算法的基本概念 1.4 算法的时间复杂度 1.5 算法的空…

再一次安装anygrasp

1,anaconda 2,新建py3.6.2的环境 因为anygrasp 要求 pytorch 1.6 太老了,而且对应的cuda 都是cuda 11以下的版本 我是笔记本带3060,只能cuda11以上。 为了解决这个问题,感谢史驭舒大佬提供的思路 他复现用的环境是…

代码随想录刷题第48天|LeetCode198打家劫舍、LeetCode213打家劫舍II、LeetCode337打家劫舍III

1、LeetCode198打家劫舍 题目链接:198、打家劫舍 1、dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。 2、递推公式: 如果偷第i房间,那么dp[i] dp[i - 2] nums[i] &#xf…

cvte 前端一面 凉经

cvte 前端一面 凉经 原文面试题地址:https://www.nowcoder.com/discuss/353159272857018368?sourceSSRsearch 1. vuex原理 和vuerouter的原理差不多 2. vuerouter的原理 ​ 首先在main.js中,import router from ‘./router’ 引入在router文件夹下面…

Unity:鼠标【上下左右滑动时】控制相机【左右张望】和【上下抬头】

相机旋转,看着是小事,但是却关系到用户的直观体验。旋转对了母慈子孝,旋转错了则翻江倒海。 一、功能 鼠标左右移动时,控制相机左右转动 鼠标上下移动时,控制相机抬头低头 二、被GPT带翻的过程 你可以在GPT里提问&…

【FPGA零基础学习之旅#7】BCD计数器设计

🎉欢迎来到FPGA专栏~BCD计数器设计 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒🍹 ✨博客主页:小夏与酒的博客 🎈该系列文章专栏:FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正…

Virtual Serial Port Driver Pro 11 Crack

Virtual Serial Port Driver 虚拟串行端口驱动程序允许创建大量的虚拟COM端口,并为您提供充分模拟串行端口行为的巨大可能性。虚拟串行端口软件不仅仅是一个简单的COM端口模拟器。它提供了灵活的端口创建、管理和删除,允许测试串行软件,支持控…

Megatron + zero

文章目录 简介3D并行前置知识点:通信算子1. DP 数据并行显存效率优化(ZeRO )计算效率优化(梯度累计减少通信) 2. TP tensor并行(算子内)前置知识点:矩阵分块并行计算MLPself-attenti…

绿色荧光试剂210236-90-1,FITC Tyramide,Fluorescein-Tyramide

●中文名:荧光素酪胺 ●英文名:FITC Tyramide,Fluorescein-Tyramide,FITC TSA (文章编辑资料汇总来源于:陕西新研博美生物科技有限公司小编MISSwu)​ ●外观以及性质: 荧光素酪胺…

Vue核心

目录 一、初始Vue二、模板语法三、数据绑定四、el和data的两种写法五、MVVM模型六、数据代理七、事件处理八、计算属性九、监视属性十、绑定样式十一、条件渲染十二、列表渲染十三、收集表单数据十四、过滤器十五、内置指令十六、自定义指令十七、生命周期 简介: Vu…

【大数据之路2】分布式文件系统 HDFS

2. 分布式文件系统 HDFS 1. 引入HDFS【面试点】2. HDFS 概述1. HDFS 设计思路2. HDFS 架构3. HDFS 优缺点 3. HDFS 操作HDFS 读写基准测试 1. HDFS Shell 操作【重点】2. HDFS API 操作1. 访问数据1. 获取 FileSystem2. 文件的遍历3. 创建文件夹4. 文件的上传5. 文件的下载 2. …

实验篇(7.2) 07. 通过安全隧道访问指定网站 (FortiClient-SSL) ❀ 远程访问

【简介】通过前面的实验,我们已经了解了SSL VPN的隧道模式。FortiClient客户端拨号后,访问服务器IP的流量,会通过安全隧道到达远端防火墙,并访问DMZ接口下的服务器。那如果我想让更多的访问走安全隧道,但是又不确定是哪…