自然语言之情感分析(中文)

自然语言之情感分析(中文)

  • 数据来源:香港金融新闻平台
  • 处理工具:python3.5
  • 处理结果:分析语言的积极/消极意义
  • 领域:金融/炒股

请随意观看表演

  • 数据准备
  • 数据清洗
  • 情感分析
  • 报错处理
  • 成果展示
  • 遗留问题

No1.数据准备

准备工作主要是对字典进行处理,将其按照类型分类写入python文件中,方便其余脚本调用。并且,将词典写入到emotion_word.txt中,使用 jieba词库 重载

将字典写入.py文件好处
  1. 方便调用:from emotion_word import *
  2. 按照类型分类,调用后,直接使用most_degree即可,避免打开txt文件的大量代码
  3. 可以使用python高级结构的方法
  4. 附一张emotion_word.py的截图
    1172464-20170527122018950-591766228.png

1172464-20170527121951325-507867857.png

写入方法

将txt字典中的每行的词语读出来,再写入列表,再print(List)。当数据少的时候可以,但是当数据达到几百以上,显然不可行。
若txt字典中的词语都是按行分布的:

word_list = []
def main():with open('emotion_word.txt','r',encoding="utf-8") as f:global word_listfor line in f.readlines():word_list.append(line.strip('\n'))with open('tem.txt','a',encoding="utf-8") as f:writted = 'word_list = '+str(word_list)+'\n'f.write(writted)if __name__=='__main__':main()

写入后,再全选复制,粘贴到对应.py文件就可以了
附截图
1172464-20170527122027325-291289060.png

No2.数据清洗

拿到的数据是这样的,附截图
1172464-20170527122058263-534062527.png

主要就是:繁体去简体,去掉html标签和各种奇葩符号
繁体和简体的转化,用到了国人的一个库,请戳这里下载 :)

使用方法很简单:

from langconv import *
#转换繁体到简体
def cht_to_chs(line):line = Converter('zh-hans').convert(line)line.encode('utf-8')return line#转换简体到繁体
def chs_to_cht(line):line = Converter('zh-hant').convert(line)line.encode('utf-8')return line

代码会在之后用类一起封装

No3.情感分析

分析title(新闻标题)和content(新闻主体)的成绩(只看正负)和方差。对于成绩,我们更重视新闻标题,因为关键词明确,数量少,影响因素少;对于方差,我们更看重新闻主体,词语多,从方差可以看出来这段新闻语气程度(肯定/不确定...)。当然,当titile成绩为0或者主体方差为0,我们会看主体的成绩和title的方差。

  1. 当前词的正负性(褒义/贬义)
  2. 检索前一个词是否是程度词/反义词
  3. 后一个词/标点是否能加深程度

字典特征

  • 字典里面的否定词:'不好',而不是'不','好'。所以否定词是和别的词连在一起的。但也有少数不是。
  • 字典包含标点符号
  • 字典有一些缺陷,并且不是针对金融领域的专门字典
class EmotionAnalysis:def __init__(self,news=None):self.news = newsself.list = []def __repr__(self):return "News:"+self.news#新闻去标签,繁->简def delete_label(self):rule = r'(<.*?>)| |\t|\n|○|■|☉'self.news = re.sub(rule,'',self.news)self.news = cht_to_chs(self.news)#得到成绩和方差def get_score(self):self.list = list(jieba.cut(self.news))index_list = zip(range(len(self.list)),self.list)score = 0mean_list = []#tem_list= []for (index,word) in index_list:#tem_list.append(word)tem_score = 0#print("NO:",index,'WORD:',word)if (word in pos_emotion) or (word in pos_envalute):tem_score = 0.1#搜索程度词if self.list[index-1] in most_degree and (index-1):tem_score = tem_score*3elif self.list[index-1] in very_degree  and (index-1):tem_score = tem_score*2.5elif self.list[index-1] in more_degree and (index-1):tem_score = tem_score*2elif self.list[index-1] in ish_degree and (index-1):tem_score = tem_score*1.5elif self.list[index-1] in least_degree and (index-1):tem_score = tem_score*1else:pass#搜索否定词/反意词if (self.list[index-1] in neg_degree and index!=0)  or  (index<len(self.list)-1 and self.list[index+1] in neg_degree):tem_score = -tem_score#print("|  tem_score:",tem_score)elif (word in neg_emotion) or (word in neg_envalute):tem_score = -0.3if self.list[index-1] in most_degree and (index-1):tem_score = tem_score*3elif self.list[index-1] in very_degree  and (index-1):tem_score = tem_score*2.5elif self.list[index-1] in more_degree and (index-1):tem_score = tem_score*2elif self.list[index-1] in ish_degree and (index-1):tem_score = tem_score*1.5elif self.list[index-1] in least_degree and (index-1):tem_score = tem_score*1else:pass#print("|  tem_score:",tem_score)mean_list.append(tem_score)score+=tem_score#print(tem_list)#返回(成绩,方差)return (score,np.var(mean_list))

