【python文本分析】——基于股评文本的情绪分析

2023-10-29

一、文本处理

中文分词是中文文本处理的一个基础步骤。jieba分词工具是最常见的语言分词工具:

import jieba
import jieba.posseg as psg
from collections import Counter

jieba分词中有三种分词模式,不同的分词模式将直接影响分词的结果:

1、精确模式(默认)

试图将句子最准确的切开,适合文本分析:

text = '我现在在jupyter notebook上写文本分析的代码!'
cut = jieba.cut(text)
'/'.join(cut)

在这里插入图片描述
除此之外还可以给出各个词语的词性:

words = psg.cut(text)
for word,flag in words:
    print(word,flag)

在这里插入图片描述

2、全模式

把句子中所有可以组成词的词语都扫描出来,速度快,但不能解决歧义:

'/'.join(jieba.cut(text,True))

在这里插入图片描述
很显然,它将所有可以组成词的词语都扫描出来,但出现了一些原意中不应该出现的词语,如“本分”

3、搜索引擎模式

在精确模式的基础上,对长词再次切分,提高召回率,是用于搜索引擎分词:

baogao = open('...\\政协报告.txt', encoding = 'UTF-8').read()
print('文本长度:',len(baogao))
baogao_words = [x for x in jieba.cut(baogao) if len(x)>=2]
c = Counter(baogao_words).most_common(20)
c

在这里插入图片描述

baogao_words1 = [x for x in jieba.cut_for_search(baogao) if len(x)>=2]
c1 = Counter(baogao_words1).most_common(20)
c1

在这里插入图片描述
从两张图的差异可以看出,精确模式中“人民政协”中的“政协”并没有算到“政协”出现的次数之中,需要利用搜索引擎模式才能把文中所有“政协”出现的次数算到一起

二、词云图

词云图是由词汇组成类似云的彩色图形,利用词云图可以过滤文章大量无关紧要的文本信息,使浏览者能够很直接客观地凭借视觉感官提取文本中的主题内容

1、wordcloud模块导入

import jieba.analyse
import matplotlib as mpl
import matplotlib.pyplot as plt
from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator

词云图主要用到的是WordCloud词云包

2、词云图实现

content = open('...\\政协报告.txt', encoding = 'UTF-8').read()
tags = jieba.analyse.extract_tags(content,topK=200,withWeight=False)
text = ' '.join(tags)
wc = WordCloud(font_path='C:\\Windows\\Fonts\\华文行楷.ttf',
              background_color='white',max_words=100,
              max_font_size=120,min_font_size=10,
              random_state=42,width=1200,height=900)
wc.generate(text)
plt.imshow(wc)
plt.axis('off')
plt.show()

读取相关文件后,用jieba分词,再筛选出出现频率较高的200个词语生成词云图
在这里插入图片描述

三、实例——利用股评进行情绪分析

1、数据来源及snownlp模块导入

相关股评来自新浪财经-股市及时雨标题信息
https://finance.sina.com.cn/roll/index.d.html?cid=56589&page=1
情绪分析利用SnowNLP进行打分,得分在0~1之间,0表示消极、1表示积极,0.5可用于区分积极与否

import pandas as pd
from snownlp import SnowNLP
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
sns.set_style('whitegrid',{'font.sans-serif':['simhei','Arial']})

在这里插入图片描述
股票数据的获取可参考我之前写的文章
Python量化交易策略及回测系统

2、代码实现

2.1、读取股评文件

comments = pd.read_csv('...\\情绪.csv',index_col=0)
comments.head()

在这里插入图片描述

2.2、处理数据

i=0
while(i<lencom):
    comments.iloc[i,1]=str(comments.iloc[i,1])[1:7]
    i+=1
comments.head()

由于爬取的“日期”数据中出现了较多的其他信息,我们可以将这些数据处理一下:
在这里插入图片描述

2.3、计算情绪指数

