【项目】新冠肺炎疫情期间网民情绪识别——Python文本分类

该博客介绍了一个利用Python进行新冠肺炎疫情期间网民情绪识别的项目。通过数据预处理、词云分析、word2vec和LSTM模型,对微博内容进行情感分类。尽管面临过拟合问题,模型在测试集上的精度达到了73%,提出改进措施包括调整学习率和利用预训练模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务描述

2019新型冠状病毒(COVID-19)感染的肺炎疫情发生对人们生活生产的方方面面产生了重要影响,并引发国内舆论的广泛关注,众多网民参与疫情相关话题的讨论。为了帮助政府掌握真实社会舆论情况,科学高效地做好防控宣传和舆情引导工作,针对疫情相关话题开展网民情绪识别的任务。
具体任务是给定微博ID和微博内容,设计算法对微博内容进行情绪识别,判断微博内容是积极的、消极的还是中性的。

数据描述

数据集nCoV_100k.labled.csv包含10万条用户标注的微博数据,包括微博id,发布时间,发布人账号,中文内容,微博图片,微博视频,情感倾向等多条数据,具体格式如下:

  • 微博id,格式为整型。
  • 微博发布时间,格式为xx月xx日 xx:xx。
  • 发布人账号,格式为字符串。
  • 微博中文内容,格式为字符串。
  • 微博图片,格式为url超链接,[]代表不含图片。
  • 微博视频,格式为url超链接,[]代表不含视频。
  • 情感倾向,取值为{1,0,-1}。

读取数据

由于文件是GB2312格式编码的文件,需要将其转化为utf-8格式的文件进行读取数据预处理。

//转换编码
def re_encode(path): //定义编码转换函数
    with open(path, 'r', encoding='GB2312', errors='ignore') as file:
        lines = file.readlines()
    with open(path, 'w', encoding='utf-8') as file:
        file.write(''.join(lines))
        
re_encode('nCov_10k_test.csv') //测试集转换编码
re_encode('nCoV_100k_train.labled.csv') //训练集转换编码

将转换好的数据读取进来,以便操作。

//读取网民情绪的文件
data = pd.read_csv('nCoV_100k_train.labled.csv',
                   encoding='utf-8',
                   engine ='python') 
data.head()

简单查看一下前5条结果,发现读取正确。

        微博id	         微博发布时间   发布人账号	微博中文内容	  微博图片	微博视频	情感倾向
