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()            
    
    
    

      

     
  • 相关阅读:
    sql server 2000 “因为选定的用户拥有对象,所以无法除去该用户。”问题(含图说明)
    关于datalength函数,解决ntext等无法比较空值的问题
    Analysis service的manager无法连接,不能连接服务器(xxxxx)注册表,或者还不是olap Administrator组成员
    数据库查询问题int型字段对应以Int型数值+','组成的nvarchar型字段
    Asp与Asp.net共用cookie
    什么是SPSS
    TransactSQL语言提供的日期和时间函数(以备后用)
    关于sql语句的执行效率测试
    sqlserver数据仓库学习第一课(含资料)
    理解collate Chinese_PRC_CI_AS NULL
  • 原文地址:https://www.cnblogs.com/bep-feijin/p/9488936.html
Copyright © 2011-2022 走看看