【Kesci】【預選賽】2019中國高校計算機大賽——大數據挑戰賽(基於FastText的文本情感分類)

比賽鏈接:https://www.kesci.com/home/competition/5cb80fd312c371002b12355f

預選賽題——文本情感分類模型
本預選賽要求選手建立文本情感分類模型,選手用訓練好的模型對測試集中的文本情感進行預測,判斷其情感爲「Negative」或者「Positive」。所提交的結果按照指定的評價指標使用在線評測數據進行評測,達到或超過規定的分數線即通過預選賽。
比賽數據
數據樣本格式:

其中,訓練集的樣本規模爲6328,測試集的樣本規模爲2712。爲保證比賽結果的真實性。每週一中午12點,將替換爲新的測試集數據,供隊伍答題使用。
提交結果
選手提交.csv的結果文件,文件名可以自定義,但文件內的字段需要對應。其中,ID表示文本唯一標識,pred表示預測該條文本的情感狀態是否爲「Positive」。

結果文件的內容示例:
在這裏插入圖片描述
解答
這個題目我是當作了一個二分類問題,之前參加比賽使用過Fasttext感覺還不錯,就想到了用這個嘗試一下,下面附上代碼。(沒有系統學習過Python和機器學習,代碼有些醜,見諒)

首先是預處理,去掉數據集中的符號並且將數據轉化爲fasttext要求的格式。
fasttext的使用較爲簡單,要求的格式爲 “內容xxxxxx __label__標籤"

import re
import fasttext
import pandas as pd
from sklearn.model_selection import train_test_split

# train處理
train_pre = open('../data/train_pre.csv', 'w', encoding='utf-8')
cnt = 0
for line in open('../data/train.csv', 'r'):  # 打開文件
    cnt = cnt + 1
    if cnt == 1:
        train_pre.write('review,label\n')
    line = line.replace('ID,review,label', '')
    line = line.replace('\r', '')  # 替換換行符
    line = line.replace(',', '')
    line = line.replace('\n', '')
    if (line == '\n'):
        line = ''
    comp = re.compile('[^A-Z^a-z\n ]')
    line = comp.sub('', line)
    line = line.replace('Positive', ', __label__Positive\n')
    line = line.replace('Negative', ', __label__Negative\n')
    train_pre.write(line)

之後就可以愉快地調用fasttext啦,不過爲了訓練效果更好,我使用train_test_split進行亂序劃分測試集和訓練集,以便查看分類效果。代碼如下

data = pd.read_csv('../data/train_pre.csv')
x = data['review']
y = data['label']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=12345)
train_true = open('../data/train_true.csv', 'w', encoding='utf-8')
for i in zip(x_train, y_train):
   t = str(i[0]) + ' ' + str(i[1]) + '\n'
   train_true.write(t)
train_true = open('../data/train_test.csv', 'w', encoding='utf-8')
for i in zip(x_test, y_test):
   t = str(i[0]) + ' ' + str(i[1]) + '\n'
   train_true.write(t)

之後就是真正地調用fasttext進行分類了

classifier = fasttext.supervised('../data/train_true.csv', 'classifier.model')
result = classifier.test('../data/train_test.csv')
print("準確率:", '{:.2%}'.format(result.precision))

由於比賽還沒結束,supervised涉及到很多參數調整可以優化分類效果,這裏我就不公佈參數了。
分享一個fasttext的參數介紹:https://blog.csdn.net/qq_32023541/article/details/80845913

最後,調用訓練好的模型對測試集進行預測並保存

import fasttext
import pandas as pd
import re

classifier = fasttext.load_model("classifier.model.bin", label_prefix="__label__")
test = pd.read_csv('../data/test.csv', header=0)
t = list(test['review'])
print(t)
comp = re.compile('[^A-Z^a-z\n ]')
num = 0
result = open('../data/result.csv', 'w', encoding='utf-8')
result.write('ID,Pred\n')
for i in t:
    num = num + 1
    line = comp.sub('', i)
    pred = classifier.predict_proba([line], 1)
    myType = pred[0][0][0]
    myPrec = pred[0][0][1]
    if myType == 'Negative':
        myPrec = 1 - myPrec

    result.write(str(num)+','+str(round(myPrec,6))+'\n')

提交通過
在這裏插入圖片描述
祝各位比賽順利~

另外附上我之前在服創比賽的博客鏈接,歡迎大家
https://blog.csdn.net/qq_36178727/article/details/89712858

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章