比賽鏈接: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