comments['情绪'] = None
lencom = len(comments)
i=0
while(i<lencom):
    s=SnowNLP(comments.iloc[i,0]).sentiments
    comments.iloc[i,2]=s
    i+=1
comments.head()

利用股评文本,计算相应情绪指数,并将这些数据增加到DataFrame数据中的“情绪”一列中:
在这里插入图片描述

2.4、计算每日情绪均值

numbyday = comments['情绪'].groupby(comments['日期']).count()
emobyday = comments['情绪'].groupby(comments['日期']).sum()
markbyday = pd.DataFrame()
markbyday['情绪']=emobyday
markbyday['计数']=numbyday
markbyday['情绪指数']=markbyday['情绪']/markbyday['计数']
markbyday.head()

在这里插入图片描述

2.5、获取股票数据

import akshare as ak
sh_df = ak.stock_zh_a_daily(symbol='sh000001', start_date='20220209', end_date='20220328')
sh_df

在这里插入图片描述

2.6、计算股票涨跌幅

market = pd.DataFrame()
market['日期']=sh_df.iloc[1:,0]
market['change']=sh_df['close'].pct_change(periods=1)
market

在这里插入图片描述

2.7、数据再处理

i=0
lenmark=len(markbyday)
markbyday['order']=markbyday.index
markbyday['日期']=None
while(i<lenmark):
    str1 = markbyday.iloc[i,3]
    str2 = '2022-'+str1[0:2]+'-'+str1[3:5]
    markbyday.iloc[i,4]=str2
    i+=1
markbyday.head()

由于两个DataFrame数据合并需要它们的索引一致,因此在情绪指数数据中增加一列“日期”数据,使这些数据与股票涨跌幅数据中的“日期”数据类型一致,便于合并:
在这里插入图片描述

2.8、数据合并

markbyday.set_index('日期',inplace=True)
market.set_index('日期',inplace=True)
result = market.join(markbyday)
result

在这里插入图片描述

2.9、数据可视化

plt.figure(figsize=(10,8))
plt.plot(result['change'],label='上证波动')
plt.plot(result['情绪指数'],label='情绪波动')
plt.title('市场波动与情绪指数')
plt.xlabel('交易日期',fontsize=15)
plt.ylabel('波动率',fontsize=15)
plt.legend(loc='best')
plt.show()

最终,将股票涨跌幅数据和情绪指数数据展现出来

3、结果分析

3.1、折线图

在这里插入图片描述
从图中可以看出,股票的上下波动与情绪的乐观与否是相对应地发生变化的,而且当股票收益率有向下趋势时,情绪也随之从较乐观(0.68)到较悲观(0.42)转变

3.2、词云图

lencom = len(comments)
i=0
text=''
while(i<lencom):
    text = text + comments.iloc[i,0]
    i+=1
tags1 = jieba.analyse.extract_tags(text,topK=100,withWeight=False)
text1 = ' '.join(tags1)
wc1 = WordCloud(font_path='C:\\Windows\\Fonts\\华文行楷.ttf',
              background_color='white',max_words=100,
              max_font_size=120,min_font_size=10,
              random_state=42,width=1200,height=900)
wc1.generate(text1)
plt.imshow(wc1)
plt.axis('off')
plt.show()

除了情绪指数之外,我们也可以通过词云图观察,与情绪相关的、出现较多次的词语有:强势、回落、震荡、冲高、领涨、涨停、走弱……
在这里插入图片描述

结语

文本分析是数据分析当中的重要领域。利用分词、词频统计、词云图制作和语句情景分析等技术,可以从文本素材中发现很多有价值的数据和规律。在金融数据分析中,文本分析可用于财经舆情监测、股评情绪分析、会计报表分析等场景的实际案例之中。

大家如果觉得文章不错的话,记得收藏、点赞、关注三连~

