資料的採集,清洗,資料機器自動標註及轉化為深度學習格式

weixin_33847182發表於2018-08-16
例子是來自基於深度學習的特定領域命名實體識別課題
介紹如何利用原始資料生成測試集、訓練集、驗證集(看註釋)
這其中字典的價值很重要,需要自己建立(這裡想到的是利用爬蟲技術獲取)

#如何利用原始資料生成測試集、訓練集、驗證集
#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()+"\n"+"\n"
                                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() + "\n"#就把字和詞性寫進來,中間用空格隔開
                                #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()+'\n'#第一個字就變成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() + '\n'#第二個開始到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()            
 
 

  

 

轉載於:https://www.cnblogs.com/bep-feijin/p/9488936.html

相關文章