预选赛题
预选赛题——文本情感分类模型
本预选赛要求选手建立文本情感分类模型,选手用训练好的模型对测试集中的文本情感进行预测,判断其情感为「Negative」或者「Positive」。所提交的结果按照指定的评价指标使用在线评测数据进行评测,达到或超过规定的分数线即通过预选赛。
比赛数据
数据样本格式:
NO | 列名 | 类型 | 字段描述 |
---|---|---|---|
1 | ID | int | 文本唯一标识 |
2 | review | string | 文本纪录 |
3 | label | string | 文本的情感状态 |
其中,训练集的样本规模为6328,测试集的样本规模为2712。
提交结果
选手提交.csv的结果文件,文件名可以自定义,但文件内的字段需要对应。其中,ID表示文本唯一标识,pred表示预测该条文本的情感状态是否为「Positive」。
结果文件的内容示例:
ID | Pred |
---|---|
1 | 0.123456 |
2 | 0.654321 |
3 | 0.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()