近期在学习Transformer模型。想用这个模型做一个中英翻译的小项目。Transformer模型是Github上下载下来的模型。该模型已经搭建完成。只需要我们把自己的数据输入进去就可以。而模型需要的文本格式为[batch_size,word_length],所以要把我们的文件格式转换成模型可以接受的格式。

读取文本

先来看下我们的文本格式。如下图所示,我们只需要下面的文本的前两列,并把它们放到list里面
在这里插入图片描述

如图所示:
在这里插入图片描述

把数据转化为subwords格式

把数据转化为subwords格式。既每个单词和每个字都有唯一的数字可以代替。其中要用到这个tfds.features.text.SubwordTextEncoder.build_from_corpus()函数。

tokenizer_en = tfds.features.text.SubwordTextEncoder.build_from_corpus((' '.join(e) for e in enlish), target_vocab_size=2**13)
tokenizer_cn = tfds.features.text.SubwordTextEncoder.build_from_corpus(( e for e in chines), target_vocab_size=2**13)

转化完毕以后我们测试一下:

在这里插入图片描述

把数据转化为向量

cn = [tokenizer_cn.encode(line)for line in chines]
en= [tokenizer_en.encode(' '.join(line))for line in enlish]

转化为向量之后我们需要在每条语句向量的最前面和最后面添加star和end的token 方便模型知道什么时候开始什么时候结束。

en_ = []
for i in en :
    en_.append([tokenizer_en.vocab_size]+list(i)+[tokenizer_en.vocab_size+1])
cn_ = []
for i in cn :
    cn_.append([tokenizer_cn.vocab_size]+list(i)+[tokenizer_cn.vocab_size+1])

添加之后我们要把我们的向量补成统一长度,用0做填充。短的在后面补0长的把后面的信息切掉。用到了tf.keras.preprocessing.sequence.pad_sequences()

en_text=tf.keras.preprocessing.sequence.pad_sequences(
    en_, maxlen=40, dtype='int32', padding='post',
    value=0.0)
cn_text=tf.keras.preprocessing.sequence.pad_sequences(
    cn_, maxlen=40, dtype='int32', padding='post',
    value=0.0)

这样我们就会获得两类数据。一类是输入数据en_text ,一类是标签cn_text。这时候的数据类型还是numpy的数据类型然后我们要把数据转化为Tensorflow可以接受的类型。

en_batch = tf.data.Dataset.from_tensor_slices(en_text)
cn_batch = tf.data.Dataset.from_tensor_slices(cn_text)

然后在使用tensorflow中的padded_batch() 函数。把数据分割成[batch_size,word_length]格式

en_batch  = en_batch.padded_batch(64)
cn_batch = cn_batch.padded_batch(64)

最后我们在检查下输出的数据。正好和我们要的一样:[batch_size,word_length] 64个语句一组,每个语句长都为40。
在这里插入图片描述
数据集:https://download.csdn.net/download/weixin_43788143/12700110
代码:https://download.csdn.net/download/weixin_43788143/12700114

更多推荐