首页 > 其他分享 >文本数据预处理(二)用于大预言模型训练

文本数据预处理(二)用于大预言模型训练

时间:2023-09-20 20:35:59浏览次数:44  
标签:temp self list 预言 ii ord 文本 data 预处理

收集好的txt数据要先过滤一下,删掉无效信息。然后再按下面步骤处理

class DataPreprocessor():
    '''def __init__(self, vocab_file, longest_sentence):
        self.tok = BertTokenizer(vocab_file)
        self.longest_sentence = longest_sentence
        self.end_symbol = '\.\?\;\)'
        self.start_symbol = 'A-Z\“\'\('
        self.p1 = re.compile('[A-Z1-9]{2,}['+self.end_symbol+'] +['+self.start_symbol+']|[^A-Z]{3}['+
                             self.end_symbol+'] +['+self.start_symbol+']')
        self.con_data_list = []'''

    def __init__(self, vocab_file, longest_sentence):
        self.tok = BertTokenizer(vocab_file)
        self.longest_sentence = longest_sentence
        self.end_symbol = '\.\?\;\!\。\?\:\!\;\\\n'
        self.start_symbol = '[\u4e00-\u9fa5]'
        self.p1 =  re.compile('[\u4e00-\u9fa5]{2}['+self.end_symbol+']')
        self.con_data_list = []

    def load_data(self, data_path, n_core=10):
        self.n_core = n_core
        file_paths = glob.glob(os.path.join(data_path, '*.txt'))
        texts = []
        for file_path in file_paths:
            with open(file_path, 'r') as f:
                text = f.read()
                texts.append(text)
        self.DATA = []
        for ii in range(n_core):
                self.DATA.append(texts[ii*(int(len(texts)/n_core)+1):(ii+1)*(int(len(texts)/n_core)+1)])
        '''self.n_core = n_core
        with open(data_path,'r') as f:
            temp = f.read()
        self.DATA = []
        for ii in range(n_core):
            self.DATA.append(temp[ii*(int(len(temp)/n_core)+1):(ii+1)*(int(len(temp)/n_core)+1)])'''
            
    def sent_seprator(self, item):
        #item = item.replace('- ','')
        sent_mark = self.p1.findall(item)
        temp = [[]]*len(sent_mark)
        count_table = np.zeros((len(sent_mark),2))
        for m_id,m in enumerate(self.p1.finditer(item)):
            count_table[m_id,0] = m.start()
            count_table[m_id,1] =  max([m.group().index(tsym) for tsym in self.end_symbol.split('\\')[1:] if tsym in m.group()])
        for ii in range(len(count_table)):
            if ii == 0:temp[ii] = item[:int(count_table[0].sum()+1)]
            else: temp[ii] = item[int(count_table[ii-1].sum())+1:int(count_table[ii].sum()+1)]
        for ii, item in enumerate(temp):
            if len(item) < 10:
                temp.remove(item)
        return temp
    
    def ord_data_generator(self, item):
        ord_data_list = []
        rev_data_list = []
        seg = ''
        seg_length = 0
        set_id_count = 0
        while set_id_count<=len(item)-1:
            if set_id_count == len(item)-1:
                if seg_length+len(self.tok.tokenize(item[set_id_count]))< self.longest_sentence-3:
                    seg += item[set_id_count]
                    if self.add_cls_sep(seg)[0]!=[]:
                        ord_data_list.append(self.add_cls_sep(seg)[0])
                        rev_data_list.append(self.add_cls_sep(seg)[1])
                    set_id_count+=1
                else:
                    if self.add_cls_sep(seg)[0]!=[]:
                        ord_data_list.append(self.add_cls_sep(seg)[0])
                        rev_data_list.append(self.add_cls_sep(seg)[1])
                    set_id_count+=1        
            else: 
                if seg_length+len(self.tok.tokenize(item[set_id_count]))< self.longest_sentence-3:
                    seg += item[set_id_count]
                    seg_length += len(self.tok.tokenize(item[set_id_count]))
                    set_id_count+=1
                elif len(self.tok.tokenize(item[set_id_count]))+len(self.tok.tokenize(item[set_id_count+1]))<self.longest_sentence-3:
                    if self.add_cls_sep(seg)[0]!=[]:
                        ord_data_list.append(self.add_cls_sep(seg)[0])
                        rev_data_list.append(self.add_cls_sep(seg)[1])
                    seg = ''
                    seg_length = 0
                else:
                    if self.add_cls_sep(seg)[0]!=[]:
                        ord_data_list.append(self.add_cls_sep(seg)[0])
                        rev_data_list.append(self.add_cls_sep(seg)[1])
                    seg = ''
                    seg_length = 0
                    set_id_count+=1
        return ord_data_list, rev_data_list
    
    def add_cls_sep(self, item):
        if len(self.p1.findall(item))>1:
            count_table = np.zeros((len(self.p1.findall(item)),2))
            for m_id,m in enumerate(self.p1.finditer(item)):
                count_table[m_id,0] = m.start()
                count_table[m_id,1] =  max([m.group().index(tsym) for tsym in self.end_symbol.split('\\')[1:] if tsym in m.group()])
            tar_id = int(len(count_table)/2)-1
            return '[CLS] '+item[:int(count_table[tar_id].sum()+1)]+' [SEP] '+item[int(count_table[tar_id].sum()+1):]+' [SEP]', '[CLS] '+item[int(count_table[tar_id].sum()+1):]+' [SEP] '+item[:int(count_table[tar_id].sum()+1)]+' [SEP]'
        else:
    #         print(item)
            return [[],[]]
    
    '''def f(self, data):
        temp_data = self.sent_seprator(data)
        temp_data = [temp.replace('\n', '') for temp in temp_data]
        return self.ord_data_generator(temp_data)   '''    
        
    def f(self,data):
        temp_data = [[] for _ in range(len(data))]
        ord_data_1 = []
        ord_data_2 = []
        ord_data = []
        for ii, item in enumerate(data):
            temp_data[ii] = self.sent_seprator(item)
            temp_data[ii] = [temp.replace('\n', '') for temp in temp_data[ii]]
            ord_data1,ord_data2 = self.ord_data_generator(temp_data[ii])
            ord_data_1.extend(ord_data1)
            ord_data_2.extend(ord_data2)
        ord_data = [ord_data_1, ord_data_2]
        print(len(ord_data))
        return ord_data

    def process(self):
        t1 = time.time()
        with mp.Pool(processes=self.n_core) as pool:
            output = []
            for item in tqdm(pool.map(self.f, self.DATA), total=len(self.DATA)):
                output.append(item)
        ord_data_list = []
        rev_data_list = []
        for ii in range(self.n_core):
            ord_data_list.extend(output[ii][0])
            rev_data_list.extend(output[ii][1])
        
        return ord_data_list, rev_data_list
    
    def f1(self, data_list):
        output_list = []
        while len(output_list)<len(data_list):
            rp1 = np.random.permutation(len(data_list))[0]
            rp2 = np.random.rand(1)
            rp3 = np.random.permutation(len(data_list))[0]
            rp4 = np.random.rand(1)
            sent1 = data_list[rp1].split('[CLS]')[-1].split('[SEP]')[int(rp2>0.5)]
            if rp1!=rp3-1:
                sent2 = data_list[rp3].split('[CLS]')[-1].split('[SEP]')[int(rp4>0.5)]
                out_sent = '[CLS] '+sent1+' [SEP] '+sent2+' [SEP]'
                if len(self.tok.tokenize(out_sent)) < self.longest_sentence:
                    output_list.append(out_sent)
        return output_list
    
    def generate_random_data_list(self, data_list, n_core = 5):
        sep_data_list = [[]]*n_core
        for ii in range(n_core):
            sep_data_list[ii] = data_list[ii*(int(len(data_list)/n_core)+1):(ii+1)*(int(len(data_list)/n_core)+1)]
        with mp.Pool(processes=n_core) as  pool:
            output = pool.map(self.f1, sep_data_list)
        OUTPUT = []
        for ii in range(n_core):
            OUTPUT.extend(output[ii])
        return OUTPUT
    
