失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【NLP竞赛】——评论的细粒度分析(含代码)

【NLP竞赛】——评论的细粒度分析(含代码)

时间:2019-01-25 14:15:04

相关推荐

【NLP竞赛】——评论的细粒度分析(含代码)

一、前言

在线评论的细粒度情感分析对于深刻理解商家和用户、挖掘用户情感等方面有至关重要的价值,并且在互联网行业有极其广泛的应用,主要用于个性化推荐、智能搜索、产品反馈、业务安全等。此次博文所述的数据集,共包含6大类20个细粒度要素的情感倾向。根据标注的细粒度要素的情感倾向建立算法,对用户评论进行情感挖掘。AI挑战赛简介

二、数据集

1、下载地址:/s/1XklZuTCDhaTylIw4y3nPnw 提取码:u8i4

2、数据集说明

数据集分为训练、验证、测试A与测试B四部分。数据集中的评价对象按照粒度不同划分为两个层次,层次一为粗粒度的评价对象,例如评论文本中涉及的服务、位置等要素;层次二为细粒度的情感对象,例如“服务”属性中的“服务人员态度”、“排队等候时间”等细粒度要素。评价对象的具体划分如下表所示。

每个细粒度要素的情感倾向有四种状态:正向、中性、负向、未提及。使用[1,0,-1,-2]四个值对情感倾向进行描述,情感倾向值及其含义对照表如下所示:

数据标注示例如下:

“味道不错的面馆,性价比也相当之高,分量很足~女生吃小份,胃口小的,可能吃不完呢。环境在面馆来说算是好的,至少看上去堂子很亮,也比较干净,一般苍蝇馆子还是比不上这个卫生状况的。中午饭点的时候,人很多,人行道上也是要坐满的,隔壁的冒菜馆子,据说是一家,有时候也会开放出来坐吃面的人。“

3、结果说明

根据训练的模型对测试集的6大类20个的细粒度要素的情感倾向进行预测,提交预测结果,预测结果使用[-2,-1,0,1]四个值进行描述,返回的结果保存为csv文件。格式如下:

标注字段说明:

三、模型

(一)baseline

标准的baseline,用的是支撑向量机的方法。调用sklearn封装好的接口,scikit-learn中所有分类器做多类别分类是开箱即用的,实现较为简单。代码如下:

import pandas as pdimport numpy as npfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.svm import SVCimport sysfrom sklearn.metrics import f1_scoreimport jiebafrom sklearn.multiclass import OneVsRestClassifierdef segmentWord(cont):c = []for i in cont:a = list(jieba.cut(i))b = " ".join(a)c.append(b)return cdef readData(d_train ,d_valid, d_test):print("训练样本 = %d" % len(d_train))print("验证样本 = %d" % len(d_valid))print("测试样本 = %d" %len(d_test))content_train=segmentWord(d_train['content'])content_valid=segmentWord(d_valid['content'])content_test=segmentWord(d_test['content'])vectorizer = TfidfVectorizer(analyzer='word',min_df=3,token_pattern=r"(?u)\b\w\w+\b")features = vectorizer.fit_transform(content_train)print("训练样本特征表长度为 " + str(features.shape))# print(vectorizer.get_feature_names()) #特征名展示valid_features = vectorizer.transform(content_valid)print("验证样本特征表长度为 "+ str(valid_features.shape))test_features = vectorizer.transform(content_test)print("测试样本特征表长度为 "+ str(test_features.shape))data=[d_train,d_valid,d_test,features,valid_features,test_features]return datadef svm_model(data):print("--------------------------------------")print("Start training SVM")d_train,d_valid,d_test,features,valid_features,test_features=datacolumns = d_train.columns.values.tolist()f1=0for col in columns[3:]:print(col)lb_train=d_train[col]lb_valid=d_valid[col]svmmodel =SVC(C=10,kernel= "linear",degree=3)svmmodel.fit(features , lb_train)preds=svmmodel.predict(valid_features)ff=f1_score(lb_valid, preds, average='macro')print('f1=%s'%ff)f1+=ffd_test[col]=svmmodel.predict(test_features)d_test.to_csv('result/predict.csv')print('ave_f1=%s'%(f1/20))print('predict file result/predict.csv')if __name__=='__main__':d_train=pd.read_csv('./data/trainingset.csv',encoding="utf_8")# 训练数据集d_valid=pd.read_csv('./data/validationset.csv',encoding="utf_8") d_test=pd.read_csv('./data/testset.csv',encoding="utf_8")# 测试数据集data=readData(d_train ,d_valid, d_test) #读取数据svm_model(data)

(二)scikit-learn多分类器

scikit-learn中所有分类器做多类别分类是开箱即用的。Sklearn中自带多类别统计信息如下:

sklearn.naive_bayes.BernoulliNBsklearn.tree.DecisionTreeClassifiersklearn.tree.ExtraTreeClassifiersklearn.ensemble.ExtraTreesClassifiersklearn.naive_bayes.GaussianNBsklearn.neighbors.KNeighborsClassifiersklearn.semi_supervised.LabelPropagationsklearn.semi_supervised.LabelSpreadingsklearn.discriminant_analysis.LinearDiscriminantAnalysissklearn.svm.LinearSVC (setting multi_class=”crammer_singer”)sklearn.linear_model.LogisticRegression (setting multi_class=”multinomial”)sklearn.linear_model.LogisticRegressionCV (setting multi_class=”multinomial”)sklearn.neural_network.MLPClassifiersklearn.neighbors.NearestCentroidsklearn.discriminant_analysis.QuadraticDiscriminantAnalysissklearn.neighbors.RadiusNeighborsClassifiersklearn.ensemble.RandomForestClassifiersklearn.linear_model.RidgeClassifiersklearn.linear_model.RidgeClassifierCV

