tensorflow2.0 中英翻译 对文本的预处理(文本转换为文本向量 tfds.features.text.SubwordTextEncoder.build_from_corpus)
近期在学习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
更多推荐


所有评论(0)