赛题背景
随着各种社交平台的兴起,网络上用户的生成内容越来越多,产生大量的文本信息,如新闻、微博、博客等,面对如此庞大且富有情绪表达的文本信息,完全可以考虑通过探索他们潜在的价值为人们服务。因此近年来情绪分析受到计算机语言学领域研究者们的密切关注,成为一项进本的热点研究任务。
本赛题目标为在庞大的数据集中精准的区分文本的情感极性,情感分为正中负三类。面对浩如烟海的新闻信息,精确识别蕴藏在其中的情感倾向,对舆情有效监控、预警及疏导,对舆情生态系统的良性发展有着重要的意义。
赛题任务
参赛者需要对我们提供的新闻数据进行情感极性分类,其中正面情绪对应0,中性情绪对应1以及负面情绪对应2。根据我们提供的训练数据,通过您的算法或模型判断出测试集中新闻的情感极性。
数据介绍
下载地址:https://download.csdn.net/download/leo_weile/12006988
https://www.datafountain.cn/competitions/350/datasets
Baseline
通过参考“达观杯”文本智能处理挑战赛中一个大神给的baseline的代码,具体思路可分为如下几部:
1、数据清洗:首先将title和content拼接,删除有nan的行,通过观察文本,将一些特殊符号去除
2、tf-idf:将文本转换为tf-idf权重表示
3、模型训练:使用线性模型LR,SVM模型训练模型,预测,拼成结果提交形式提交
代码
import pandas as pd, numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import time
import jieba
#处理训练集,将训练集的文本信息和label信息合并,清洗特殊符合,同时将文本内容进行分词
def merge_feature_label(feature_name,label_name):
feature=pd.read_csv(feature_name,sep=",")
label=pd.read_csv(label_name,sep=",")
data=feature.merge(label,on='id')
data["X"]=data[["title","content"]].apply(lambda x:"".join([str(x[0]),str(x[1])]),axis=1)
dataDropNa=data.dropna(axis=0, how='any')
print(dataDropNa.info())
dataDropNa["X"]=dataDropNa["X"].apply(lambda x: str(x).replace("\\n","").replace(".","").replace("\n","").replace(" ","").replace("↓","").replace("/","").replace("|","").replace(" ",""))
dataDropNa["X_split"]=dataDropNa["X"].apply(lambda x:" ".join(jieba.cut(x)))
return dataDropNa
dataDropNa=merge_feature_label("Train_DataSet.csv","Train_DataSet_Label.csv")
#处理测试数据
def process_test(test_name):
test=pd.read_csv(test_name,sep=",")
test["X"]=test[["title","content"]].apply(lambda x:"".join([str(x[0]),str(x[1])]),axis=1)
print(test.info())
test["X"]=test["X"].apply(lambda x: str(x).replace("\\n","").replace(".","").replace("\n","").replace(" ","").replace("↓","").replace("/","").replace("|","").replace(" ",""))
test["X_split"]=test["X"].apply(lambda x:" ".join(jieba.cut(x)))
return test
testData=process_test("Test_DataSet.csv")
#获取文本内容的tf-idf表示
xTrain=dataDropNa["X_split"]
xTest=testData["X_split"]
vec = TfidfVectorizer(ngram_range=(1,2),min_df=3, max_df=0.9,use_idf=1,smooth_idf=1, sublinear_tf=1)
xTrain_tfidf = vec.fit_transform(xTrain)
xTest_tfidf = vec.transform(xTest)
yTrain=dataDropNa["label"]
#训练逻辑回归模型
clf = LogisticRegression(C=4, dual=True)
clf.fit(xTrain_tfidf, yTrain)
#预测测试集,并生成结果提交
preds=clf.predict_proba(xTest_tfidf)
preds=np.argmax(preds,axis=1)
test_pred=pd.DataFrame(preds)
test_pred.columns=["label"]
print(test_pred.shape)
test_pred["id"]=list(testData["id"])
test_pred[["id","label"]].to_csv('sub_lr_baseline.csv',index=None)
#训练支持向量机模型
from sklearn import svm
lin_clf = svm.LinearSVC()
lin_clf.fit(xTrain_tfidf, yTrain)
#预测测试集,并生成结果提交
preds=lin_clf.predict(xTest_tfidf)
test_pred=pd.DataFrame(preds)
test_pred.columns=["label"]
test_pred["id"]=list(testData["id"])
test_pred[["id","label"]].to_csv('sub_svm_baseline.csv',index=None)
结果:
群内大佬反馈基于tf-idf的成绩上限大概是0.7,baseline算法没有进行调参,参数基本借鉴以往别人的,最终得分为0.68+
后序计划:
使用fasttext训练一版模型,后面开始尝试深度学习方法的效果。