数据处理
1. 切分大文件
执行auto_split.sh文件,作用是分割大文件,超过1GB的文件,会自动分割未300M的小文件
使用split命令将文件分割成300M一份的小文件,并将分割后的文件以两位数字结尾,保存在原文件所在目录下,然后使用ls命令获取当前目录下所有文件,通过grep和正则表达式找到带有两位数字结尾的文件,并使用xargs -n1 -i{
} mv {
} {
}.json命令将这些文件重命名为.json文件。
split -a 2 -C 300M $p $file/$name- && ls|grep -E "(-[a-zA-Z]{2})" |xargs -n1 -i{
} mv {
} {
}.json
2. 分句
执行preprocessing.py文件,该文件的作用主要是分句,为什么不嵌入到collate_fn中做,是发现那样效率会慢一些,所以单独拿出来做了
3. 加载数据
load.py文件是用fsdata的方式加载数据集,也是执行即可。执行一遍,后续的加载可以实现180GB的数据秒入
token实现Mask
NSP任务,只做mask任务,具体mask策略如下:
- 15%随机mask
- 80% mask
- 10% 随机替换
- 10% 保持不变
- 全词mask (wwm)
- n-gram mask
class DataCollate(object):
def __init__(self, tokenizer, max_length, mask_rate=0.15, max_ngram=3, if_padding=True) -> None:
self.tokenizer = tokenizer
self.max_length = max_length
self.word_cuter = jieba.cut #分词器
self.vocab_length = len(tokenizer) #词表长度
self.mask_rate = mask_rate #mask的比例
self.ignore_labels = -100 #忽略计算的label
self.ngrams = np.arange(1, max_ngram + 1, dtype=np.int64) # 最大的grams
pvals = 1. / np.arange(1, max_ngram + 1)
pvals /= pvals.sum(keepdims=True) # p(n) = 1/n / sigma(1/k)
self.pvals = pvals
self.padding = if_padding
def token_process(self, token_id):
rand = np.random.random()
if rand <= 0.8: # 80% mask
return self.tokenizer.mask_token_id
elif rand <= 0.9: # 10%保持不变
return token_id
else: # 10%随机替换
return np.random.randint(1, self.vocab_length)
def __call__(self, samples):
input_ids = []
attention_mask = []
token_type_ids = []
batch_labels = []
# print('^-^ batch size :',len(samples))
for sample in samples:
word_list = list(self.word_cuter(sample['text'])) #句子分词后列表
mask_ids, labels = [], []
record = []
for i in range(len(word_list)): #遍历
rands = np.random.random()
if i in record:
continue
word = word_list[i]
if rands > self.mask_rate and len(word) < 4: # 全词mask
word = word_list[i]
word_encode = tokenizer.encode(word, add_special_tokens=False)
for token in word_encode:
mask_ids.append(token

最低0.47元/天 解锁文章
18万+

被折叠的 条评论
为什么被折叠?



