zoukankan      html  css  js  c++  java
  • 数据的采集,清洗,数据机器自动标注及转化为深度学习格式

    例子是来自基于深度学习的特定领域命名实体识别课题
    介绍如何利用原始数据生成测试集、训练集、验证集(看注释)
    这其中字典的价值很重要,需要自己创建(这里想到的是利用爬虫技术获取)

    #如何利用原始数据生成测试集、训练集、验证集
    #encoding=utf8
    import os,jieba,csv
    import jieba.posseg as pseg
    
    #os.getcwd()获取当前的工作路径,os.sep是‘\’.然后得到整个source_data的路径,
    # gen_data.py和source_data应是同级目录
    c_root=os.getcwd()+os.sep+"source_data"+os.sep
    #创建三个文件,最终验证集、测试集、训练集的大小比例约为1:2:12
    dev=open("example.dev",'w',encoding='utf8')
    train=open("example.train",'w',encoding='utf8')
    test=open("example.test",'w',encoding='utf8')
    #标记,规定的范围之内的东西.符号,遇到标点符号时人工建立上下文.用set比用list效率高
    biaoji = set(['DIS', 'SYM', 'SGN', 'TES', 'DRU', 'SUR', 'PRE', 'PT', 'Dur', 'TP', 'REG', 'ORG', 'AT', 'PSB', 'DEG', 'FW','CL'])
    fuhao=set(['。','?','?','!','!'])
    dics=csv.reader(open("DICT_NOW.csv",'r',encoding='utf8'))#读入字典
    for row in dics:
        if len(row)==2:
            #用jieba把词加载进来,row[0]是词的内容,row[1]是词的类别
            jieba.add_word(row[0].strip(),tag=row[1].strip())
            jieba.suggest_freq(row[0].strip())#自动调节频率,使一些长短不一的目标词不会被分开成多个词
    split_num=0
    for file in os.listdir(c_root):#for循环读取source_data文件中的每个文件
        if "txtoriginal.txt" in file:
            fp=open(c_root+file,'r',encoding='utf8')
            for line in fp:#将文件一行行的读进来
                split_num+=1
                words=pseg.cut(line)#调用pseg.cut(line),这是jieba的一个词性切词的方法
                for key,value in words: #切完之后得到一个key-value对,key是词,value是对应的词性,如('患者','n')
                    #print(key)
                    #print(value)
                    if value.strip() and key.strip():
                        import time 
                        start_time=time.time()
                        #index就是要写入到哪个文件1:2:12的比例,那有15句话,分1句给dev,分两句给test
                        index=str(1) if split_num%15<2 else str(2)  if split_num%15>1 and split_num%15<4 else str(3) 
                        end_time=time.time()
                        print("method one used time is {}".format(end_time-start_time))
                        if value not in biaoji:
                            value='O'#如果词的词性不在标记中,就标为O(是欧不是零)
                            for achar in key.strip():#对于key可能多个字,要一个字一个字的遍历
                                if achar and achar.strip() in fuhao:#如果是标点符号
                                    string=achar+" "+value.strip()+"
    "+"
    "
                                    dev.write(string) if index=='1' else test.write(string) if index=='2' else train.write(string) 
                                elif achar.strip() and achar.strip() not in fuhao:#如果不是标点符号
                                    string = achar + " " + value.strip() + "
    "#就把字和词性写进来,中间用空格隔开
                                    #string要写入哪个文件是由index决定的,index=1写入dev,=2写入test,
                                    dev.write(string) if index=='1' else test.write(string) if index=='2' else train.write(string) 
            
                        elif value.strip()  in biaoji:#当value在标记里面
                            begin=0#我们用变量begin记录下来
                            for char in key.strip():#同样的遍历key中的每个字
                                if begin==0:
                                    begin+=1#每取出key中的一个字,begin就+1
                                    string1=char+' '+'B-'+value.strip()+'
    '#第一个字就变成B-(value)
                                    #根据index的值决定string1最终写入哪个文件,下同
                                    if index=='1':                               
                                        dev.write(string1)
                                    elif index=='2':
                                        test.write(string1)
                                    elif index=='3':
                                        train.write(string1)
                                    else:
                                        pass
                                else:#当begin>0了
                                    string1 = char + ' ' + 'I-' + value.strip() + '
    '#第二个开始到key循环结束变成I-(value)
                                    if index=='1':                               
                                        dev.write(string1)
                                    elif index=='2':
                                        test.write(string1)
                                    elif index=='3':
                                        train.write(string1)
                                    else:
                                        pass
                        else:
                            continue                        
    dev.close()
    train.close()
    test.close()            
    
    
    

      

     
  • 相关阅读:
    HDU 5642 King's Order 动态规划
    HDU 5640 King's Cake GCD
    HDU 5641 King's Phone 模拟
    HDU 5299 Circles Game 博弈论 暴力
    HDU 5294 Tricks Device 网络流 最短路
    HDU 5289 Assignment rmq
    HDU 5288 OO’s Sequence 水题
    星际争霸 虚空之遗 人族5BB 操作流程
    Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列
    Codeforces Beta Round #3 C. Tic-tac-toe 模拟题
  • 原文地址:https://www.cnblogs.com/bep-feijin/p/9488936.html
Copyright © 2011-2022 走看看