数据集查看 ##

任务描述:
“可爱的老式和愚蠢的人之间有一条细线,而基督山伯爵……从未在两边安定下来。”

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上的电影评论情感分析相关推荐

  1. Pytorch+Text-CNN+Word2vec+电影评论情感分析实战

    文章目录 0.前言 1.电影评论数据集 2.数据读取 3.数据预处理 4.准备训练和测试集 5.加载词向量模型Word2vec 6.定义网络 7.训练网络 8.测试网络和可视化 9.总结 0.前言 很 ...

  2. 【Python自然语言处理】使用逻辑回归(logistic)对电影评论情感分析实战(超详细 附源码)

    需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一.舆情分析 舆情分析很多情况下涉及到用户的情感分析,或者亦称为观点挖掘,是指用自然语言处理技术.文本挖掘以及计算机语言学等方法来正确识别和提取文 ...

  3. 【自然语言处理(NLP)】基于FNN网络的电影评论情感分析

    [自然语言处理(NLP)]基于FNN网络的电影评论情感分析 作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源建 ...

  4. 从爬取豆瓣影评到基于朴素贝叶斯的电影评论情感分析(下)

    基于朴素贝叶斯的电影评论情感分析 用到的包:pandas.jieba(分词工具) file=open(r"review.txt",'r',encoding='utf-8') rev ...

  5. python电影评论情感分析_20行Tensorflow代码实现电影评论情感分析

    原标题:20行Tensorflow代码实现电影评论情感分析 背景 情感分析有很多的应用场景,比如做一个电商网站,卖家需要时刻关心用户对于商品的评论是否是正面的.再比如做一个电影的宣传和策划,电影在键盘 ...

  6. MOOC网深度学习应用开发3——Deep Dream、电影评论情感分析

    Deep Dream:随机噪点图向目标图转换的过程 经典卷积神经网络 电影评论情感分析 自然语言处理基础知识1 自然语言处理基础知识2--分词 自然语言处理基础知识3--词的数字化表示方法和词嵌入 电 ...

  7. Tensorflow 笔记 Ⅺ——NLP 实现电影评论情感分析

    文章目录 特别说明 数据集 IMDB 简介 IMDB 数据集 下载地址 目录结构 示例文本 自然语言处理基础 分词 词的数字化表示方法与词嵌入 循环神经网络 RNN与LSTM 数据的时序与含义 RNN ...

  8. 电影评论情感分析-直播案例

    情感分析是机器学习中的一个有挑战性的任务.数据集包含50,000个IMDB电影评论,训练集的25,000个评论标注了二元的情感倾向,IMDB评级<5的情绪评分为0,评级> = 7的情绪评分 ...

  9. 20行代码实现电影评论情感分析

    背景 情感分析有很多的应用场景,比如做一个电商网站,卖家需要时刻关心用户对于商品的评论是否是正面的.再比如做一个电影的宣传和策划,电影在键盘侠们中的口碑也至关重要.互联网上关于任何一个事件或物品都有可 ...

最新文章

  1. 使用flexible适配移动端h5页面
  2. spinbox的valuechanged 不响应键盘_键盘的选择实在太多,一个国产外设品牌最新旗舰机械键盘青轴版...
  3. 翻转棋游戏c语言讲解,有没有人懂黑白棋(翻转棋)的核心算法
  4. windows上使用image库
  5. Beta冲刺博客集合贴
  6. C#using static
  7. pkpm板按弹性计算还是塑性_PKPM中的S\R验算显红原因分析
  8. python示例apk_Python获取apk文件URL地址实例
  9. keil5调试如何选择晶振_有源晶振的负载电容重要吗?
  10. python gui界面设置数据储存在哪里_Python写GUI
  11. jqgrid 获取所有行数据
  12. 基于 smart-config技术实现
  13. 随滚动条变动的圆环滚动进度条,goTop按钮整合案例
  14. 欧拉计划15-从20*20的网格的左上角通往右下角有多少条路?
  15. android 8.1 9.0 10.0 Launcher3禁止拖拽app图标到第一屏
  16. 计算机应用 期刊 怎么样,《计算机应用研究》怎么样?投稿好中吗?
  17. 数据结构基本概念和术语(数据、数据元素,数据对象,数据项)及举例描述
  18. ${} 与 #{} 区别
  19. Android 推送消息开放接口 OpenPush
  20. CodeForces 1K-1600R-1407C Chocolate Bunny

热门文章

  1. 入职后端程序员的一些心得
  2. 在python中读取和写入CSV文件(你真的会吗?)
  3. 设置按峰值带宽计费_计费系统—音视频云服务
  4. 绩效面谈的4种技巧二
  5. python中如何产生随机数
  6. Matlab实现自相关矩阵,自相关矩阵的计算
  7. 坚持自己的初心,不做工作的奴隶
  8. 【离线语音专题①】安信可最新离线语音模组VC系列出厂固件使用教程——SDK开源?
  9. 【张宇2021考研】数学二(样卷)扫描版
  10. php动态绘制仪表盘,Pyecharts制作酷炫仪表盘,还能实时更新!