No4.报错处理

一共231506条新闻,为了方便回查,设置报错处理(在数据库操作的类里实现)

log_file = 'error.log'
class SQL(object):......def run(self,cmd,index):try:self.read_SQL(cmd,index)self.operate()self.write_SQL(index)self.w_conn.commit()except Exception as r:self.r_conn.rollback()self.w_conn.rollback()error = "ID "+str(self.r_dict['id'])+str(r)global log_filelog_error(log_file = log_file,error=error)

No5.成果展示

由于var太小,所以扩大了1w倍,便于观察相对大小和后期工作的进行。请观察id,来观看结果(为了方便显示,导入到了两个csv文件)
1172464-20170527122157935-967570437.png

1172464-20170527122222169-174643125.png

1172464-20170527122211825-1248812521.png

No6.遗留问题

  • 在EmotionAnalysis类里的get_score函数里,对应的分值容易确定。(有空看一下机器学习,maybe能改进)。所以现在的分数只能看正负,来确定消极或积极。但对于这种金融新闻(特点:言简意赅),效果还可以。
  • 字典问题,请看 No3里面的字典特征

转载于:https://www.cnblogs.com/AsuraDong/p/emotion_analysis.html

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

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

相关文章

MySQL的IFNULL() 函数使用

IFNULL() 函数用于判断第一个表达式是否为 NULL&#xff0c;如果为 NULL 则返回第二个参数的值&#xff0c;如果不为 NULL 则返回第一个参数的值。 IFNULL() 函数语法格式为&#xff1a; IFNULL(expression, alt_value) 如果第一个参数的表达式 expression 为 NULL&#xff…

EM算法原理总结

EM算法也称期望最大化&#xff08;Expectation-Maximum,简称EM&#xff09;算法&#xff0c;它是一个基础算法&#xff0c;是很多机器学习领域算法的基础&#xff0c;比如隐式马尔科夫算法&#xff08;HMM&#xff09;&#xff0c; LDA主题模型的变分推断等等。本文就对EM算法的…

hideprocess in bcb

#define NO_WIN32_LEAN_AND_MEAN #include <aclapi.h> #include <shlobj.h> #include <windows.h> #include <Accctrl.h> #include "HideProcess.h" #include <vcl.h> 转载于:https://blog.51cto.com/linkboy/300529

pugixml解析Word

使用pugixml开源库接口并扩展&#xff0c;解析Word 文字和table 上下行位置关系 1.遍历指定节点下所有节点&#xff0c;包括当前节点下各个层的节点&#xff0c;判断某个节点的存在否 2. find_node&#xff08;&#xff09;函数使用&#xff0c;predicate 参数构造传入方法 3.…

[51nod1264]线段相交

给定两个点: typedef struct { double x, y; } Point; Point A1,A2,B1,B2; 首先引入两个实验&#xff1a; a.快速排斥实验 设以线段A1A2和线段B1B2为对角线的矩形为M,N; 若M,N 不相交&#xff0c;则两个线段显然不相交&#xff1b; 所以&#xff1a;满足第一个条件时&#xf…

谁来理解外来工的孩子的心理健康?

