赞
踩
RNN网络使用了单词的序列信息,网络结构如下:
首先,将单词传入embedding层,之所以使用嵌入层,是因为单词数量太多,使用嵌入式方式词向量来表示单词更有效率。我们在这里使用word2vec方式来实现,我们在这里只需要加入嵌入层即可,网络会自主学习嵌入矩阵。
通过embedding层,新的单词表示传入LSTM cells。这将是一个递归链接网络,所以单词的序列信息会在网络之间传递。最后,LSTM cells连接一个sigmoid output layer。使用sigmoid可以预测该文本是积极的还是消极的情感。输出层只有一个单元节点(使用sigmoid激活)。只需要关注最后一个sigmoid的输出,损失只计算最后一步的输出和标签的差异。以下是python的代码:
首先导入相关的库和打开需要的数据文件
import numpy as np
import tensorflow as tf
with open('./data/reviews.txt', 'r') as f:
reviews = f.read()
with open('./data/labels.txt', 'r') as f:
labels = f.read()
数据清洗,使用embedding层,需要将单词编码成整数。这里需要去除标点符号,同时去除不同文本之间的分隔符号\n,先把\n当成分隔符号,分割所有评论。然后在将所有评论再次连接称为一个大的文本。
from string import punctuation
#移除所有标点符号
all_text = ''.join([c for c in reviews if c not in punctuation])
# 以'\n'为分隔符,拆分文本
reviews = all_text.split('\n')
all_text = ' '.join(reviews)
# 文本拆分为单独的单词列表
words = all_text.split()
embedding lookup要求输入的网格数据是整数。最简单的方法就是创建数据字典:{单词:整数}。然后将评论全部一一对应转换成整数,传入网络。
from collections import Counter
counts = Counter(words)
#按计数进行排序
vocab = sorted(counts, key=counts.get, reverse=True)
# 生成字典:{单词:整数}
vocab_to_int = {
word: ii for ii, word in enumerate(vocab, 1)}
# 将文本列表 转换为 整数列表
reviews_ints = []
for each in reviews:
reviews_ints.append([vocab_to_int[word] for word in each.split()])
将标签positive和negative转换成数值
labels = labels.split('\n')
labels = np.array([1 if each == 'positive' else 0 for each in labels])
from collections import Counter
review_lens = Counter([len(x) for x in reviews_ints])
这里有一个问题:有一条评论长度为0,而且最大的评论长度为2514,对我们演示来说太长了。所以我们将其截断成200的长度:1、评论长度小于200的,我们对其左边填充0,2、对于大于200的,我们只截取其前200个单词。
non_zero_idx = [ii for ii, review in enumerate
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。