tweet情感分析流程
关键字全网搜索最新排名
【机器学习算法】:排名第一
【机器学习】:排名第二
【Python】:排名第三
【算法】:排名第四
前言
自然语言处理(NLP)中一个很重要的研究方向就是语义的情感分析(Sentiment Analysis)。例如IMDB上有很多关于电影的评论,那么我们就可以通过Sentiment Analysis来评估某部电影的口碑,甚至还可以据此预测它是否能够卖座。同样,豆瓣上也有很多对影视作品或者书籍的评论内容亦可以作为情感分析的语料库。对于那些电子商务网站而言,针对某一件商品,我们也可以看到留言区里为数众多的评价内容,那么同类商品中,哪个产品最受消费者喜爱呢?或许对商品评论的情感分析可以告诉我们答案。
本文尝试将机器学习和自然语言处理结合起来,以Tweet为例,演示进行Sentiment Analysis的基本方法。主要目的在于熟悉Sentiment Analysis的基本过程,深化Scikit-Learn函数库的使用,而且我们所分析的数据来自于实际数据集,而非模拟数据集,所以最终的分析结果并不保证得到非常高的准确率。要得到更高的准确率,需要在模型构建和特征选择上做更深层次的思考,而这些“思考”已经超出本文所讨论的范围。
1. 了解数据
原始数据通常包含多种其他的信息,如图片,链接等,我们仅将文字内容进行保存用于后续的情感分析。例如,
Top 5 most searched for Back-to-School topics -- the list may surprise you http://t.co/Xj21uMVo0p @bing @MSFTnews #backtoschool
@Microsoft @taehongmin1 We have an IOT workshop by @Microsoft at 11PM on the Friday - definitely worth going for inspiration! #HackThePlanet
同时,对于训练集而言,我们同时还需要拥有一个 label,其中:+1表示positive, -1表示negative,0表示neutral。
2. 数据预处理
主要进行如下的预处理
1. 剔除了@***这样的内容;
2. 对于#引导的Topic,将其视为一个独立的句子进行处理;
3. 删除了由http引导的网络地址;
4. 统一了大小写。
我们得到上述两个Tweet处理之后的结果,并将结果保存在list列表中,展现在下面。
[['top', '5', 'most', 'searched', 'for', 'back', '-', 'to', '-', 'school', 'topics', '--', 'the', 'list', 'may', 'surprise', 'you', '.'], ['back', 'to', 'school', '.']]
[['we', 'have', 'an', 'iot', 'workshop', 'by', 'at', '11pm', 'on', 'the', 'friday', '-', 'definitely', 'worth', 'going', 'for', 'inspiration', '!'], ['.'], ['hack', 'the', 'planet', '.']]
3. 构建词带
然后,根据训练数据集创建一个词袋(BOW,bag-of-word),其中存储着所有训练数据集中出现过的词汇以及它们在全文中出现的频数。目的在于剔除那些在全部训练数据集中极少出现的词汇(生僻词)以及频繁出现但毫无意义的词汇(通常称之为停词 stop words)。
在BOW基础之上,接下来就可以为每条Tweet创建创建 feature dictionaries。特征字典是指每条Tweet中出现在BOW中的词(即剔除了罕见的生僻词和停词)以及它们在该条Tweet中出现的频数构成的字典。
{'-': 2, '--': 1, '.': 2, '5': 1, 'back': 2, 'list': 1, 'may': 1, 'school': 2, 'searched': 1, 'surprise': 1, 'top': 1, 'topics': 1}
{'!': 1, '-': 1, '.': 2, '11pm': 1, 'definitely': 1, 'friday': 1, 'going': 1, 'hack': 1, 'inspiration': 1, 'iot': 1, 'planet': 1, 'workshop': 1, 'worth': 1}
到此为止,所有的预处理工作都已经完成了。训练集合测试集已经准备完成。但是上述这种形式的数据很那使用,因此,借助于Scikit-Learn中提供的特征提取(Feature Extraction)模块。
首先,我们给出它的定义原型:
class sklearn.feature_extraction.DictVectorizer(dtype=, separator='=', sparse=True,sort=True)
其中sparse是一个布尔类型的参数,用于指示是否将结果转换成scipy.sparse matrices,即稀疏矩阵,缺省情况下其赋值为True。
举个例子,
from sklearn.feature_extraction import DictVectorizer
measurements = [
{'city': 'Dubai', 'temperature': 33.},
{'city': 'London', 'temperature': 12.},
{'city': 'San Fransisco', 'temperature': 18.},
]
vec = DictVectorizer()
vec.fit_transform(measurements).toarray()
vec.get_feature_names()
建立稀疏矩阵的代码如下
sparse_matrix_tra = vec.fit_transform(feature_dicts_tra)
sparse_matrix_dev = vec.transform(feature_dicts_dev)
然后利用Logistic Regression来建立分类模型
from sklearn import linear_model
logreg = linear_model.LogisticRegression(C = 1)
logreg.fit(sparse_matrix_tra, labels_t)
prediction = logreg.predict(sparse_matrix_dev)
print(logreg)
print("accuracy score: ")
print(accuracy_score(labels_d, prediction))
print(classification_report(labels_d, prediction))
该模型对测试集的预测结果
LogisticRegression(C=1, class_weight=None, dual=False, fit_intercept=True, intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
verbose=0, warm_start=False)
accuracy score:
0.512848551121
precision recall f1-score support
-1 0.41 0.28 0.33 360
0 0.46 0.69 0.55 700
1 0.68 0.46 0.55 769
avg / total 0.54 0.51 0.51 1829
该Sentiment分类模型的准确率为51.28%。当然,正如我们前面所说,这个模型显然还有很大的改进空间。
- 如何用SPSS分析问卷?用SPSS分析调查问卷数据的方法
- 【5】基于Log4Net的日志系统
- VMware vSphere虚拟化-VMware ESXi 5.5组件安装过程记录
- 淘宝iOS端圣诞节雪花实现分析
- 【6】页面数据和控件的自动交换机制
- silverlight版的图片轮换广告
- Centos下PPTP环境部署记录
- 电商小程序的场景使用和营销手段
- 你真的很熟分布式和事务吗?
- Linux下monit进程管理操作梳理
- 运维中的日志切割操作梳理(Logrotate/python/shell脚本实现)
- 线上图片批量更换脚本记录
- memcached程序端口监控脚本
- mysql操作命令梳理(5)-执行sql语句查询即mysql状态说明
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PAT (Basic Level) Practice (中文)1077 互评成绩计算
- PAT (Basic Level) Practice (中文)1081 检查密码
- PAT (Basic Level) Practice (中文)1082 射击比赛
- PAT (Basic Level) Practice (中文)1083 是否存在相等的差
- 2017年天梯赛全国总决赛题集 L2-1 点赞狂魔
- 2017年天梯赛全国总决赛题集 L1-4 稳赢
- 2017年天梯赛全国总决赛题集 L1-8 矩阵A乘以B
- 你真的了解synchronized吗?
- 2017年天梯赛大区赛题集 7-1 出生年
- 2017年天梯赛大区赛题集 7-9 人以群分
- 浙大版《C语言程序设计(第3版)》题目集 练习2-1 Programming in C is fun!
- 浙大版《C语言程序设计(第3版)》题目集 练习2-3 输出倒三角图案
- 这款网络排查工具,堪称神器!
- 浙大版《C语言程序设计(第3版)》题目集 练习2-4 温度转换
- 浙大版《C语言程序设计(第3版)》题目集 练习2-6 计算物体自由下落的距离