NLP学习笔记(六)文本生成

「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战」。

导语

本文为我之前在CSDN平台上的一篇博客记录。原链接为:NLP学习笔记(六)文本生成

文本生成(Text generation)

这节课介绍RNN的一个应用:文本生成。我们可以训练一个RNN来自动生成文本。

主要思想(Main idea)

我们以一个例子开始,假设输入半句话,"The cat sat on the ma",要求预测下一个字符。我们可以训练一个神经网络来预测下一个字符,训练数据是很多文本,把文本分割成字符,用One-hot encoding来表示字符。把这些One-Hot向量依次输入RNN,RNN的状态向量h会积累看到的信息。RNN返回最后一个向量h,在RNN上面是一个Softmax分类器,把h与参数矩阵W相乘得到的向量经过Softmax输出每个类别的概率。

在这里插入图片描述

假设这个网络已经训练好了,Softmax层则会输出如下概率值。我们选择最大的概率值对应的字符输出,或者按概率值做随机抽样。然后把t接到输入的文本末尾。

在这里插入图片描述

然后把"The cat sat on the mat"作为输入,计算下一个字符的输出,从而生成下一个字符。很可能是句号.再这样如此下去就可以生成很长的内容。

现在来看下怎样训练这个RNN,训练数据是文本,比如英文维基百科的所有文章。把文章划分为很多片段。这些片段可以有重叠。

在这里插入图片描述

比如红色片段作为输入文本,后面的蓝色字符a作为标签。设置seg_len=40意思是红色片段长度为40,设置步长stride=3,意思是下一个步骤红色片段会向右平移3个字符,以此类推。

在这里插入图片描述 假如这篇文章有3000个字符,那么我们就能得到大概1000个红色片段和1000个蓝色的标签。

在这里插入图片描述

训练神经网络的目的是给定输入片段,神经网络可以给出下一个字符。其实这就是一个多分类问题。假如包括空格、字母、标点在内一共有50个不同的字符,那么类别数目就是50。

在这里插入图片描述

训练的神经网络的输出风格取决于训练用的文本。如果用莎士比亚的书做训练,那么输出就是莎士比亚的风格文本。

文本生成可以用来做有趣的事情。比如生成新的英文名。

在这里插入图片描述 如果用Linux源代码作为训练数据,那么神经网络就会生成这样的文本

在这里插入图片描述 使用latex源代码可以自动生成latex源代码

在这里插入图片描述

训练一个文本生成器(Training a Text Generator)

准备训练数据(Prepare Training Data)

我们用Python读取一本书的文本,这里不考虑字母大小写。每次取60个字符作为输入数据,一个字符为label 在这里插入图片描述 在这里插入图片描述

将字符转换为向量(Character to Vector)

首先将字符做一个字典。然后把文本转换为One-Hot向量。

在这里插入图片描述 做完One-hot encoding后,一个字符串就背编码成为一个数值矩阵。矩阵的行数为字符串长度,列数为字典大小。这里没有做word embedding是因为字典中字符数目其实很少了,只有57维。

在这里插入图片描述

建立网络(Build Network)

Keras实现略

预测下一个字符

在模型搭建好后,我们有以下三种策略来选择下一个字符。

Option 1:Greedy selection

第一种方法是进行贪婪选择,直接选最大概率的那个。但这种方法生成的文本是确定的,文章都是固定的,可读性极差。 在这里插入图片描述

Option 2:Sampling from the multinomial distribution

第二种方法是根据输出的各个字符概率值进行多项式分别抽样,这种情况下具有随机性,生成效果较好。

在这里插入图片描述

Option 3:adjust the multinomial distribution

第三种方式则是在原始概率分布上加幂次再重新计算概率分别,这种情况下,会使得在方法二中概率大的更大一些。效果也更好一些。

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

总结(Summary)

想要生成文本,需要先生成一个循环神经网络。第一步是将文本划分成很多的segment片段。segment是输入,next_char是标签。第二步是对字符做One-hot encoding,把字符编码成向量,v是词表数目,l是segment长度。第三步是搭一个神经网络。 在这里插入图片描述 在生成文本时,需要给一个种子片段作为输入,然后就可以进行生成,重复进行以下几步:

  • 把segment输入神经网络
  • 神经网络输出各个字符的概率
  • 从概率值中进行Sample得到next_char
  • 把新生成的字符接到片段的后面

在这里插入图片描述

おすすめ

転載: juejin.im/post/7066414038636298270
おすすめ