儿子的心情最近不太好。我住在公司管理层宿舍里&#xff0c;儿子一直都感觉比较寂寞&#xff0c;因为这里基本上没有他的同伴。中午&#xff0c;儿子拿着他心爱的枪&#xff0c;站在食堂的旁边&#xff0c;忧郁地看着每一个匆匆赶路的人。他的心里肯定在想&#xff1a;这些人为…

Qt 在designer 中给QToolBar 添加 action控件

Qt 在designer 中给QToolBar 添加 action控件 1.在action editor 添加控件 SendData不出现使用打钩时 2. 使用鼠标直接拖拽到Ui指定位置

Windows环境下通过Git来管理自己的Android代码

前面已经介绍了在Windows下使用git工具来下载Android的源代码&#xff0c;Windows环境下通过Git得到Android源代码&#xff0c;这里记录我使用git工具来管理我自己的代码&#xff0c;git是一种分布式的项目管理工具而CVS及SVN都是集中式的版本号控制系统集中式版本号控制系统最…

rh9.0虚拟机dmesg启动过程分析(1)

Linux version 2.4.20-8 ([email]bhcompileporky.devel.redhat.com[/email]) (gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) #1 Thu Mar 13 17:54:28 EST 2003#linux内核版本&#xff1a;2.4.20-8#Gcc版本&#xff0c;c编译器版本&#xff1a;3.2.2#当前发行版本的发布…

Qt QByteArray 转换 QString QT5.12.7

Qt QByteArray 转换 QString QT5.12.7 void MainWindow::slot_send() { const QString data m_sendLineEdit->text(); qDebug() << "shu ru: " << data.toLocal8Bit(); QByteArray data1 data.toLocal8Bit(); writeData(data1); }

Hello world开始

一切都从Hello world开始&#xff0c;代码如下&#xff1a; 1 #!/usr/bin/env python 定义程序执行过程中调用的环境 在linux下 直接调用python来解析执行该文件 2 #-*- coding:utf-8 -*- 也可以是 #codingutf-8 &#xff0c;作用是设置代码在执行过程中的编码形式&…

ASP中事务处理资料收集

在IIS 中&#xff0c;ASP结构提供了六个内建对象&#xff0c; 内建对象的特殊性在于&#xff0c;它们在 ASP 页内生成且在脚本中使用它们前无须创建。其中&#xff0c;内建对象ObjectContext专门用于支持开发基于Microsoft Transaction Server&#xff08;MTS&…

2020年工作总结大会感悟

数字孪生&#xff1a;具有数据预测分析意义 开发工作: 高质量以做产品的标准去思考 最主要的问题&#xff1a;沟通增加 现场经验: 遇事处理先冷静下来想办法&#xff0c;戒急戒躁 转变观念: 善于求助问题&#xff0c;乐于帮助求助者&#xff0c;心中有集体花少的时间做更多的事…

2016和2017的区别就是昨晚和今早

2016和2017的区别就是昨晚和今早 也是历史和未来 只是在跨年份是时候更有感觉&#xff0c;更让人思考和感叹。一年这个周期寒来暑往秋收冬藏&#xff0c;对我们的目标再审视&#xff0c;我们的收莸再总结&#xff0c;对我们的不足再反思&#xff0c;对我们的心态用调整。 形势比…

dot Net Frameworks中常见的设计模式

响应一下Anders Liu的号召(http://www.cnblogs.com/AndersLiu/archive/2007/05/29/763456.html)&#xff0c;列几个自己经常遇到的实现SINGLETON&#xff1a;System.DBNull.Value FACTORY METHOD&#xff1a;System.Data.IDbConnection.CreateCommand ()、System.Data.IDbComma…

如何构建一个向导操作模式程序

引导新用户熟悉产品的方式多种多样&#xff0c;向导程序是其中最经典也是最常用的一种。今天的文章&#xff0c;我们来聊聊向导程序的设计模式。 什么是向导程序 向导程序通常会提供一系列的步骤或者目标&#xff0c;让用户在完成步骤达成目标的过程中&#xff0c;逐步熟悉这个…