新手体验 kaggle上的电影评论情感分析
数据集查看 ##
任务描述:
“可爱的老式和愚蠢的人之间有一条细线,而基督山伯爵……从未在两边安定下来。”
Rotten Tomatoes电影评论数据集是用于情感分析的电影评论语料库,最初由Pang和Lee [1]收集。在他们关于情感树库的工作中,Socher等人。[2]使用亚马逊的Mechanical Turk为语料库中的所有解析短语创建细粒度标签。本次竞赛提供了一个机会,可以对您在Rotten Tomatoes数据集上的情绪分析想法进行基准测试。你被要求按五个等级标记短语:消极,有点消极,中立,有点积极,积极。句子否定,讽刺,简洁,语言模糊以及许多其他障碍使得这项任务非常具有挑战性。
数据集长这个样子:
PhraseId SentenceId Phrase Sentiment
1 1 A series of escapades demonstrating the adage that what is good for the goose is also good for the gander , some of which occasionally amuses but none of which amounts to much of a story . 1
2 1 A series of escapades demonstrating the adage that what is good for the goose 2
3 1 A series 2
4 1 A 2
5 1 series 2
其中 的标签有
0 - negative
1 - somewhat negative
2 - neutral
3 - somewhat positive
4 - positive
由此可见 这是一个多分类的任务
数据集分析
由于是文本数据,并且已经分词完毕,所以就先对文本进行去除空格,标点符号和全部变成小写。
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)import matplotlib.pyplot as plt
import re
def dataCleaning(totalText):total=[]for i in totalText:temp=i.lower()temp=re.sub('[^a-zA-Z]',' ',temp)tempArr=[j for j in temp.strip().split('\t') if isinstance(j,str)] tstr=' '.join(tempArr)total.append(tstr)return total
def loadData(name): data=pd.read_csv(name,delimiter='\t')totalText=data['Phrase']totalText=dataCleaning(totalText)totalLabel=data['Sentiment']return totalText,totalLabel
def getTest(name): data=pd.read_csv(name,delimiter='\t')totalText=data['Phrase']totalText=dataCleaning(totalText)return totalText
加载数据集
totalText,totalLabel=loadData('../input/train.tsv')
testText=getTest('../input/test.tsv')#路径写你自己的路径
数据查看
print(len(totalText))
print(len(totalLabel))
print(len(testText))
#输出15606015606066292
查看评分的类别分布
uniqueLabel=set(totalLabel)x=[]
y=[]
for i in uniqueLabel:x.append(i)y.append(totalLabel[totalLabel==i].size)
plt.figure(111)
plt.bar(x,y)
plt.xlabel('type of review ')
plt.ylabel('count')
plt.title('Movie Review')
plt.show()
Tokenizer
接下来是Tokenizer,Tokenizer是一个用于向量化文本,或将文本转换为序列(即单词在字典中的下标构成的列表,从1算起)的类。
from keras.preprocessing.text import Tokenizer
train_tokenizer = Tokenizer()
train_tokenizer.fit_on_texts(totalText)
train_sequences = train_tokenizer.texts_to_sequences(totalText)#
test_sequences = train_tokenizer.texts_to_sequences(testText)
# 获得所有tokens的长度
num_tokens = [ len(tokens) for tokens in train_sequences ]
num_tokens = np.array(num_tokens)
print(len(num_tokens))
#输出 156060
# 平均tokens的长度
print('mean',np.mean(num_tokens))
# 最长的评价tokens的长度
print('max',np.max(num_tokens))
# 最长的评价tokens的长度
print('min',np.min(num_tokens))输出:mean 6.873132128668461max 48min 0
查看训练数据的长度
plt.hist((num_tokens), bins = 50)
plt.ylabel('number of tokens')
plt.xlabel('length of tokens')
plt.title('Distribution of tokens length')
plt.show()
max_tokens = np.mean(num_tokens) + 2 * np.std(num_tokens)
max_tokens = int(max_tokens)
max_tokens
# 取tokens的长度为19时,大约93%的样本被涵盖np.sum( num_tokens < max_tokens ) / len(num_tokens)
输出:0.9278610790721518
接下来是对向量话后的文本进行padding,因为每个句子的长度都不一样,所以要对长度不够的填充0,如果长度超过你指定的长度,则会丢弃
train_Data=sequence.pad_sequences(train_sequences,maxlen=48)test_Data=sequence.pad_sequences(test_sequences,maxlen=48)
#这里的长度可以是前面取到的max_tokens,也可以是他的最大长度 前者可以节约计算时间
print(train_Data.shape)
print(test_Data.shape)
train_Data
输出:(156060, 48)(66292, 48)array([[ 0, 0, 0, ..., 3, 2, 42],[ 0, 0, 0, ..., 13, 1, 2947],[ 0, 0, 0, ..., 0, 2, 323],...,[ 0, 0, 0, ..., 0, 9271, 9272],[ 0, 0, 0, ..., 0, 0, 9271],[ 0, 0, 0, ..., 0, 0, 9272]])
train_label=to_categorical(totalLabel,5)
print(train_label.shape)
print(train_label)
然后是转换标签
多类分类问题与二类分类问题类似,需要将类别变量(categorical function)的输出标签转化为数值变量。这个问题在二分类的时候直接转换为(0,1)(输出层采用sigmoid函数)或(-1,1)(输出层采用tanh函数)。类似的,在多分类问题中我们将转化为虚拟变量(dummy variable):即用one hot encoding方法将输出标签的向量(vector)转化为只在出现对应标签的那一列为1,其余为0的布尔矩阵。
from keras.utils.np_utils import to_categorical#转换标签
train_label=to_categorical(totalLabel,5)
print(train_label.shape)
print(train_label)
#输出(156060, 5)[[0. 1. 0. 0. 0.][0. 0. 1. 0. 0.][0. 0. 1. 0. 0.]...[0. 0. 0. 1. 0.][0. 0. 1. 0. 0.][0. 0. 1. 0. 0.]]
然后是在测试样本上切分数据集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(train_Data , train_label, test_size=0.25, random_state=42)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
#输出(117045, 48)(39015, 48)(117045, 5)(39015, 5)
然后使用Keras来搭建LSTM
#max_features为最多单词数
max_features=len(train_tokenizer.index_word)
max_len=48 #这个是要和前面padding时的长度一致
epochs = 5 #训练次数
emb_dim = 128 #128代表embedding层的向量维度
batch_size=80 #这是指定批量的大小
LSTM搭建
from keras.models import Sequential
from keras.layers import Dense ,Embedding,Activation
from keras.layers import LSTM
from keras.preprocessing import sequence
from keras.preprocessing.sequence import pad_sequences
model = Sequential()model.add(Embedding(max_features,emb_dim,mask_zero=True))
model.add(LSTM(64,dropout=0.4, recurrent_dropout=0.4,return_sequences=True))
model.add(LSTM(32,dropout=0.5, recurrent_dropout=0.5,return_sequences=False))model.add(Dense(5, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])print(model.summary())
model.fit(X_train,y_train,batch_size=batch_size,epochs=epochs,validation_data=(X_test,y_test))
输出:_________________________________________________________________Layer (type) Output Shape Param # =================================================================embedding_1 (Embedding) (None, None, 128) 1757696 _________________________________________________________________lstm_1 (LSTM) (None, None, 64) 49408 _________________________________________________________________lstm_2 (LSTM) (None, 32) 12416 _________________________________________________________________dense_1 (Dense) (None, 5) 165 =================================================================Total params: 1,819,685Trainable params: 1,819,685Non-trainable params: 0_________________________________________________________________NoneTrain on 117045 samples, validate on 39015 samplesEpoch 1/5117045/117045 [==============================] - 467s 4ms/step - loss: 1.0738 - acc: 0.5794 - val_loss: 0.8814 - val_acc: 0.6440Epoch 2/5117045/117045 [==============================] - 466s 4ms/step - loss: 0.8351 - acc: 0.6621 - val_loss: 0.8398 - val_acc: 0.6593Epoch 3/5117045/117045 [==============================] - 471s 4ms/step - loss: 0.7705 - acc: 0.6831 - val_loss: 0.8248 - val_acc: 0.6658Epoch 4/5117045/117045 [==============================] - 466s 4ms/step - loss: 0.7292 - acc: 0.6996 - val_loss: 0.8286 - val_acc: 0.6659Epoch 5/5117045/117045 [==============================] - 477s 4ms/step - loss: 0.6975 - acc: 0.7126 - val_loss: 0.8317 - val_acc: 0.6695<keras.callbacks.History at 0x21fc0a777f0>
验证一下
model.evaluate(X_test,y_test)
#输出[0.9062137237897396, 0.66523132128974]前面的是测试的损失 后面的是得分
最后预测测试集
predict=model.predict_classes(test_Data)
sub = pd.read_csv('../input/sampleSubmission.csv')
sub['Sentiment'] = predict
sub.to_csv('sub_lstm.csv', index=False)
总结
由于电脑显卡不行,所以只能使用CPU进行运算,跑一次要半小时以上,速度很慢很慢,所以只能这样,不好进行调优,导致效果很一般,排名只有一百多。
新手体验 kaggle上的电影评论情感分析相关推荐
- Pytorch+Text-CNN+Word2vec+电影评论情感分析实战
文章目录 0.前言 1.电影评论数据集 2.数据读取 3.数据预处理 4.准备训练和测试集 5.加载词向量模型Word2vec 6.定义网络 7.训练网络 8.测试网络和可视化 9.总结 0.前言 很 ...
- 【Python自然语言处理】使用逻辑回归(logistic)对电影评论情感分析实战(超详细 附源码)
需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一.舆情分析 舆情分析很多情况下涉及到用户的情感分析,或者亦称为观点挖掘,是指用自然语言处理技术.文本挖掘以及计算机语言学等方法来正确识别和提取文 ...
- 【自然语言处理(NLP)】基于FNN网络的电影评论情感分析
[自然语言处理(NLP)]基于FNN网络的电影评论情感分析 作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源建 ...
- 从爬取豆瓣影评到基于朴素贝叶斯的电影评论情感分析(下)
基于朴素贝叶斯的电影评论情感分析 用到的包:pandas.jieba(分词工具) file=open(r"review.txt",'r',encoding='utf-8') rev ...
- python电影评论情感分析_20行Tensorflow代码实现电影评论情感分析
原标题:20行Tensorflow代码实现电影评论情感分析 背景 情感分析有很多的应用场景,比如做一个电商网站,卖家需要时刻关心用户对于商品的评论是否是正面的.再比如做一个电影的宣传和策划,电影在键盘 ...
- MOOC网深度学习应用开发3——Deep Dream、电影评论情感分析
Deep Dream:随机噪点图向目标图转换的过程 经典卷积神经网络 电影评论情感分析 自然语言处理基础知识1 自然语言处理基础知识2--分词 自然语言处理基础知识3--词的数字化表示方法和词嵌入 电 ...
- Tensorflow 笔记 Ⅺ——NLP 实现电影评论情感分析
文章目录 特别说明 数据集 IMDB 简介 IMDB 数据集 下载地址 目录结构 示例文本 自然语言处理基础 分词 词的数字化表示方法与词嵌入 循环神经网络 RNN与LSTM 数据的时序与含义 RNN ...
- 电影评论情感分析-直播案例
情感分析是机器学习中的一个有挑战性的任务.数据集包含50,000个IMDB电影评论,训练集的25,000个评论标注了二元的情感倾向,IMDB评级<5的情绪评分为0,评级> = 7的情绪评分 ...
- 20行代码实现电影评论情感分析
背景 情感分析有很多的应用场景,比如做一个电商网站,卖家需要时刻关心用户对于商品的评论是否是正面的.再比如做一个电影的宣传和策划,电影在键盘侠们中的口碑也至关重要.互联网上关于任何一个事件或物品都有可 ...
最新文章
- 使用flexible适配移动端h5页面
- spinbox的valuechanged 不响应键盘_键盘的选择实在太多,一个国产外设品牌最新旗舰机械键盘青轴版...
- 翻转棋游戏c语言讲解,有没有人懂黑白棋(翻转棋)的核心算法
- windows上使用image库
- Beta冲刺博客集合贴
- C#using static
- pkpm板按弹性计算还是塑性_PKPM中的S\R验算显红原因分析
- python示例apk_Python获取apk文件URL地址实例
- keil5调试如何选择晶振_有源晶振的负载电容重要吗?
- python gui界面设置数据储存在哪里_Python写GUI
- jqgrid 获取所有行数据
- 基于 smart-config技术实现
- 随滚动条变动的圆环滚动进度条,goTop按钮整合案例
- 欧拉计划15-从20*20的网格的左上角通往右下角有多少条路?
- android 8.1 9.0 10.0 Launcher3禁止拖拽app图标到第一屏
- 计算机应用 期刊 怎么样,《计算机应用研究》怎么样?投稿好中吗?
- 数据结构基本概念和术语(数据、数据元素,数据对象,数据项)及举例描述
- ${} 与 #{} 区别
- Android 推送消息开放接口 OpenPush
- CodeForces 1K-1600R-1407C Chocolate Bunny