要进行机器学习,先要有数据。数据集处理是机器学习的基础。本文将介绍如何利用 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 格式输出的任务就完成了。