上一篇我们以微博树洞为例,讲解了如何自动爬取单个微博的评论。今天我们将使用这些数据来构建一个自杀分类器,如果应用得当,它可以挽救成千上万误入歧途的人的生命。为了简化问题,我们将短文本分为两类之一,即普通推文或自杀式推文。这样,有了上次微博树洞,训练集和测试集就很容易得到了。既然是短文本分类问题,可以使用scikit-learn的SVM分类模型。但是需要注意的是,我们的分类器不能保证分类结果100%正确。毕竟,很难通过文字来准确识别精神状态。我们只能通过文字来粗略判断他的抑郁程度并进行干预。其实这是一道宁可错杀一百,也不可放过一个的题。毕竟,一个人放手,另一个生命可能会悄然逝去。本文源码:https://github.com/Ckend/suicide-detect-svm欢迎大家共同完善本项目。在训练集和模型方面,还有相当大的改进空间。如果无法访问github,请关注文章底部公众号,回复自杀倾向检测获取本项目完整源码。1.数据准备数据集整体分为两部分,一部分是训练集,一部分是测试集。其中,训练集和测试集进一步分为正常微博短文和自杀短文。对上一篇爬微博树洞的文章得到的数据进行人工筛选后,选取了300个词条作为训练集(有点小,其实业内至少有3000个词条),然后根据上次微博爬虫随机抓取10000条微博作为训练集的普通微博。此外,还收集了50条自杀微博和50条普通微博作为测试集。每条微博都按行存储在一个txt文件中。在训练集中,正常微博命名为normal.txt,自杀微博命名为die.txt。测试集保存在一个后缀为_test.txt的文件中:另外,接下来我们会用到一个机器学习工具包scikit-learn(sklearn),里面封装了很多机器学习模型和预处理方法,方便我们构建classifier,在CMD/Terminal中输入以下命令进行安装:pipinstall-Uscikit-learn如果你还没有安装Python,请阅读这篇文章安装Python,然后执行上面的命令安装sklearn。2.数据预处理我们使用典型的中文自然语言预处理方法:使用结巴分词后将文本数字化。由于“死了”、“不想活了”、“我走了”等词在自杀微博中比较常见,我们可以使用TF-IDF对字符串进行数字化处理。如果你不知道TF-IDF,请看这篇文章:文本处理的tf-idf算法及其实用的数字化部分代码如下。print('(2)doctovar...')fromsklearn.feature_extraction.textimportCountVectorizer,TfidfTransformer#CountVectorizer考虑训练文本中各个词汇出现的频率,得到计数矩阵count_v0=CountVectorizer(analyzer='word',token_pattern='w{1,}')counts_all=count_v0.fit_transform(all_text)count_v1=CountVectorizer(vocabulary=count_v0.vocabulary_)counts_train=count_v1.fit_transform(train_texts)print("火车的形状是"+repr(counts_train.shape))count_v2=CountVectorizer(vocabulary=count_v0.vocabulary_)counts_test=count_v2.fit_transform(test_texts)print("theshapeoftestis"+repr(counts_test.shape))#保存数字化字典joblib.dump(count_v0.vocabulary_,"model/die_svm_20191110_vocab.m")counts_all=count_v2.fit_transform(all_text)print("all的shape是"+repr(counts_all.shape))#将计数矩阵转换为归一化的tf-idf格式tfidftransformer=TfidfTransformer()train_data=tfidftransformer.fit(counts_train).transform(counts_train)test_data=tfidftransformer.fit(counts_test).transform(counts_test)all_data=tfidftransformer.fit(counts_all).transform(counts_all)##3.使用scikit-learn训练SVM分类模型,我们可以快速训练并构建一个分类器:print('(3)SVM...')fromsklearn。svmimportSVC#使用线性核函数的SVM分类器,并开启概率估计(显示被分为两类的概率,如:[0.129833590.87016641])svclf=SVC(kernel='linear',probability=True)#开始训练svclf.fit(x_train,y_train)#保存模型joblib.dump(svclf,"model/die_svm_20191110.m")这里忽略SVM原理的描述,SVM原理可以参考这篇文章:SupportVectorMachine(SVM)—Principle4.在测试的时候,我们需要计算模型对于两个类别的分类准确率和召回率scikit-learn提供了一个非常有用的函数classification_report来计算它们:#testSetfortestingpreds=svclf.predict(x_test)y_preds=svclf.predict_proba(x_test)preds=preds.tolist()fori,predinenumerate(preds):#显示错误分类的微博ifint(pred)!=int(y_test[i]):try:print(origin_eval_text[i],':',test_texts[i],pred,y_test[i],y_preds[i])exceptExceptionase:print(e)#分别查看两个类别的准确率、召回率和F1值print(classification_report(y_test,preds))结果:自杀微博分类准确率100%,但召回率不够,只发现50条微博60%,也就是30条自杀微博。对于正常微博的分类,准确率为71%,也就是说有部分正常微博被归类为有自杀倾向,但召回率为100%,即没有未分类的正常微博。这是确定训练集不够的结果。我们自杀的微博数据只有300条,远远不够。如果能提高到3000,相信成绩会提高很多,尤其是自杀微博的召回率。.估计模型最终的准确率和召回率至少可以达到95%。本文源码:https://github.com/Ckend/suicide-detect-svm欢迎大家共同完善本项目。如果无法访问github,请关注文章底部公众号,回复自杀倾向检测获取本项目完整源码。如果喜欢今天的Python教程,请继续关注Python实战宝典。如果对您有帮助,请点击下方的赞/观看。有什么问题可以在下方评论区留言,我们会耐心解答!Python实战宝典(pythondict.com)不仅仅是一个集合。欢迎关注公众号:Python实战宝典原文来自Python实战宝典:Python短文自动识别个体是否有自杀倾向