如果需要相关数据可以私信找我

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【python文本分析】——基于股评文本的情绪分析 的相关文章

  • Python 中的哈希映射

    我想用Python实现HashMap 我想请求用户输入 根据他的输入 我从 HashMap 中检索一些信息 如果用户输入HashMap的某个键 我想检索相应的值 如何在 Python 中实现此功能 HashMap
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 使用Python请求登录Google帐户

    在多个登录页面上 需要谷歌登录才能继续 我想用requestspython 中的库以便让我自己登录 通常这很容易使用requests库 但是我无法让它工作 我不确定这是否是由于 Google 做出的一些限制 也许我需要使用他们的 API 或
  • 您可以格式化 pandas 整数以进行显示,例如浮点数的“pd.options.display.float_format”?

    我见过this https stackoverflow com questions 18404946 py pandas formatdataframe and this https stackoverflow com questions
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • 如何在不丢失注释和格式的情况下更新 YAML 文件 / Python 中的 YAML 自动重构

    我想在 Python 中更新 YAML 文件值 而不丢失 Python 中的格式和注释 例如我想改造 YAML 文件 value 456 nice value to value 6 nice value 界面类似于 y yaml load
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 如何在 pygtk 中创建新信号

    我创建了一个 python 对象 但我想在它上面发送信号 我让它继承自 gobject GObject 但似乎没有任何方法可以在我的对象上创建新信号 您还可以在类定义中定义信号 class MyGObjectClass gobject GO
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • Scipy Sparse:SciPy/NumPy 更新后出现奇异矩阵警告

    我的问题是由大型电阻器系统的节点分析产生的 我基本上是在设置一个大的稀疏矩阵A 我的解向量b 我正在尝试求解线性方程A x b 为了做到这一点 我正在使用scipy sparse linalg spsolve method 直到最近 一切都
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • Ajax简介

    目录 Ajax简介 Ajax特点 基础语法 数据编码格式 form表单中 Ajax中 ajax携带数据 回调函数 序列化 响应状态码 Ajax简介 AJAX 全称Asynchronous JavaScript And XML 即异步JS和X
  • react hooks组件间的传值方式(使用ts),子孙传值给祖先组件

    父子组件传值 参考 react hooks组件传值 父传子很简单 只要父组件传参 子组件写好interface childProps和props去接收即可 子传父稍复杂 父组件写一个回调函数 changeTaskState id any g
  • AIGC,驱动架构与业务的新动力

    本期CCF TF第117期 AIGC 驱动架构与业务的新动力 活动由CCF TF架构SIG承办 新浪协办 邀请到了科大讯飞 阿里云 去哪儿网 新浪微博等多位互联网技术专家 共同分享交流如何通过应用AIGC技术 驱动架构和业务高效发展 为工程
  • 【满分】【华为OD机试真题2023 JS】数字加减游戏

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 数字加减游戏 知识点广搜 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 小明在玩一个数字加减游戏 只使用加法或者减法 将一个数字s变成数字t 每个回合 小明可以
  • 修复VMware网络连接失败及设置固定IP

    最近被这个网络折磨疯了 记录一下怎么修复虚拟机网路连接 VM软件安装好后 就有10个网络连接类型可供选择 分别是 VMnet0 VMnet1 VMnet2 VMnet3 VMnet4 VMnet5 VMnet6 VMnet7 VMnet8
  • 数据库操作:汇总数据(聚集函数)

    我们经常需要汇总数据而不用把它们实际检索出来 为此MySQL提供了专门的函数 聚集函数运行在行组上 计算和返回单个值的函数 SQL聚集函数 1 AVG 返回某列的平均值 2 COUNT 返回某列的行数 3 MAX 返回某列的最大值 4 MI
  • java数组及数组函数

    数组求和 1 System out println 1 2 3 4 5 getSum 1 2 3 4 5 5个参数 public static int getSum int numbers 可变长形参 本质为数组 int sum 0 for
  • 服务器系统要用GUID还是MBR,分享win10分区格式MBR和GUID有什么区别 教你区分MBR和GUID格式...

    今天IT天空小编要给大家分享下最新的教程 电脑装win10系统需要选择正确的分区格式 这样电脑才能保持正常运转 如果格式安装错误 电脑就没办法继续运行了 一般情况下 win10分区格式MBR和GUID两种选择 那么这两者有何区别 电脑小白肯
  • 华为ensp,实战案例一一使用模拟器构建局域网络

    1 案例目标 I 通过组网设计 掌握小型网络的组建 路由的设计 对小型网络系统进行分析 提出建网解决方案 2 综合运用路由 VLAN的相关技术 3 综合运用VLAN创建 Access和Trunk接口配置 VLAN间路由配置 DHCP 也址池
  • 民族代码设计

    民族代码和对应民族名称 在开发时 设计民族的数据字典 民族代码 民族名称 01 汉族 01 汉族 02 蒙古族 03 回族 04 藏族 05 维吾尔族 06 苗族 07 彝族 08 壮族 09 布依族 10 朝鲜族 11 满族 12 侗族
  • 基于遗传算法的BP神经网络优化算法(matlab实现)

    1 理论基础 1 1 BP神经网络概述 BP网络是一类多层的前馈神经网络 它的名字源于在网络训练的过程中 调整网络的权值的算法是误差的反向传播的学习算法 即为BP学习算法 BP算法是Rumelhart等人在1986年提出来的 由于它的结构简
  • Scanner 类

    目录 1 什么是Scanner类 2 创建Scanner类的基本语法 3 使用next方法 4 使用nextLine方法 5 next 与nextLine 6 数据类型的接收方式 7 Scanner类知识扩展 8 今日箴言 1 什么是Sca
  • JAVA代码规范

    一 MyBatis 不要为了多个查询条件而写 1 1 二 迭代entrySet 获取Map 的key 和value 三 使用Collection isEmpty 检测空 四 初始化集合时尽量指定其大小 五 若需频繁调用Collection
  • C++之I/0流操作(标准流、文件流、二进制操作等)

    目录 标准输入输出 文本文件输入输出 文件类型 文件打开方式 写文件 读文件 二进制文本输入输出 写文件 读文件 字符串输入输出 往流里面输出 从流里面读出 格式控制 流 stream 为C 的输入输出操作提供了许多的便利 通常我们使用的流
  • Django(9)-表单处理

    django支持使用类创建表单实例 polls forms py from django import forms class NameForm forms Form your name forms CharField label Your
  • 面试准备:Mybatis常见面试题汇总

    文章目录 1 和 的区别是什么 2 当实体类中的属性名和表中的字段名不一样 怎么办 3 模糊查询like语句该怎么写 4 Mybatis 一对一 一对多的xml怎么写 5 Dao 接口的工作原理是什么 Dao 接口里的方法 参数不同时 方法
  • Python中函数,类,模块,包,库的区别

    文章目录 关系图 参考文章 关系图 参考文章 借鉴了以下文章 Python中函数 类 模块 包 库的区别 一分钟带你分清Python的模块 包和库的区别 python中的模块 库 包有什么区别
  • c# 保存软件配置

    保存配置方法 一 Settings setting 文件 1 1 配置Settings settings文件 1 2 加载配置信息 1 3 保存配置信息 二 使用文本保存 2 1 引入命名空间 2 2 新增IniConfigHelper 类
  • 装win10提示“在EFI系统上,Windows只能安装到GPT磁盘”

    在安装界面 按 shift F10 键 在命令提示符窗口依次执行如下命令 输入 diskpart 命令后 按enter键 进入到 DISKPART 模式 输入 list disk 命令后 按enter键 查看电脑的硬盘 编号0 表示电脑的第
  • 【python文本分析】——基于股评文本的情绪分析

    目录 一 文本处理 1 精确模式 默认 2 全模式 3 搜索引擎模式 二 词云图 1 wordcloud模块导入 2 词云图实现 三 实例 利用股评进行情绪分析 1 数据来源及snownlp模块导入 2 代码实现 2 1 读取股评文件 2