循环神经网络
循环神经网络 就是专门用于处理语言、文字、时序这类特征之间存在“次序”的问题。这是一种循环的、带“记忆”功能的神经网络,这种网络针对序列性问题有其优势。
一、问题定义:鉴定评论文本的情感属性
文件中的Rating字段可以说是给我们带来评论文字属性的标签,即针对所购商品和本次采购行为的情感属性。如下:
- Rating 5:评价非常正面,非常满意
- Rating 4:评价正面,较为满意
- Rating 3:评价一般
- Rating 2:评价负面,较不满意
- Rating 1:评价非常负面,很不满意
如果机器学的了鉴别文字情感属性的能力,那么可以过滤垃圾留言和不文明的评论。有的时候,针对某些网络留言可进行相关的预警工作,通过采取预防措施,甚至能避免极端事件的发生。
二、循环神经网络的原理和结构
人类的只能可以循序渐进地接受并处理信息,同时保存近期所处理内容的信息,用以将上下文连贯起来,完成理解过程。
记忆可分为瞬时记忆、短时记忆和长时记忆。瞬时记忆能够处理的信息少,而且持续时间短,但是对当前的即时判断很重要。短时记忆是保持时间在1分钟以内的记忆。尝试记忆可以存储较多信息,信息也能持续很久,但是读取访问的速度稍微慢一点。
1.什么是序列数据
序列数据:是其特征的先后顺序对于数据的解释和处理十分重要的数据。
语音数据、文本数据都是序列数据。
文本数据集的形状为3D张量(样本,序号,字编码)
时间序列数据也有这种特点。这类数据是按时间顺序收集的,用于描述现象随时间变化的情况,如果不记录时戳,这些数字本身就没有意义。
时序数据集的形状为3D张量:(样本,时戳,标签)
这些序列数据具体包括以下应用场景。
- 文档分类,比如识别新闻的主题或书的类型、作者。
- 文档或时间序列对比,比如估测两个文档或两只股票的相关程度
- 文字情感分析,比如将评论、留言的情感划分为正面或负面
- 时间序列预测,比如根据某地天气的历史数据来预测未来天气
- 序列到序列的学习,比如两种语言之间的翻译
2.前馈神经网络处理序列数据的局限性
普通人工神经网络和卷积神经网络可以成为前馈神经网络,各神经元分列排序。每个神经元只与前一层的神经元相连,接受前一层的输出,并输出给下一层,各层间没有反馈。每一层内部的神经元之间,也没有任何反馈机制。
前馈神经网络也可以处理序列数据,但他是对数据整体读取、整体处理。比如一段文本,需要整体输入神经网络,然后一次性地进行解释,这样的网络,每个单词处理过程中的权重是无差别的,网络并没有对相临近的两个单词进行特别的对待。
3.循环神经网络处理序列问题的策略
循环神经网络专门为处理这种序列数据而生的。它是一种具有“记忆”功能的神经网络,其特点是能够把刚刚处理过的信息放进神经网络的内存中,这样离目标近的特征的影响会比较大。
4.循环神经网络的结构
循环神经网络的结构,与普通的前馈神经网络差异也不是很大,其实最关键的地方,有一下两处。
- 以一段文字的处理为例,如果是普通的神经网络,一段文字是整体读入网络处理——只处理一次;而循环神经网络则是每一个神经节点,随着序列的发展处理N次,第一次处理一个字、第二次就处理两个字,直到处理完为止。
- 循环神经网络的每个神经节点增加一个对当前状态的记忆功能,也就是除了权重W和偏置b之外,循环神经网络的神经元还多出一个当前状态的权重u,这个记录当前状态的u,在网络学习的过程中就全权负责了对刚才所读的文字记忆功能。
普通的神经网络中的神经元一次性读入全部特征,作为其输入。而循环神经网络的神经元需要沿着时间轴线,循环很多遍,因此也称RNN是带环的网络。这个“带环”,指的是神经元,也就是网络节点自身带环。
略。。
三、原始文本如何转化成向量数据
1.文本的向量化:分词
文本的向量化是机器学习进行进一步数据分析、理解、处理的基础,它的作用就是令文本的内容尽可能地结构化。
不同类型的文本,需要用到不同的处理方式。分为以下几种处理方式:
- 单字符的向量表达
- 词语的向量表达
- 短文本的向量表达
- 长文本的向量表达
最常见的情况,是以“词语”为单位,把文本进行向量化的表达,向量化这个过程,也可以叫做分词,或切词。在前深度学习的特征工程时代,分词是一件很繁琐的任务。
2.通过One-hot编码分词
分词的最常见的方式是One-hot编码。 就是弄一个常常的单词表,也就是词典,每一个单词通过唯一整数索引i对应者词典里面的一个条目,然后将这个整数索引i转换为长度为N的二进制向量。这个向量中,只有第i个元素是1,其余元素都为0
在Keras中,使用,Tokenizer类就要可以轻松完成文本分词的功能:
from keras.preprocessing.text import Tokenizer
words = ['LaoWang has a Wechat account.','He is not a nice pierson','Be careful.']
tokenzer = Tokenizer(num_words=30) #词典代销只设定30个词
tokenzer.fit_on_texts(words) #根据3个句子编辑词典
sequences = tokenzer.texts_to_sequences(words) #为3个句子根据词典里面的索引进行序号编码
on_hot_matrix = tokenzer.texts_to_matrix(words, mode='binary') #进行one-hot编码
word_index = tokenzer.word_index #词典中的单词所i你总数
操作流程如下:
- 根据文本生成词典——一共13个单词的文本,其中有一个重复的词’a‘,所以经过训练词典总共收集12个词。
- 词典的大小需要预先设定——本例中设为30个词。
- 然后就可以把原始文本,转换成词典索引编码和ont-hot编码。
One-hot编码所带来的问题:维度灾难,散列冲突。
3.词嵌入
稀疏矩阵,是其中元素大部分为0值的矩阵,反之,如果大部分元素都为非0值,则这个矩阵是密集的。
**词嵌入:**通过把One-hot编码压缩成密集矩阵,来降低其维度,而且每一个维度上的值不再是二维的0,1值,而是一个有意义的数字(如89、23、0.22)等,这样的值包含的信息量大。同时,在词嵌入的各个维度的组合过程中还会包含词和词之间的语义关系信息。
词嵌入张量需要机器在对很多文本的处理过程中学习而得,是机器学习的产物。学习过程中,一开始产生的都是随机的词向量,然后通过这些词向量进行学习,词嵌入张量被不断地完善,这个学习方式与学习神经网络的权重相同,因此词嵌入过程本身就可以视为一个深度学习项目。
在实践中,有以下两种词嵌入方案:
- 可以在完成主任务的同时学习词嵌入,生成输入自己这批训练文档的词嵌入张量。
- 也可以直接使用别人已经训练好的词嵌入张量
下面通过具体的案例一起来看看如何把分词和词嵌入应用到留言数据集中.
四、用SimpleRNN鉴定评论文本
先把这些文本向量化,然后用keras中最简单的循环神经网络结构——Simple RNN层,构建循环神经网络,鉴定一下哪些客户的留言是好评,哪些是差评。
1.用Tokenizer给文本分词
数据集关键词: Product Comments
1.导入数据
import pandas as pd # 导入Pandas
import numpy as np # 导入NumPy
dir = '../input/product-comments/'
dir_train = dir+'Clothing Reviews.csv'
df_train = pd.read_csv(dir_train) # 读入训练集
df_train.head() # 输出部分数据
2.然后对数据集进行分词工作,词典的代销设定为2万。
from keras.preprocessing.text import Tokenizer # 导入分词工具
X_train_lst = df_train["Review Text"].values # 将评论读入张量(训练集)
y_train = df_train["Rating"].values # 构建标签集
dictionary_size = 20000 # 设定词典的大小
tokenizer = Tokenizer(num_words=dictionary_size) # 初始化词典
tokenizer.fit_on_texts( X_train_lst ) # 使用训练集创建词典索引
# 为所有的单词分配索引值,完成分词工作
X_train_tokenized_lst = tokenizer.texts_to_sequences(X_train_lst)
3.通过直方图显示个评论中单词个数的分布情况,这个步骤为嵌入做准备:
import matplotlib.pyplot as plt # 导入matplotlib
word_per_comment = [len(comment) for comment in X_train_tokenized_lst]
plt.hist(word_per_comment, bins