實驗一 用python處理文本資料(必做)
實驗目的: 熟悉python的基本資料結構,以及檔案的輸入與輸出,
實驗環境: anaconda3(Spyder)
實驗資料:
利用2015年中國機器學習會議的評測資料和評測任務,資料包括訓練集(7813條)和測驗集(2610條),評測任務為通過給定的訓練資料,預測測驗集中的關系是正例還是負例,在每個樣本最后給出1或者0,資料描述如下,
訓練集如下圖所示,第一列為關系型別,第二列和第三列為人名,第四列是標題,第五列是關系為正例還是負例,1為正例,0為負例;第六串列示訓練集還是訓練集,(我覺得可能是打錯字了??)

測驗集如下圖所示,格式基本與訓練集類似,唯一不同的是第五列沒有關系是正例還是負例的標記,

實驗內容:
1對訓練集資料進行處理,只留下前面五列,輸出文本命名為exp1_1.txt,
2 在第一步得到的資料的基礎上對19類關系進行分類,生成的文本存放在exp1_train檔案夾下,按照關系類別出現的順序,第一個關系類別的資料存放在1.txt中,第二個關系類別存放在2.txt中,直到19.txt,
3 測驗集按照訓練集的19個類別的順序將各個樣本按照關系類別歸類,即相同關系型別的資料放到一個文本檔案中,同樣生成19個類別的測驗檔案,格式仍舊和測驗檔案保持一致,存放在exp1_test檔案夾下,每個類別的檔案仍舊命名為1_test.txt,2_test.txt…
同時對每個樣本在原測驗集中出現的位置進行記錄,和19個測驗檔案一一對應起來,比如第一類“傳聞不和”的每個樣本在原文中處于第幾行,在索引檔案中進行記錄,保存在檔案index1.txt,index2.txt….
實驗報告:
1實驗報告內容為處理上述檔案時的思路,用文字進行簡單描述,也可以畫流程圖,
實驗結果及考核:
1將上述處理之后的檔案及實驗報告壓縮后,用學號+姓名的方式命名,并上交,
2 完成的實驗除了上交之后,需要進行口頭答辯
代碼如下
import os,shutil
lei=[]
f_in = open("task1.trainSentence.new",encoding = 'utf_8')
f_out = open("exp1_1.txt","w",encoding = 'utf_8')
for line in f_in:
arr = line.split('\t')
f_out.write(arr[0]+"\t"+arr[1]+"\t"+arr[2]+"\t"+arr[3]+"\t"+arr[4]+"\t""\n")
f_in.close()
f_out.close()
##
os.mkdir("exp1_train")
shutil.copy("task1.trainSentence.new","exp1_train")
shutil.copy("task1.test.new","exp1_train")
os.chdir("exp1_train")
f_in = open("task1.trainSentence.new",encoding = 'utf_8')
for line in f_in:
arr = line.split('\t')
if arr[0] in lei:
continue
else:
lei.append(arr[0])
f_in.close()
lx=len(lei)
i=1
while i<=lx:
tt=str(i)+'.txt'
f_out = open(tt,"w",encoding = 'utf_8')
f_in = open("task1.trainSentence.new",encoding = 'utf_8')
for line in f_in:
arr = line.split('\t')
if arr[0]==lei[i-1]:
f_out.write(arr[0]+"\t"+arr[1]+"\t"+arr[2]+"\t"+arr[3]+"\t"+arr[4]+"\t""\n")
f_in.close()
f_out.close()
i=i+1
#print(lei)
##
os.mkdir("exp1_test")
shutil.copy("task1.test.new","exp1_test")
os.chdir("exp1_test")
i=1
while i<=lx:
k=1
tt=str(i)+'_test.txt'
cc="index"+str(i)+'.txt'
f_out = open(tt,"w",encoding = 'utf_8')
f_in = open("task1.test.new")
f_c = open(cc,"w",encoding = 'utf_8')
for line in f_in:
arr = line.split('\t')
if arr[0]==lei[i-1]:
f_out.write(arr[0]+"\t"+arr[1]+"\t"+arr[2]+"\t"+arr[3])
f_c.write(str(k)+"\t")
k=k+1
f_in.close()
f_out.close()
f_c.close()
i=i+1
關于代碼
由于我代碼關于檔案的函式類似于這樣的
os.mkdir("exp1_train")
shutil.copy("task1.trainSentence.new","exp1_train")
shutil.copy("task1.test.new","exp1_train")
os.chdir("exp1_train")
所以這些檔案我放在同一個檔案夾下,我是放在了桌面,如下

然后生成了檔案,位置是這樣的


代碼的一些不足之處
由于這行的限制
os.mkdir(“exp1_train”)
運行一次產生檔案夾及檔案后就無法運行了,就得先把檔案夾刪了再運行,,,
還有關閉檔案的那幾個
貌似可以用with來自動關閉
求指正,求改進,
感謝大家的觀看,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/195776.html
標籤:其他
上一篇:hdf5檔案格式使用攻略
