文本情感分类——2019大数据挑战赛预选赛题

预选赛题

预选赛题——文本情感分类模型

本预选赛要求选手建立文本情感分类模型,选手用训练好的模型对测试集中的文本情感进行预测,判断其情感为「Negative」或者「Positive」。所提交的结果按照指定的评价指标使用在线评测数据进行评测,达到或超过规定的分数线即通过预选赛。

比赛数据

数据样本格式:
NO列名类型字段描述
1IDint文本唯一标识
2reviewstring文本纪录
3labelstring文本的情感状态

其中,训练集的样本规模为6328,测试集的样本规模为2712。

提交结果

选手提交.csv的结果文件,文件名可以自定义,但文件内的字段需要对应。其中,ID表示文本唯一标识,pred表示预测该条文本的情感状态是否为「Positive」。

结果文件的内容示例:

IDPred
10.123456
20.654321
30.799212

评估方法

选手提交结果的评估指标是AUC(Area Under Curve),本次测评采用Public-Private榜与实时测评方式,即参赛选手提交结果文件后几分钟内便可获知分数。

代码操作部分

导入包
import numpy as np
import pandas as pd
import re
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
#导入特征提取包,导入朴素贝叶斯分类器
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB as NB
from sklearn.metrics import classification_report
获取数据,训练集和测试集

在后续我将训练集和测试集合并在了一起,方便数据清洗,且我在训练词袋也是用的总数据。

train = pd.read_csv('train.csv',lineterminator='\n')
test = pd.read_csv('test1.csv',lineterminator='\n')

注意:如果后面不加lineterminator=’\n’,可能会报如下错:

ParserError: Error tokenizing data. C error: Buffer overflow caught - possible malformed input file.
数字化

label列是评论的态度,只有Negative和Positive两类,我们可以将其数字化,方便以后数据的分析和计算。

train['label'] = train['label'].map(lambda x: 0 if x == 'Negative' else 1)
查看数据集、测试集
train.head()

在这里插入图片描述

test.head()

在这里插入图片描述

合并数据集
All = train.append(test, ignore_index=True)#合并训练集和测试集,方便以后处理数据,不用训练集测试集处理两次

计算训练集长度,方便后面数据清洗后将总的数据集切割为训练集和测试集

lentrain = len(train)
lentrain
6328
数据清洗
#数据清洗
# 去除标点符号、数字、特殊字符。去除的内容与参数[^a-zA-Z#]有关
All['review'] = All['review'].str.replace("[^a-zA-Z#]", " ")
查看清洗后的数据
All.head()

在这里插入图片描述
可见,数据清洗后已经没有了表情,标点符号和数字,特殊字符了,这样,数据集就可以用来建词库了。

numpy_array = All.as_matrix()#将数据转换成数组形式
numpy_array[:4]
array([[1, 0.0, 'Jo bhi ap se tou behtar hoon'],
       [2, 1.0, 'ya Allah meri sister Affia ki madad farma'],
       [3, 0.0, 'Yeh khud chahta a is umar main shadi krna   had ogi'],
       [4, 0.0, 'Tc   Apky mun xe exe alfax achy nae lgty   ']],
      dtype=object)
corpus = numpy_array[: , 2]
corpus
array(['Jo bhi ap se tou behtar hoon',
       'ya Allah meri sister Affia ki madad farma',
       'Yeh khud chahta a is umar main shadi krna   had ogi', ...,
       'Aala taleem nay unhain  liberal  bana dia tha ',
       'Unhone tu kuch bhi nhe parhaya tu nazar kiya ata',
       'Sahi khel gaey'], dtype=object)
#采用TfidfVectorizer提取文本特征
tfidf = TfidfVectorizer()
re = tfidf.fit_transform(corpus)#用所有文本来提取
#输出词袋模型
print(re.shape)#此词袋有9040行文本,共21477个词汇
(9040, 21477)

截取训练集X_train,测试集X_test。

X_train = re[:lentrain] # Separate back into training and test sets. 
X_test = re[lentrain:]
print(X_train[:2, :])
#显示的内容是训练集的第一行和第二行文本的特征词汇在词库中的位置以及词汇的权重
  (0, 9362)		0.32296057314704796
  (0, 2836)		0.2700387235197587
  (0, 1139)		0.3432300862856022
  (0, 17709)	0.22620994756759527
  (0, 19953)	0.4257037761290801
  (0, 2550)		0.4881827570097263
  (0, 7942)		0.4839954692246799
  (1, 20993)	0.27180540037912754
  (1, 866)		0.21217865778719738
  (1, 12834)	0.2957075374410748
  (1, 18392)	0.47571699016920305
  (1, 462)		0.5338231280015991
  (1, 10704)	0.139695225538808
  (1, 11904)	0.3553711846525529
  (1, 5989)		0.3695698474715519

取y_train

y_train = train.label.as_matrix()
y_train = y_train.astype('int8')
y_train[:6]
array([0, 1, 0, 0, 1, 0], dtype=int8)

用X_train、y_train学习、训练模型,再用X_test预测结果

mnb_tfid_stop = NB()
mnb_tfid_stop.fit(X_train, y_train)   # 学习
pre = mnb_tfid_stop.predict(X_test)    # 预测
pre[:6]
array([1, 1, 1, 1, 1, 0], dtype=int8)
Pred = mnb_tfid_stop.predict_proba(X_test)
Pred
array([[0.09666661, 0.90333339],
       [0.1829802 , 0.8170198 ],
       [0.19821264, 0.80178736],
       ...,
       [0.38031899, 0.61968101],
       [0.5402817 , 0.4597183 ],
       [0.44133509, 0.55866491]])
mnb_tfid_stop.score(X_test, pre)
1.0
data3 = pd.DataFrame(Pred, index=test.ID, columns=['pred0', 'Pred'])
data3.drop('pred0', axis=1, inplace=True)
data3.to_csv('result0.csv')
data4 = pd.read_csv('result0.csv')
data4.head()

在这里插入图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值