Udacity——基于RNN网络的情感分析(一)

在Udacity上课也有一阵子了,所以趁着假期时间把一些小项目总结一下,这样也有助于自己今后对知识的回顾。闲话不多说,让我们开始这个有趣的项目吧!该项目是基于RNN的情感分析(项目链接),用RNN网络而不用前馈网络是因为RNN可以通过对序列的学习提高预测的准确性。数据集我们采用的是电影评论及对应的标签,RNN网络结构如图所示。

network_diagram

这里,我们通过嵌入层传入数据,原因是嵌入层输入数据要比独热编码有更高的表示效率(具体的内容可以参考Word2Vec原理笔记),嵌入层的数据将传入LSTM单元,最终LSTM输出的的数据将传入一个sigmoid输出层。我们使用sigmoid输出层是因为我们尝试预测文本的积极情感或者消极情感,最终输出层只有一个sigmoid激活函数单元。


数据的预处理

首先我们要将数据调整成适合传入网络的形式。既然我们用嵌入层,我们就要将文字转换为整数,这样的形式更加简洁。
具体的处理的方法要基于数据本身,以我们现有的数据集为例首先观察评论数据的形式

'bromwell high is a cartoon comedy . it ran at the same time as some other programs about school life such as teachers . my years in the teaching profession lead me to believe that bromwell high s satire is much closer to reality than is teachers . the scramble to survive financially the insightful students who can see right through their pathetic teachers pomp the pettiness of the whole situation all remind me of the schools i knew and their students . when i saw the episode in which a student repeatedly tried to burn down the school i immediately recalled . . . . . . . . . at . . . . . . . . . . high . a classic line inspector i m here to sack one of your teachers . student welcome to bromwel......'

因此我们要做以下两个工作:

  • 删去所有的标点符号
  • 根据回车键'\n'将评论逐条存入训练数组中

from string import punctuation
all_text = ''.join([c for c in reviews if c not in punctuation])
reviews = all_text.split('\n')

此时我们就得到了评论的数组。由于我们要将文字转换为整数,因此我们要对所有文字进行统计:

  • 合并所有评论
  • 逐词将单词存入数组

all_text = ' '.join(reviews)
words = all_text.split()

最终得到的单词数组形式如下:

['bromwell',
'high',
'is',
'a',
'cartoon',
'comedy',
'it',
'ran',
'at',
'the',
'same',
'time',
'as',
'some',
'other',
'programs',
'about',
'school',
'life',
'such',
'as',
'teachers'...]


评论文字转数字

我们可以通过加工word数组,得到word:num的字典,这里值得注意的一点是由于我们会将0作为输入网络向量的初始元素,所以文字对应的数字应该从1开始,代码简单易懂如下:

vocab_set = set(words)
vocab_list = list(words)
vocab_to_int = {word: (num+1) for num,word in enumerate(vocab_list)}

得到这张word:num字典,我们就可以将评论中的文字转换为数字:

reviews_ints = []
for review in reviews:
reviews_ints.append([vocab_to_int[word] for word in review.split()])

此时评论转化后的形式:

[[2287959,
6015634,
6020195,
6020170,
6005621,
6013460,
6020180,
6003912,
6020174,
6020166,
6018044,
6020193,
6020107,
6020139,
6020049,
5991273,
6019751,
6015635,
6018542,
6017437,
6020107,
6005105,
6020143,
6019526,
6020091,
6020166,
5988232,
5703051,
6018165,
6019810,
6020114,
6019578,
6020161,
2287959,
6015634,
6020111,
6004283...]]


标签文字转数字

标签中只有'positve','negative'以及'\n',我们的目的是将'positve'设定为1,'negative'设定为0并删去'\n'。

labels = labels.split('\n')
labels = np.array([1 if label == 'positive' else 0 for label in labels])代码如下:

最后得到的标签数组如下所示:

array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
1, 0, 1, 0, 1, 0, 1, 0])


目前为止,我们已经将评论和标签的文字均转换为了数字,但这只是数据处理的第一步,下一步我们要做的是删除长度为0的评论,因为这些评论毫无意义。要注意的一点是我们不能破坏评论—标签的位置对应关系,所以我们删减根据的是位置信息。

non_zero_idx = [num for num,review in enumerate(reviews_ints) if len(review) != 0]
reviews_ints = [reviews_ints[num] for num in non_zero_idx]
labels = np.array([labels[num] for num in non_zero_idx])

此时我们就可以对数据进行最后的统一维度处理,我们不难发现,评论文字的长短差距会很大,短则几个字,多则上千个字。因此我们设定200这个阈值,多于200个字的评论我们只保留前200个字;少于200个字的评论用0来填充剩余的长度,这样我们就统一了输入向量的维度。代码如下:

seq_len = 200
features = np.zeros((len(reviews_ints),seq_len),dtype=int)
for num,review in enumerate(reviews_ints):
features[num,-len(review):] = np.array(review)[:seq_len]

此时我们得到的最终可以输入到网络数据形式如下:

array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 21025, 308, 6,
3, 1050, 207, 8, 2138, 32, 1, 171, 57,
15, 49, 81, 5785, 44, 382, 110, 140, 15,
5194, 60, 154, 9, 1, 4975, 5852, 475, 71,
5, 260, 12, 21025, 308, 13, 1978, 6, 74,
2395...]...])


截止目前,我们已经将输入网络的数据和标签数据进行了处理,能够达到用于训练的要求,那么下一篇笔记将主要讲解该项目的网络模型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容

  • 转载自:https://districtdatalabs.silvrback.com/modern-methods...
    Traeyee阅读 1,326评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,626评论 18 139
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,737评论 0 33
  • 接触Python原因 我是一名Android开发工程师,苦于年后回来手里没有项目可做和一直坚信一句话(一个好哥们一...
    熊熊熊孩子阅读 534评论 4 4
  • 文/叶老巫 本文关键词:触觉力、赤子之心、文字的高度和温度、寂寞 1、 六月九日晚上,去看阿汤哥主演的电影《新木乃...
    叶两步阅读 724评论 3 30