if __name__=='__main__':
    dp = DataPreprocessor("/home/ningzhi/Desktop/exBERT/ChineseBERT/vocab.txt", 128)
    dp.load_data("/home/ningzhi/Desktop/envnews/alltxt", 15)
    print('processing data, this might take some time')
    ord_data, rev_data = dp.process()
    with open("/home/ningzhi/Desktop/exBERT/processed_data.pkl",'wb') as f:
        pickle.dump([ord_data, rev_data],f)

 

标签:temp,self,list,预言,ii,ord,文本,data,预处理
From: https://www.cnblogs.com/qtdwz/p/17718328.html

相关文章

  • Python用于解析和修改文本数据-pyparsing模块教程
    Python库解析地址PyParsing人们普遍认为,Python编程语言的pyparsing模块是对文本数据进行操作的一个宝贵工具。用于解析和修改文本数据的pyparsing包,简化了对地址的操作。这是因为该模块可以转换和帮助解析地址。在这篇文章中,我们将讨论PyParsing模块在处理解析以及修改时的......
  • 【python技巧】文本处理-re库字符匹配
    (【python技巧】文本处理-re库字符匹配)我们读取文件内容,肯定不是单纯为了输出或者重新写入,对于文本我们一定有一些查找、定位的需求。在Python中,还有一个专门用于文本处理的库,那就是re库。下面我会介绍re库涉及的正则表达式的基本知识。参考课程1.正则表达式正则表达式是用......
  • 【python技巧】文本处理-re库字符匹配
    目录1.正则表达式1.1测试工具1.2限定符1.3字符集1.4运算符1.5元字符1.6懒惰匹配和贪婪匹配我们读取文件内容,肯定不是单纯为了输出或者重新写入,对于文本我们一定有一些查找、定位的需求。在Python中,还有一个专门用于文本处理的库,那就是re库。下面我会介绍re库涉及的正则......
  • WPF 界面或文本框焦点丢失问题
    在用户界面,有些时候需要使用键盘某个按键触发某项功能,但有时候会有焦点丢失问题发生,解决办法如下: List<T>FindVisualChild<T>(DependencyObjectobj)whereT:DependencyObject{try{List<T>list=newList<T>();......
  • 30 秒内使用 Laf 将文本转换为萝莉音并大声朗诵
    laf一键创建云函数首先打开你的Laf在创建云函数这里看到推荐模板。没错就是函数模板,如果你点击更多模板就会发现。哦,我的老天鹅呀快看看这是什么,这就是刚刚出炉的云函数市场,这是个什么概念呢,任何人都可以在这里分享自己的云函数,别人如果想要使用只需要点一下立马同步到你的......
  • 10 文本样式
    表示颜色:1.单词2.rgb3.rgba:a:透明度文字居中:左右居中:text-align:center上下居中:行高=块高文本装饰:下划线,中划线,上划线......
  • 从零开始使用vue2+element搭建后台管理系统(动态表单实现(含富文本框))[待完善]
    在后台项目的实际开发过程中,涉及到表单的部分通常会使用动态渲染的方案进行实现,由后端接口返回表单配置,前端进行遍历渲染。考虑到通用后台需要具备的功能,除了基础的表单项如输入、下拉、多选、开关、时间、日期等,还需要具备上传、富文本框等功能。首先导入一个百度来的富文本框插......
  • 通知单的长文本和合作伙伴功能获得
    通知单的透明表:VIQMEL 视图,通知单的主要属性Qmsm 任务表Qmur 主题Qmih 故障表Qmel主表Qmfe项目(长文本 缺陷定位等)T356_t 优先级Qpgt代码组文本    qpct 代码文本 目录的定义(KATALOGART):一,长文本长文本的存储位置: 抬头:STXH   行项目:STXL关键字:TDNA......
  • js中查询一段文本并选中查到的所有匹配能实现吗?
    有一个csdn网友遇到了这样的问题,想在一段文本中查询,然后选中匹配了的所有内容。但是单纯从需求来讲,我认为是无法实现的。我给出的解释是:在文本框中同时选中不连续的片断是不可能的。但是如果是非文本框中的文本,可以通过改变字体颜色和背景的方法来模拟不连续片断的同时选中效果......
  • 当页面中文本不允许选择时,使文本框中文本可以选择的js代码
    <bodyonselectstart="returnoSelect(event.srcElement);"><scriptlanguage="javascript">functionoSelect(obj){if(obj.type!='text')returnfalse;}</script><inputtype="text"name=&quo......