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%。当然,正如我们前面所说,这个模型显然还有很大的改进空间。
- PHP10个实用函数
- ASP.NET AJAX(2)__ASP.NET 2.0 AJAX Extensions
- Android利用V4包中的SwipeRefreshLayout实现上拉加载
- 在Scala项目中使用Spring Cloud
- Scala的面向对象与函数编程
- ASP.NET AJAX(1)__Microsoft AJAX LibraryASP.NET AJAX(1)__Microsoft AJAX Library
- 大数据流处理平台的技术选型参考
- PHP预定义变量数组种类概览
- PHP网络技术(二)——模拟网络灌水攻防
- PHP Predefined Interfaces 预定义接口
- 如何在咨询项目开展Inception
- PHP网络技术(三)——CURL实现跨服务取接口功能
- PHP网络技术(四)——Socket简介
- PHP网络技术(五)——cookie及记住用户名功能实现
- 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 数组属性和方法
- WordPress缩略图出现A TimThumb error has occured解决办法
- 2020-09-30:谈谈内存对齐。
- leetcode树之对称二叉树
- 【网络技术联盟站】网络安全 | 瑞哥带你全方位解读防火墙技术!
- 腾讯云服务器CVM+CentOS,部署LAMP环境快速搭建WordPress博客
- leetcode栈之有效的括号
- JSON Web Token 的结构是什么
- codeforces 1429E(dp)
- Linux Ubuntu 安装 Fish Shell 教程以及配置和使用方法
- 2020-10-02:golang如何写一个插件?
- Kubernetes 1.19.0——健康性检查
- leetcode栈之用两个栈实现队列
- Ui Automator 框架和Ui Automator Viewer你会用吗?附送「必备adb命令」拿走不谢 !
- 3分钟短文:Laravel模型读数据的那个“障眼法”
- 你有一份面试题要查收