2.1 支撑向量机版本2(SVM2)

#核心代码

from sklearn.multiclass import OneVsRestClassifiersvmmodel =OneVsRestClassifier(SVC(C=10,kernel= "linear",degree=3))

C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。C默认是1.0kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略

2.2 随机森林(RandomForest)

#核心代码

RandomForestmodel = RandomForestClassifier(n_estimators=100, max_depth=20,random_state=0)

n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,计算量会太大,并且n_estimators到一定的数量后,再增大n_estimators获得的模型提升会很小,所以一般选择一个适中的数值。默认是100。max_depth:决策树最大深度

2.3 DTtree

#核心代码

DTmodel = tree.DecisionTreeClassifier(criterion='entropy', max_depth=None,min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,max_features=None, random_state=None, max_leaf_nodes=None,min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)

criterion:表示在基于特征划分数据集合时,选择特征的标准。默认是’gini‘,即'Gini impurity'(Gini不纯度),

还可以是criterion=‘entropy‘。

min_samples_split:int,float,optional(default=2),表示在分解内部结点时最少的样本数。min_samples_leaf->int,float,optional(default=1),表示每个叶结点最小的样本数目。

2.4 朴素贝叶斯Naive_Bayes

#核心代码

NBmodel = naive_bayes.BernoulliNB(alpha=0.1, binarize=0.0, class_prior=None, fit_prior=True)

alpha:平滑参数fit_prior:是否要学习类的先验概率;false-使用统一的先验概率class_prior: 是否指定类的先验概率;若指定则不能根据参数调整binarize: 二值化的阈值,若为None,则假设输入由二进制向量组成

2.5集成学习 AdaBoost

AdaBoostClassifier(base_estimator=None, n_estimators=100, learning_rate=1.0, algorithm='SAMME.R', random_state=None)

base_estimator:基分类器,默认是决策树,在该分类器基础上进行boosting,理论上可以是任意一个分类器,但是如果是其他分类器时需要指明样本权重。n_estimators:基分类器提升(循环)次数,默认是50次,这个值过大,模型容易过拟合;值过小,模型容易欠拟合。learning_rate:学习率,表示梯度收敛速度,默认为1,如果过大,容易错过最优值,如果过小,则收敛速度会很慢;该值需要和n_estimators进行一个权衡,当分类器迭代次数较少时,学习率可以小一些,当迭代次数较多时,学习率可以适当放大。algorithm:boosting算法,也就是模型提升准则,有两种方式SAMME, 和SAMME.R两种,默认是SAMME.R,两者的区别主要是弱学习器权重的度量,前者是对样本集预测错误的概率进行划分的,后者是对样本集的预测错误的比例,即错分率进行划分的,默认是用的SAMME.R。random_state:随机种子设置。关于Adaboost模型本身的参数并不多,但是我们在实际中除了调整Adaboost模型参数外,还可以调整基分类器的参数,关于基分类的调参,和单模型的调参是完全一样的,比如默认的基分类器是决策树,那么这个分类器的调参和我们之前的Sklearn参数详解——决策树是完全一致。

2.6 集成学习XgBoost

#核心代码

xgb.XGBClassifier(max_depth=10, learning_rate=0.1, n_estimators=60, silent=True, objective='multi:softmax')

max_depth——含义:树的深度,默认值为6,典型值3-10,值越大,越容易过拟合;值越小,越容易欠拟合。learning_rate——含义:学习率,控制每次迭代更新权重时的步长,默认0.3。值越小,训练越慢。

典型值为0.01-0.2

n_estimatores——总共迭代的次数,即决策树的个数。silent——silent=0时,不输出中间过程(默认),silent=1时,输出中间过程.

2.7 多层感知机(MLP)

#核心代码

MLPmodle = MLPClassifier(activation='relu', solver='lbfgs', alpha=0.01)

activation :激活函数,{‘identity’, ‘logistic’, ‘tanh’, ‘relu’}, 默认relualpha :float,可选的,默认0.0001,正则化项参数solver: {‘lbfgs’, ‘sgd’, ‘adam’}, 默认adam,用来优化权重

- lbfgs:quasi-Newton方法的优化器

- sgd:随机梯度下降

- adam: Kingma, Diederik, and Jimmy Ba提出的机遇随机梯度的优化器

注意:默认solver ‘adam’在相对较大的数据集上效果比较好(几千个样本或者更多),对小数据集来说,lbfgs收敛更快效果也更好。

四、实验运行结果

1、实验环境

服务器类型:普通服务器(PC机)

操作系统:Ubuntu 16.04.5 LTS

Python版本:python 3.6.3

2、各模型实验结果汇总

五、参考资料

【开源代码】

TOP1. 冠军解决方案:

1)AI Challenger 冠军 PPT 分享---细粒度情感分析赛道

2) 代码:/chenghuige/wenzheng/tree/master/projects/ai/sentiment

TOP2. 亚军解决方案:

AI Challenger情感分析赛道亚军PPT分享

TOP4. 决赛第4名解决方案:

AI Challenger 第4名PPT分享---细粒度情感分析赛道

TOP16 解决方案

代码:/xueyouluo/fsauor

TOP17解决方案

代码:/BigHeartC/Al_challenger__sentiment_analysis

解析:/xiayangmian4130/article/details/86185983

【参考文章】

1、sklearn官方文档地址:https://scikit-/stable/

2、sklearn中文文档:/#/docs/13

2、Python机器学习笔记:sklearn库的学习

如果觉得《【NLP竞赛】——评论的细粒度分析(含代码)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。