分享一下大二做的项目,用了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效果最好,其他模型都有点过拟合

码字不易,点个赞再走~

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