中文NLP笔记:9. 基于LSTM的文本分类

中文NLP笔记:9. 基于LSTM的文本分类,第1张

序列模型

语言模型 N-gram

  前面的词袋模型(Bag-of-Words,BoW),没有考虑每个词的顺序

  有些句子即使把词的顺序打乱,还是可以看懂这句话在说什么,有时候词的顺序打乱,句子意思就变得面目全非

  N-gram 是一种考虑句子中词与词之间的顺序的模型

  它是一种语言模型(Language Model,LM),一个基于概率的判别模型,输入是一句话(词的顺序序列),输出是这句话中所有词的联合概率(Joint Probability)

  N-gram 模型知道的信息越多,得到的结果也越准确

  主要应用在如词性标注、垃圾短信分类、分词器、机器翻译和语音识别、语音识别等领域。

  优缺点

  优点:包含了前 N-1 个词所能提供的全部信息

  缺点:需要很大规模的训练文本来确定模型的参数

根据 N-gram 的优缺点,它的进化版 NNLM(Neural Network based Language Model)诞生了

  由 Bengio 在2003年提出

  由四层组成,输入层、嵌入层、隐层和输出层

  NNLM 的输入是长度为 N 的词序列的 index 序列,输出是下一个词的类别。

  “我是小明”的 index 序列就是 10、 23、65

  然后经过嵌入层(Embedding),是一个大小为 |V|×K 的矩阵,从中取出第10、23、65行向量拼成 3×K 的矩阵

  再经过 tanh 为激活函数,最后送入带 softmax 的输出层,输出概率

  最大的缺点就是参数多,训练慢,要求输入定长 N 很不灵活,不能利用完整的历史信息。

针对 NNLM 存在的问题,Mikolov 在2010年提出了 RNNLM

  结构实际上是用 RNN 代替 NNLM 里的隐层

  减少模型参数、提高训练速度、接受任意长度输入、利用完整的历史信息

基于 Keras 的 LSTM 文本分类

  引入数据处理库,停用词和语料加载

  分词和去停用词

  打散数据,使数据分布均匀,然后获取特征和标签列表

  使用 LSTM 对数据进行分类

学习资料:

《中文自然语言处理入门实战》

例如这样一个数据集合,总共100条句子,每个句子20个词,每个词都由一个80维的向量表示。在lstm中,单个样本即单条句子输入下(shape是 [1 , 20, 80]),假如设定每一个time step的输入是一个词(当然这不一定,你也可以调成两个词或者更多个数的词),则在t0时刻是第一个时间步,输入x0则为代表一条句子(一个样本)中第1个词的80维向量,t1是第二个时间步,x1表示该句子中第2个词的80维向量,依次类推t19输入是最后一个词即第20个词的向量表示。

常见的tf或者keras中lstm的参数(samples, timestep, input_dim),samples是指批量训练样本的数量, timestep是时间步(这个时间步可自己设置)比如上面说的20,input-dim是每个time step的输入shape

假设输入的样本是一条条的句子:

样本1:“”富强,民主,文明,和谐,自由,平等,公正,法治,爱国,敬业,诚信,友善“”

样本2:“”实现伟大中国梦“”

样本3:“”跑得比谁都快“”

对于这样的不同长度的样本,因为长短不一,需要先编码,embedding成相同维度的数据。比如每个句子embedding成shape为[24, 80],这样的话,若批训练的BatchSize是1的话, A假如你的时间步设置为12,那么需要将单个样本X, reshape成1,12,160,输入到LSTM,此时LSTM中每个时间步输入X_t的shape是[1,160];

B假如你的时间步设置为24,那么需要将单个样本X, reshape成1, 24, 80, 输入到LSTM, 此时LSTM每个时间步输入X_t的shape就是1,80

盗用下知友的图如下, X_t就是下图中的X0,X1,Xn:

其实,从另一个角度也可以区分,time_step是神经网络的参数,网络建好了便不会改变;batch是训练参数,在训练时可根据效果随时调整。

RepeatVector(10): 把向量复制10次 比如原先的向量是(32, ) 之后就变成了(32,10)

主要用于LSTM encoder encoder得到的结果是一个一维feature向量, 但是decoder回去也是LSTM, 所以必须先重复10次当作是有时间步的, 才能输入decoder的LSTM中去

TimeDistributed( Dense( 12 , input_shape=( 10 , 6 ) )) 把dense layer应用到输入的每个时间步里去 比如之前是(13,10,6), 这么 *** 作之后就变成了(13,10,12)

TimeDistributed不会改变维度, 但是会改变feature的个数

npreshape(x,(9000,16,48))

x是你的数据 确保加粗的两个参数乘积是768就行了,这里16是时间步数,48是每个时间步特征向量的长度。

以上就是关于中文NLP笔记:9. 基于LSTM的文本分类全部的内容,包括:中文NLP笔记:9. 基于LSTM的文本分类、如何理解lstm的输入输出、Keras之layer: RepeatVector和TimeDistributed等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9737762.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存