- 因为要用自己的翻译数据集合
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
即可。