分享一下大二做的项目,用了NB、KNN、SVM、Xgboost、Sequential神经网络五种方法进行文本分类。
首先刑事案件数据集从中国裁决书网站和北大爬取的,一共4000+条,如下所示:
content | label |
广西壮族自治区贺州市中级人民法院 SSJL 刑 事 判 决 书 AJJBQK …… | 绑架罪 |
广西壮族自治区东兴市人民法院 SSJL 刑 事 判 决 书 AJJBQK (20…… | 交通肇事罪 |
广西壮族自治区百色市中级人民法院 SSJL 刑 事 判 决 书 AJJBQK (…… | 交通肇事罪 |
北大法宝【法宝引证码】 CLIC11504688 原文链接:ht…… | 抢夺罪 |
广西壮族自治区南宁市西乡塘区人民法院 SSJL 刑 事 附 带 民 事 判…… | 故意毁坏财物罪 |
1.预处理
先用jieba库给文章分词:
import jieba
content=data.content.tolist()
content_S = []
for line in content:
current_segment = jieba.lcut(line) #对每一篇文章进行分词
if len(current_segment) > 1 and current_segment != '\r\n': #换行符
content_S.append(current_segment) #保存分词的结果
分词效果如下:
给所有数据集进行并行分词:
import jieba
#jieba.enable_parallel(64) #并行分词开启
data['content_S'] = data['content'].apply(lambda i:jieba.cut(i) )
data['content_S'] =[' '.join(i) for i in data['content_S']]
data.head()
2.定义分类损失函数:
def multiclass_logloss(actual, predicted, eps=1e-15):
"""对数损失度量(Logarithmic Loss Metric)的多分类版本。
:param actual: 包含actual target classes的数组
:param predicted: 分类预测结果矩阵, 每个类别都有一个概率
"""
if len(actual.shape) == 1:
actual2 = np.zeros((actual.shape[0], predicted.shape[1]))
for i, val in enumerate(actual):
actual2[i, val] = 1
actual = actual2
clip = np.clip(predicted, eps, 1 - eps)
rows = actual.shape[0]
vsota = np.sum(actual * np.log(clip))
return -1.0 / rows * vsota
3.划分好数据集之后,再用tfidf再对文本进行处理:
stwlist=[line.strip() for line in open('stopwords.txt','r',encoding='utf-8').readlines()]
tfv = TfidfVectorizer(min_df=3, max_df=0.5, max_features=None,
ngram_range=(1, 2), use_idf=True,
smooth_idf=True, stop_words=stwlist)
tfv.fit(list(xtrain) + list(xvalid))
xtrain_tfv = tfv.transform(xtrain)
xvalid_tfv = tfv.transform(xvalid)
4.模型训练:
朴素贝叶斯:
测试下效果如何:
KNN:
SVM向量机:
Xgboost:
Seq神经网络:
最终的AUC曲线:
其中xgboost效果最好,其他模型都有点过拟合
码字不易,点个赞再走~