机器学习-情感分析-入门实战案例
前言
情感分析属于自然语言处理的一部分,其任务是,给定一个文本,判断这个文本所表达的情感是正面的,中立的,还是负面的。这被广泛用于:
1. 商品好评度自动检测。
2. 微博推特等平台用户发言是开心赞美还是批评抱怨。
本次带领大家使用机器学习的方法对情感分析做一次实战。
注意:此次侧重于机器学习实战的一个流程,而不会详细讲具体的机器学习算法。对于想要体验一把的新手会比较友好。另外,对于新手,我要提醒的是,体验一个完整的流程并弄明白,耗时很久是很正常的事,切勿急躁哦。
相关数据
我们的数据是推特上用户发的推特,我们的任务是训练得到一个模型,给定一个没有见过的推特发言时,判断其是开心赞美(positive
)还是批评抱怨(negative
)还是中立(neutral
)。比如给定“bullying me”
(欺负我),模型需要能够输出“negative”
。
本次数据已经上传至github。我们本次实战只用其中的train.csv
文件。
实战
1. 导入相关包和模型。
import pandas as pd
import numpy as np#将train.csv划分训练集和测试集
from sklearn.model_selection import train_test_split
#将文本变成向量,这是自然语言处理的常用技术
from sklearn.feature_extraction.text import TfidfVectorizer#逻辑回归模型
from sklearn.linear_model import LogisticRegression
#支持向量机
from sklearn.svm import LinearSVC
#朴素贝叶斯
from sklearn.naive_bayes import MultinomialNB#训练完成后,对模型的评价
from sklearn.metrics import accuracy_score,classification_report#对于上面的包,你只需要会pandas和numpy两个包,其他不会不要紧,如果连pandas和numpy都不会,要么先去学(比较建议),要么看下去不懂再查。
2. 读取数据。此处路径需要改成自己数据所在路径。
data=pd.read_csv("data/tweet-sentiment-extraction/train.csv")
data.head(5)
3. 构造模型的输入和输出,为了简便,输入我们选择selected_text,输出的标签是sentiment。其他两列不要了。
datax=data["selected_text"]
datay=data["sentiment"]
print(datax.shape)
print(datay.shape)
4. #划分训练集和测试集。其中测试集用来选择模型或者超参数。可以参考训练数据集如何划分验证测试集?
trainx,testx,trainy,testy=train_test_split(datax,datay,test_size=0.3,random_state=42)
print(trainx.shape)
print(testx.shape)
其中的random_state
有什么用?可以参考sklearn中train_test_split函数中的random_state有什么用?
5. 处理缺失值。下面我处理的有点繁琐,如果没太明白也没关系,稍微看看大概流程,实践一遍即可。具体可以参考如何判断DataFrame中是否有缺失值None或者NaN(nan)?
#查看是否有缺失值
trainx.isnull().any()
将缺失值位置找出来,并填充一个固定字符串去(例如空格或者“#”),或者你可以直接将其删除也行。
#可以得到是否为空得true,false的同样shape的dataframe or series。
boolx=trainx.isnull()
#改成数值型,否则numpy无法处理。
boolx[boolx==True]=1
boolx
#必须要先将dataframe或者series转化成ndarray,否则argwhere会报错。
boolxn=np.array(boolx)
np.argwhere(boolxn==1)
#由于随机状态固定了,所以分配的训练集和测试集每次都是那样的,即每一次索引都是13791。但是这个是顺序的那个索引,我们应该得到真正的index.
sindex=trainx.index
sindex[13791]
#为了追究data中到底是什么,我们得到了其索引是314,由于这个是从0开始的,所以索引和iloc都是一样的。
data.iloc[314,:]
我们发现,有一条训练数据什么话也没说NaN
,情感分析标记成了中立的。
#这里我需要给一个暗号,为了便于处理,将空值一律替换成空格或者#都可以。
trainx.iloc[13791]="#"
trainx.iloc[13791]
6. 将文本trainx给向量化。可以参考一个例子来使用sklearn中的TfidfVectorizer。
#下面将文本trainx给向量化。
tv=TfidfVectorizer(stop_words="english",ngram_range=(1,1),max_df=0.8,min_df=2)
tv_fit=tv.fit_transform(trainx)
#从此,trainx变成了tv_fit的toarray,也就是说已经变成了向量。
trainxv=tv_fit.toarray()
trainxv
trainxv.shape
同理,对于testx也要转成向量。注意是用上面已经弄好的tv
转成,而不是重新弄一个tv,否则testxv中记录的维度可能和trainxv不一样,可能不是5072,那么基于trainxv训练的模型(只接受5072维度),使用testxv去验证测试的时候,肯定是输入不进去的。
testxv=tv.transform(testx)
testxv
#下面显示是稀疏矩阵,压缩存储了,我真是笑了,我觉得这个说明了一个问题,这个testx里面有很多生词,这样不太好啊,因为感觉预测效果将不会太好。
7. 训练模型。
#由于我们要用很多个机器学习模型来分类,而且都有一个共同点,都是fit,predict,所以干脆写成一个函数。
def train_model(model_name,model,trainx,trainy,testx,testy):print("this is the model of",model_name)model.fit(trainx,trainy)trainy_pred=model.predict(trainx)testy_pred=model.predict(testx)print("accuracy on training data:",accuracy_score(trainy,trainy_pred))print("accuracy on testing data:",accuracy_score(testy,testy_pred))print("classification report on testing data:")print(classification_report(testy,testy_pred))
#使用逻辑回归模型,
import warnings
warnings.filterwarnings("ignore")
model_lr=LogisticRegression()train_model("logistic regression",model_lr,trainxv,trainy,testxv,testy)#使用支持向量机模型来进行分类。
model_svm=LinearSVC()
train_model("support vector machine",model_svm,trainxv,trainy,testxv,testy)#使用朴素贝叶斯模型来分类。
model_nb=MultinomialNB()
train_model("naive bayes",model_nb,trainxv,trainy,testxv,testy)
我们上面使用了3个模型来训练,至于最后挑哪个,你可以看测试集上的正确率,或者看测试集和训练集的加权(比如相加除以2)正确率来选择你最终的模型。
结束
个人建议把这篇好好弄明白,不算很长,也不涉及什么太难的,一点一点积累。我没有写明白的地方,尽管提问。
机器学习-情感分析-入门实战案例相关推荐
- 逆向分析入门实战(三)
本文由作者首发于合天智汇:http://www.heetian.com/info/840 之前两篇文章,针对恶意代码为了确保自身只有一个实例在运行进行了正向开发和逆向分析.逆向入门分析实战(一).逆向 ...
- Hugging Face 中文预训练模型使用介绍及情感分析项目实战
Hugging Face 中文预训练模型使用介绍及情感分析项目实战 Hugging Face 一直致力于自然语言处理NLP技术的平民化(democratize),希望每个人都能用上最先进(SOTA, ...
- AI实战!开源一个机器学习/情感分析实战项目(附源码/教程)|湾区人工智能...
分享一个在公司做的机器学习文本分类项目的demo,该分类项目是一个通用的文本分类项目,这里的数据集我酒店用户评价数据,分类模型为二分类,正面评价和负面评价,这里所说的通用,就是你可以根据你自己的数据, ...
- NLP学习(十)-情感分析技术及案例实现-Python3实现
文章目录 1 情感分析简述 2 情感分类 2.1 基于语义的情感词典方法 2.2 基于机器学习的情感分类方法 3 情感检索 4 情感抽取 5 情感分析实战 5.1 词向量模型 5.2 Word2Vec ...
- 逆向分析入门实战(一)
本文由作者首发于合天智汇,http://www.heetian.com/info/742 1.木马分析入门 大家好,我最近从Web安全开始学习二进制安全,分享一下自己学习过程的收获和心得体会.由于是入 ...
- python情感分析(真实案例完整流程)
情感分析:又称为倾向性分析和意见挖掘,它是对带有情感色彩的主观性文本进行分析.处理.归纳和推理的过程,其中情感分析还可以细分为情感极性(倾向)分析,情感程度分析,主客观分析等. 情感极性分析的目的是对 ...
- python用社交网络分析_Python社交媒体情感分析入门
python用社交网络分析 自然语言处理(NLP)是一种机器学习,可解决口语/书面语言与这些语言的计算机辅助分析之间的相关性. 从写作帮助和建议到实时语音翻译和口译,我们在日常生活中经历了NLP的众多 ...
- TextCNN-文本情感分析项目实战
文本将介绍将卷积神经⽹络应⽤到⽂本情感分析的开创性⼯作之⼀:TextCNN [1] . 阅读本文后你可以掌握以下技能: 一维卷积.二维卷积的工作流程 文本分类模型TextCNN的结构及pytorch代 ...
- 机器学习-情感分析小案例
对发帖情感进行分析. 字段说明: Announce_ID字段代表用户ID,User_Name字段代表用户名,topic字段代表发帖主题,body字段代表发帖内容,post_type字段代表发帖话题是否 ...
最新文章
- SCRUM的三个工件
- python语言命名规定首字符不能是_python标识符命名规范原理解析
- 用户数从 0 到亿,我的 K8s 踩坑血泪史
- JavaScript的运动 —— 缓冲运动及其应用篇
- python的for语句中i未被定义_python – PyLint:使用可能未定义的循环变量警告
- JSONArray传值的使用小结
- jquery统计字数的小功能
- android 权限库EasyPermissions
- js调用局部打印功能并还原
- 中国主要水系、河流、湖泊数据矢量数据(shp格式)下载地址
- VMware及相关产品序列号大全
- 背单词App开发日记3
- HORAE深入思考及长久性论证
- 你参加了无数 “打卡” 群,为什么收获甚微。。。
- ColorMatrix 矩阵效果,即美图秀秀图片滤镜效果的思路
- 奇怪的汉诺塔 Four Column Hanoi Tower
- Unity3d:UGUI源码,Rebuild优化
- JavaEE(10)Spring中的注解开发、静态/动态代理
- STM32---c语言指针1
- 中国第三代半导体行业运行现状及十四五规划研究分析报告2022-2028年版