要進行機器學習,先要有資料。資料集處理是機器學習的基礎。本文將介紹如何利用 python 內建的 csv 模組進行一些簡單的資料集處理。 任務
將指定的 semeval 檔案按照規定格式處理成 .csv 檔案。
seminal 檔案預覽如下圖:
每一行資料集由三個 part 組成——序號、情感和文本;part 與 part 之間由 tab 鍵分開,每一個 part 內部文本由空格分開。
要求用 python 實現的 .csv 檔案效果如下:
演算法
解決這個問題的演算法是相對簡單的。首先我們輸出最上方的表頭,然後依次讀入每行的內容,先按 \t 分割三個 part,然後對中間情感的 part 再分別按空格和冒號分割,取到後面的值。最後按要求輸出即可。 代碼實現
對於新手來說,解決這個問題的代碼實現還是有一定難度的,需要我們對 python3 的檔案讀寫、字串處理和 csv模組有一定的瞭解。
首先先看一下最終的代碼:
import csv#print the header:with open("new.csv", "w") as csvFile: fileheader = ["id", "text", 'all', 'anger', 'disgust', 'fear', \ 'joy', 'sad', 'surprise'] writer = csv.writer(csvFile) writer.writerow(fileheader)with open('/path/semeval', 'r') as inputFile: currentLineContent = inputFile.readline() while(currentLineContent): part = currentLineContent.split('\t') #split in 3 parts: num = part[0] emo = part[1] text = part[2] #spilt different emotions: emo = emo.split(' ') csvall = emo[0].split(':')[1] anger = emo[1].split(':')[1] disgust = emo[2].split(':')[1] fear = emo[3].split(':')[1] joy = emo[4].split(':')[1] sad = emo[5].split(':')[1] surprise = emo[6].split(':')[1] with open("new.csv", "a") as csvFile: dict_writer = csv.DictWriter(csvFile, fileheader) dict_writer.writerow({"id":num, "text":text, 'all':csvall,\ 'anger':anger, 'disgust':disgust, 'fear':\ fear, 'joy':joy, 'sad':sad, 'surprise':\ surprise}) currentLineContent = inputFile.readline()
讀取檔案
我們首先來看讀取檔案的部分:
with open('/Users/youzunzhi/Desktop/semeval', 'r') as inputFile: currentLineContent = inputFile.readline() while(currentLineContent): ... currentLineContent = inputFile.readline()
python 內建的 open()函數可以開啟一個檔案對象:
f = open('/path/file.txt', 'r')
其中'r' 表示用讀檔案的模式開啟。此外還可以用: 'w':寫檔案模式 'a':在原檔案後面添加的模式
以這樣的方式開啟檔案成功後,檔案對象會一直佔用作業系統的資源,所以要用close()方法關閉這個檔案:
f.close()
由於這樣的方法過於繁瑣還容易被忘記,python 提供了with語句來自動幫我們調用close()方法:
with open('/path/file.txt', 'r') as f: pass
開啟檔案後,就可以對檔案進行操作了。如果檔案很小,可以用read()直接讀取,但如果檔案很大的話記憶體就會直接爆掉了,所以這裡我們用readline()方法一行一行的讀取,直到讀取結束,while的條件就會為 False了。 字串處理
再來看字串處理的部分:
part = currentLineContent.split('\t') #split in 3 parts: num = part[0] emo = part[1] text = part[2] #spilt different emotions: emo = emo.split(' ') csvall = emo[0].split(':')[1] anger = emo[1].split(':')[1] disgust = emo[2].split(':')[1] fear = emo[3].split(':')[1] joy = emo[4].split(':')[1] sad = emo[5].split(':')[1] surprise = emo[6].split(':')[1]
python3 提供了 split()函數來分割字串。使用後函數將會返回一個list,所以在按 \t 分割後我們先分別將得到的列表中的三個元素分別賦給 num,emo,和 text。然後繼續按空格和冒號分割,最後分別取出分割後的列表的第二個值賦給各個情緒。 csv文本輸出
最後我們利用 python3 內建的csv模組將資料集按要求輸出成 .csv檔案。
import csv#print the header:with open("new.csv", "w") as csvFile: fileheader = ["id", "text", 'all', 'anger', 'disgust', 'fear', \ 'joy', 'sad', 'surprise'] writer = csv.writer(csvFile) writer.writerow(fileheader)...with open("new.csv", "a") as csvFile: dict_writer = csv.DictWriter(csvFile, fileheader) dict_writer.writerow({"id":num, "text":text, 'all':csvall,\ 'anger':anger, 'disgust':disgust, 'fear':\ fear, 'joy':joy, 'sad':sad, 'surprise':\ surprise})
首先我們用csv中的writer函數中的writerow方法輸出表頭。
writer.writerow(fileheader)
對於後面的值,雖然也可以按順序輸出,但是這裡我們再介紹一種DictWriter函數,它以詞典的方式按照指定的 key 輸出值,而不用擔心順序問題。
dict_writer = csv.DictWriter(csvFile, fileheader)
DictWriter函數也有writerow方法,參數是一個詞典。
dict_writer.writerow({"id":num, "text":text, 'all':csvall,\ 'anger':anger, 'disgust':disgust, 'fear':\ fear, 'joy':joy, 'sad':sad, 'surprise':\ surprise})
至此,用 python3 處理文本資料集,並用 csv 格式輸出的任務就完成了。