大数据入门——文本情感分类(python实现)
菜鸟小白的第二篇小博文
我就拿某高校比赛的数据当例子吧。。
这是比赛方提供的训练数据,分为三列,分别是ID、文本、label。文本部分据传说是印尼语的拼音,所以并没有现成的词库可以用,不过这样也好,省去了不少麻烦,直接做监督学习就可以了。
文本情感分类总思路
什么是文本情感分类?简单来说,就是告诉你一段话,让你判断这是positive还是nagative,在本题中,即通过review属性判断label属性。在不知道这是什么语言的情况下,显然要用机器学习来做。通过大量的数据训练,让分类器学会词项与label之间的联系,从而在验证集中可以相对准确地预测。
详细步骤
一、导入数据
import numpy as np
import pandas as pd
df_train = pd.read_csv('train.csv',index_col=[0],lineterminator='\n')
我们用df_train存储数据,这个数据框存储的就是刚刚图片里的那个表格。
二、分词
拿到文本,首先看看要不要分词。一般中文文本可以采用jieba分词(结巴分词)很显然,这个数据中每个词已经被分好了,只不过我们不知道具体含义而已。
三、数据清洗
去重复、去停止词。由于本数据没有词库可以用,也无法判断每个词具体含义,那么只需要去重即可。很简单,全部转化为小写,这样在下一步构造特征的时候就不会把同一个词因为字母大小写不一样而识别为不同的词了。
这里我们可以用命令如下:
result=df_train['review']
result = result.str.lower()
我们把文本单独提取出来,result可以理解为待处理数据,即文本。
四、构造特征
机器是不可能识别文字的,这个各位看官想必比我更清楚,那么就要挖掘出一组文本当中的某种数字特征,能够代表它的根本属性,让机器识别。最简单的莫过于词频逆文档矩阵了,即TF-IDF。这是一种用于资讯检索与文本挖掘的常用加权技术,可以用来评估一个词对于一个文档集或语料库中某个文档的重要程度。字词的重要性随着它在文件中出现的次数成正比增加 ,但同时会随着它在语料库中出现的频率成反比下降 。如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词。具体原理、计算方法自行百度,在Python里面只需要一行代码即可搞定。
from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer()
X = vec.fit_transform(result.values)
什么意思呢?就是说现在用X储存原文本的词频逆文档特征。
五、分割训练集、测试集
y = df_train['label'].values #把要做预测的label属性单独提出
from sklearn import model_selection as ms #直接调用现有的函数进行分割
X_train,X_test,y_train,y_test=ms.train_test_split(X,y,test_size=0.1,random_state=10)
现在,我们已经有了待训练的数据X_train,y_train,待测试数据X_test,y_test。
X是文本的特征,y是监督项,即label数据。X负责将特征输送进分类器,而y的作用就是告诉机器什么样的X对应positive,什么样的X对应nagative,是这个意思。
那为什么要构造测试集呢?其实与其叫测试集,不如叫验证集。我们拿到的数据是有review又有label的,我们用训练集做训练之后,为了检验机器学习的效果,用测试集的特征做预测,预测结果准不准呢?我们并不知道,所以要和真实情况比较一下。即现有学习过X_train,y_train的分类器,将X_test输入,预测测试集的label,再用y_test进行比较。
很显然,接下来要做的,是选择一个分类器,用训练数据做训练。
六、训练数据
svm支持向量机
from sklearn import svm #
#clf = svm.SVC(C=0.5,kernel='poly',probability=True)
#clf.fit(X_train,y_train,sample_weight=None) # 训练模型。参数sample_weight为每个样本设置权重。应对非均衡问题 result = clf.predict(test_data) # 使用模型预测值 print('预测结果:',result) # 输出预测值[-1. -1. 1. 1.]
KNN
#from sklearn.neighbors import KNeighborsClassifier
#clf = KNeighborsClassifier()
#clf.fit(X_train,y_train)
逻辑回归
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(C=1.0) # 默认使用L2正则化避免过拟合,C=1.0表示正则力度(超参数,可以调参调优)
clf.fit(X_train,y_train)
贝叶斯
from sklearn.naive_bayes import MultinomialNB#这可使用其他分类器
#from sklearn.naive_bayes import BernoulliNB
clf = MultinomialNB()
clf.fit(X_train,y_train)
如果我没有记错的话,总共有三种贝叶斯分类器,这里提供两种,第二种在注释行里,使用的时候改动一下就可以了。顺便说一句,在这个数据中,多项式贝叶斯的分类效果最好。
随机森林
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier()
clf.fit(X_train,y_train)
随机森林容易过拟合,调参小能手可以试一下。。。
七、预测数据
pre_label = clf.predict(X_test) #返回标签
pre_pro = clf.predict_proba(X_test) #返回属于哪一类的概率
clf.classes_ #查看0和1表示哪一类
八、评价模型
一般来说,使用AUC得分来评价一个模型的好坏
from sklearn import metrics
test_auc = metrics.roc_auc_score(y_test,test_pro1.iloc[:,1] )#验证集上的auc值
print( test_auc )
当然,也可以用模型自带的评分,不过很少用,分数高也说明不了什么问题,检测不出过拟合的情况。
print(clf.score(X_train,y_train))
总结
这种处理方式其实蛮简单的,其实也可以不选用“词频—逆文档”作为特征,word2vec、doc2vec应该也有大佬去用,按道理说多个特征同时训练效果应该是非常好的,但是我没试过,留给各位啦。
慕小白其实是妥妥的新手菜鸟,学习python时间很短,以我的体会来说,做项目是成长最快的一种途径。
路漫漫其修远兮,前面的路还很长,这些也只是皮毛而已,文本挖掘水深得很,远远不止做个分类那么简单。当然也不可妄自菲薄,真理虽远,但是进一寸有一寸的欢喜嘛。以前在CSDN上学了很多,现在终于可以回馈一下社会了。
供参考。