NLPCC2013中文微博細粒度情感識別(一)
既然是找到了不錯的工作,自然不敢怠慢,作為入職前的準備自己找了個任務幹,再熟悉一下語義識別&文本分類的整個過程。
數據使用的是NLPCC2013的第二個任務,中文微博細粒度情感識別,現在在官網已經不太好找到合適的數據了,我用的是從CSDN上面下載的,tb花了幾塊錢解決。打開一看好家夥,還是xml格式的,有的裏面自帶標簽,有的不帶,還有的有另一套標簽和自帶的不一樣,真是醉了。於是就開始ML裏面最惡心的一步——數據清洗。粗略看了看當時的報告,竟然是先給一個小訓練集,然後放到一個大測試集上面跑,這準確率要是能高才怪的。當時基本上全都是用的ML+特征選擇的方法,準確率貌似50都算高的了。最後我拿到的包括兩個文件,是當時所謂的“訓練集”和“測試集”(兩個文件的數據分布在下面),數據裏面一共包括有1.4w條微博,每個微博裏面有若幹條句子,句子總數大概是4.5w。反正也不是真正去比賽,我就隨機把這4.5w個句子分成了0.8 + 0.1 + 0.1。
(當時的)測試集數據分布:
(當時的)訓練集數據分布:
可以看出,兩種數據集標簽都是一樣的,分布也可以說是差不多。主要特點就是沒有情緒占了大多數,其他情緒加起來和沒有情緒的差不多。在這裏就出現了很嚴重的數據偏斜,如果不進行特征提取的話DL模型對這樣的數據表現怎樣還很難說。
通過最後亂七八糟一通數據清晰,終於把數據成功分成了訓練集,驗證集合測試集,還有一個包含所有文本的用來做embedding。如果需要這些數據的話可以給我發郵件,[email protected]打包發給你。
在這裏也順便把python處理xml的程序po一下,主要是提醒自己別忘了哈哈
import xml.dom.minidomimport matplotlib.pyplot as plt dom = xml.dom.minidom.parse(‘raw_test.xml‘) output = open("test.txt", "w") label_file = open(‘test_label.txt‘, "w") root = dom.documentElement nodes = dom.getElementsByTagName(‘sentence‘) senti_list = [] tag_number = [] labels = [] counter = 0 ‘‘‘ for i in label_file.readlines(): labels.append(i.split()[3]) print(i.split()[3])‘‘‘ for n in nodes: try: print(n.childNodes[0].data, file=output) if n.getAttribute(‘emotion_tag‘) == "N": sentiment = "none" else: if n.getAttribute(‘emotion_tag‘) == "": sentiment = "none" else: sentiment = n.getAttribute(‘emotion-1-type‘) print(sentiment, file=label_file) counter += 1 if sentiment in senti_list: tag_number[senti_list.index(sentiment)] += 1 else: tag_number.append(1) senti_list.append(sentiment) except IndexError: continue print(counter) print(senti_list) print(tag_number) plt.bar(range(len(tag_number)), tag_number,tick_label=senti_list) plt.show()
主要用到的包是xml.dom.minidom 具體他是幹啥的暫時就先不深究了,知道使用的步驟大概需要先解析,再根據標簽查找就好了,要找數據用childnode[0].data,要找屬性用getAttribute("xxx")
這樣的話最討厭的數據清洗就完成了!下一步就是如果制作出像樣的可以輸入到模型裏面的數據,並且構建詞典做embedding,由於其實像word2vec這種超大語料庫訓練的embedding不是很多而且這個微博數據裏面說實話五花八門什麽詞都有,所以打算自己訓練一個,也是順便練練手。下一步的工作主要是對數據做預處理並且合適的方法分好詞。希望可以一天弄好。886~
NLPCC2013中文微博細粒度情感識別(一)