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

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

  • 数据来源:香港金融新闻平台
  • 处理工具: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…

[51nod1264]线段相交

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

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都是集中式的版本号控制系统集中式版本号控制系统最…

Hello world开始

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

13 Tensorflow机制(翻译)

代码&#xff1a; tensorflow/examples/tutorials/mnist/ 本文的目的是来展示如何使用Tensorflow训练和评估手写数字识别问题。本文的观众是那些对使用Tensorflow进行机器学习感兴趣的人。 本文的目的并不是讲解机器学习。 请确认您已经安装了Tensorflow。 教程文件 文件作用mn…

有趣的Web版Ubuntu Linux

其实这不是真的 Ubuntu 啦。不过&#xff0c;在看到 Wubuntu 时&#xff0c;其逼真的模仿效果真是令人惊叹不已。不管怎么样&#xff0c;让我们来体验一把 Web 版的 Ubuntu 吧。首先&#xff0c;我们会经历一个 Ubuntu 启动过程。其启动画面与真实的 Ubuntu 一模一样。接着&…

重新定义旅游网站,米胖新版发布

还记得一年多之前&#xff0c;我在web 2.0 网站推荐这篇博客中提到了米胖。没多久&#xff0c;我认识了米胖的两位帅气又有才气的当家人。在多次聊天之后&#xff0c;我被他们的激情与专注深深地折服了&#xff0c;在那时我就坚信米胖一定能够发展得很好&#xff0c;走出一条属…

wait和notify使用例子

public class Test2 {public static void main(String[] args) {String lock "lock";Thread thread1 new Thread(new Runnable() {Overridepublic void run() {synchronized (lock){System.out.println("线程1开始等待" System.currentTimeMillis());tr…

Linux基础系列:常用命令(5)_samba服务与nginx服务

作业一&#xff1a;部署samba 每个用户有自己的目录&#xff0c;可以浏览内容&#xff0c;也可以删除 所有的用户共享一个目录&#xff0c;只能浏览内容&#xff0c;不能删 安装samba服务 1、准备环境 setenforce 0 2、安装软件包 yum -y install samba 3、修改配置文件 /etc/s…

python练习,随机数字 函数,循环,if,格式化输出

# double ball game import random count 10000000000 # 设置多少注 blue_start 1 blue_end 5 a [] def make_surprise():i 0while i < 6:i 1number random.randrange(1, 32, 1)a.append(format({:02d}.format(number)))a.append(format({:02d}.format(rando…

notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象

notify()唤醒线程&#xff0c;不会立即释放锁对象&#xff0c;需要等到当前同步代码块都执行完后才能释放锁对象 public class Test3 {public static void main(String[] args) {List<String> list new ArrayList<>();Thread thread1 new Thread(new Runnable(…

LINUX下的APACHE的配置

今天写一下LINUX下的APACHE的配置方法。APACHE是作为WEB服务器的。它的优点在于用缓存方式来加快网页的搜索速度。APACHE缺省只支持静态网页LINUX下有APACHE的RPM包安装上第一张盘里的httpd-2.0.40-21.i386.rpm 包1 /etc/httpd/conf.d 放在这里的都是动态网页的配置文件2 /etc/…

程序实践:命令行之连连看

命令行之连连看 程序实践周课题&#xff0c;VC6.0上可编译执行 游戏截图&#xff1a; #include <cstdio>#include <cstring> #include <iostream> #include <windows.h> #include <time.h> #include <algorithm> using namespace std; in…

interrupt()会中断线程的wait等待

public class Thread5 {public static void main(String[] args) {SubThread subThread new SubThread();subThread.start();try {//主线程睡眠2秒&#xff0c;确保子线程处于wait状态Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}subThread.i…

在ASP.Net 2.0中实现多语言界面的方法

1&#xff0e; 跟以前一样做界面&#xff0c;只是注意&#xff0c;把所有需要有多语言界面的文字都用label来做 2&#xff0e; 做完以后&#xff0c;在Solution Explorer里选中这个文件&#xff0c;选Tools-&#xff1e;Generate Local Resource3&#xff0e; 你会发现生成了一…