因为要用自己的翻译数据集合LDC,但是tensor2tensor中只有wmt18 enzh的数据集合处理方法,因此仿照这他写一个自己的。(主要是因为wmt18的数据集太大了有几千万条数据,做个试验得好几天,所以先在一个小的数据集上试验,如果好了再试试大的数据集)。
先找到Enzh WMT的problem类,可以看到叫32k的原因是因为词表的大小差不多是32k
@registry.register_problem
class TranslateEnzhWmt32k(translate.TranslateProblem):
@property
def approx_vocab_size(self):
return 2**15 # 32k
datasets = train_dataset = _NC_TRAIN_DATASETS = [[
"http://data.statmt.org/wmt18/translation-task/training-parallel-nc-v13.tgz", [
"training-parallel-nc-v13/news-commentary-v13.zh-en.en",
"training-parallel-nc-v13/news-commentary-v13.zh-en.zh"
]
]] # 里面只有一个item
source_datasets = [[item[0], [item[1][0]]] for item in train_dataset] # dataset name
source_datasets = [[
["http://data.statmt.org/wmt18/translation-task/training-parallel-nc-v13.tgz"],
["training-parallel-nc-v13/news-commentary-v13.zh-en.en"]
]]
生成source的词典
source_vocab = generator_utils.get_or_generate_vocab(
data_dir,
tmp_dir,
self.source_vocab_name,
self.approx_vocab_size,
source_datasets,
file_byte_budget=1e8,
max_subtoken_length=self.max_subtoken_length)
generate_lines_for_vocab
从vocab_generator里面得到的句子大概是这样的,是经过处理的句子,因此接下来的部分我们没有必要看了,只需要把vocab_generator的部分换成我们自己的数据集即可。
总的处理逻辑
传入参数中各个字段所表示的含义,这个是要按照他的格式来写的否则就运行不了。
compile_data的含义就是对.sgm后缀的文件进行处理,然后写到.lang1文件里面,根据我的观察,解析出来的文件和原来的文件news-commentary-v13.zh-en.en是差不多的,只是少了一行。
返回的是一个字典,有两项,一个是inputs表示源数据,一个是targets是目标数据,在这个函数中只进行了序列化和数字化,没有进行截断和填充
总结
所以说source[0]中的url的basename的文件如果没有出现在tmp_dir目录里中那么就会下载相应的文件或者压缩包。
training-parallel-nc-v13.tgz
source[1]中的文件如果没有出现在tmp_dir文件夹中,那么就会解压刚才下载的压缩包,然后从里面读取文件(这里的文件是处理好的news-commentary-v13.zh-en.zh)一行一个数据,用来生成词表。
整个generate_encoded_samples返回值是一个生成器,生成器返回的是一个字典,字典有两项,一个是inputs表示源数据,一个是targets是目标数据,这两个都是一个列表。
因此如果要改传入数据的话
为了能让生成单词表,要修改generate_lines_for_vocab中的url相关代码,因为此时的数据在本地,不用url下载。并且把解压缩相关的代码也注释掉,在tmp_dir目录下创建和for source in sources: source[1]里面命名一样的文件即可,其他部分包括get_or_generate_vocab_inner都不用改,因为他的目的是在data_dir目录下创建一个词表。
对于生成训练数据,只需要给text_problems.text2text_tex_iterator中传入source(lang1)和target(lang2)文件名即可,translate.compile_data的目的也是了从.sgm文件中解析文件。
Vocab
vocab命名和data_filename有关,data_filename在problem基类中的定义是默认是注册名字。因此如果要让vocab适应现在的任务的话,只用注册的时候名字不一样,只用改动函数generate_text_for_vocab即可。
最后编辑于 :2019.04.04 17:57:08
©著作权归作者所有,转载或内容合作请联系作者 【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。 平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。