0	4456072029125500	010123:50	存曦1988	写在年末冬初孩子流感的第五天,我们仍然没有忘记热情拥抱这2020年的第一天。带着一丝迷信,早...	['https://ww2.sinaimg.cn/orj360/005VnA1zly1gah...	[]	0
1	4456074167480980	010123:58	LunaKrys	开年大模型…累到以为自己发烧了腰疼膝盖疼腿疼胳膊疼脖子疼#Luna的Krystallife#?	[]	[]	-1
2	4456054253264520	010122:39	小王爷学辩论o_O	邱晨这就是我爹,爹,发烧快好,毕竟美好的假期拿来养病不太好,假期还是要好好享受快乐,爹,新年...	['https://ww2.sinaimg.cn/thumb150/006ymYXKgy1g...	[]	1
3	4456061509126470	010123:08	芩r	新年的第一天感冒又发烧的也太衰了但是我要想着明天一定会好的?	['https://ww2.sinaimg.cn/orj360/005FL9LZgy1gah...	[]	1
4	4455979322528190	010117:42	changlwj	问:我们意念里有坏的想法了,天神就会给记下来,那如果有好的想法也会被记下来吗?答:那当然了。...	[]	[]	1

数据预处理

数据预处理的一般包括:

  1. 缺失值处理
  2. 特征规范化
  3. 离散与连续化
  4. 去噪

首先查看一下数据集的基本特征:

//查看训练集各个变量的类型,数量等信息,同时查看标签数据
data.info(memory_usage='deep')
data['情感倾向'].value_counts()
变量名 数据量 数据类型
微博id 100000 non-null int64
微博发布时间 100000 non-null object
发布人账号 99978 non-null object
微博中文内容 99646 non-null object
微博图片 100000 non-null object
微博视频 100000 non-null object
情感倾向 99919 non-null object

从上表中很明显可以看出共有10000条数据,但是发布人账号、微博中文内容、情感倾向等变量从在明显的缺失值。
同时观察情感倾向这一变量中的统计值如下表:

情感倾向 数量
0 57619
1 25392
-1 16902
10 1
- 1
-2 1
9 1
· 1
4 1

发现中文内容和情感倾向两项内容与数据总量不符, 微博中文内容项只有99646条值,说明有些微博是没有文字内容的,很明显,其中0代表中立,1代表积极态度,而-1则代表消极态度,同时表格中存在一些不合理的异常值,例如10,-等值,这些错误的分类标签会影响我们的分类效果,需要对数据进行清洗,由于数据量不是很多,我们考虑将这些值删除。
同时可以看到标签数据的数据类型是object,由于接下来的模型需要,我们考虑将其转化为数值型。

//将异常值去除
data = data[data['情感倾向'].isin(['-1','0','1'])]
//将label转化为整型
data['情感倾向'] = data['情感倾向'].astype(np.int32)
变量名 数据量 数据类型
微博id 99913 non-null int64
微博发布时间 99913 non-null object
发布人账号 99913 non-null object
微博中文内容 99560 non-null object
微博图片 99913 non-null object
微博视频 99913 non-null object
情感倾向 99913 non-null int32

可以发现去除那些异常的标签数据之后,有效数据变为99913条,虽然仍然可以看到有些微博文本内容有缺失值,但文本数据不适合填充,可以考虑将其标签数据设置为0,表示中立态度。

将数据集分割为训练数据集和测试数据集。分割后的数据集有79930条训练集和19983条测试集。

可视化

接下来对数据进行一些简单的可视化操作,便于观察数据的分布和趋势,以便参数选择和结果分析。
主要查看了以下四方面的内容

  1. 三种情感倾向的分布情况
df_train['情感倾向'].value_counts()/df_train['情感倾向'].count()
(df_train['情感倾向'].value_counts()/df_train['情感倾向'].count()).plot.bar()
plt.show()

情感倾向分布
可以看出在10000条微博文本中有大概60%是持中立态度的,25%持积极态度,还有约15%持消极态度。
2. 三种感情倾向的数量变化和占比变化情况

df_train['time'] = pd.to_datetime('2020年' + df_train['微博发布时间'], format='%Y年%m月%d日 %H:%M', errors<
# emotionAnalysis 疫情背景下,基于情感词典和机器学习闻和微博评论的情感分析 # Data Science Basics in SWI, NJU, 2020-Fall > ## 计算社会学:基于NLP技术的疫情下的社会心态研究 Cong Jin , YDJSIR, Sugar Xu‘s project of 2020 Data Science Basic Course in SWI, NJU. 此为发布开源的版本而不是开发环境中使用的版本。 ## 文件结构 ```bash │ LICENSE │ README.md ├─Analyze # 分析数据的过程中所使用的所有代码 ├─Data # 原始数据以及处理过后的所有数据 ├─Report # 报告相关源文件以及最终报告的成品 └─Spyder # 爬虫代码 ``` 文件结构经过事后整理,并不是工作时目录的状态,因而代码中所涉及的路径需要稍加修改后运行。 原始报告数据在评分后抹掉相关关键词后后放出。 > ### `Data`目录下文件结构 > > 该目录下共有6个文件夹,分别对应`stage0` - `stage6` > > ##### stage内文件目录结构 > > ```bash > │ COVkeywords-Stage-.json # 人工筛选后的疫情相关关键词 > │ COVkeywords-Stage.json # 未经筛选的疫情关键词 > │ keywords-Stage.json # 从荔枝闻中获取的原始结果 > │ ratioByDate.png # 该阶段内每日疫情相关重点微博占比 > │ SaveTest.png # 疫情相关度分布拟合结果图1 > │ SaveTest_Fit.png # 疫情相关度分布拟合结果图2 > │ stageCOVWeibo.json # 该阶段内疫情相关重点微博(按时间先后排序) > │ stageCOVWeiboByImportance.json # 该阶段内疫情相关重点微博(按疫情相关度排序) > | SaveTest-热度.png # 各项热度指标占比 > │ stageInfo.json # 该阶段基础信息 > │ weiboPolar.png # 疫情相关重点微博情感极性图 > | weiboEmotion.png # 当前阶段的疫情相关微博情感倾向 > ├─YYYY-MM-DD- > ├─YYYY-MM-DD- > ├─YYYY-MM-DD- > ├─YYYY-MM-DD- > ... > └─YYYY-MM-DD- > ``` > > ##### 每个日期内文件目录结构 > > ```bash > YYYY-MM-DD > | jstvRAW.csv # 疫情相关关键词检索得到的荔枝闻原始数据 > | keywords.json # 荔枝闻正文提取出来的关键词及其乘以100以后的TextRank权值 > | wordcloud.html # 由荔枝闻生成的词云图 > | blog-Scored.json # 每篇微博都有一个疫情相关度 > | blog-COV.json # 筛选后的疫情相关微博 > | blogInfo.json # 当日博客相关基础信息 > | weiboEmotion.png # 基于心态词典的当日疫情相关微博重点评论情感分析生成的雷达图 > └─weiboEmotion.csv # 基于心态词典的当日疫情相关微博重点评论情感分析原始数据 > ``` ======= # emotionAnalysis 疫情背景下,基于情感词典和机器学习闻和微博评论的情感分析
评论 84
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值