上一篇文章,我们以微博树洞为例,讲解了怎么自动爬取单个微博的评论。今天我们就要用上这些数据做一个自杀倾向分类器,这样的分类器如果应用得当,将可以帮助成千上万误入歧途的人们挽回生命。

为了简化问题,我们将短文本分为两种类别中的一种,即要么是正常微博、要么是自杀倾向微博。这样,有了上次的微博树洞,训练集和测试集就非常好获得了。由于是短文本二分类问题,可以使用scikit-learn的SVM分类模型。

不过要注意的是,我们的分类器并不能保证分类出来的结果百分百正确,毕竟心理状态是很难通过文本准确识别出来的,我们只能通过文字,大致判断其抑郁情况并加以介入。实际上这是一个宁可错杀一百,不可放过一个的问题。毕竟放过一个,可能就有一条生命悄然流逝。

本文源代码: https://github.com/Ckend/suicide-detect-svm 欢迎一同改进这个项目,在训练集和模型方面,改进的空间还相当大。如果你访问不了github,请关注文章最下方公众号,回复自杀倾向检测获得本项目完整源代码。

1.数据准备

数据集整体上分两个部分,一部分是训练集、一部分是测试集。其中,训练集和测试集中还要分为正常微博短文本和自杀倾向短文本。

将上一篇爬取微博树洞的文章中得到的数据进行人工筛选后,挑出300条作为训练集(有点少,其实业界至少也要3000条以上),再根据上次的微博爬虫随意爬取10000条微博作为训练集的正常微博类。另外再分别搜集自杀倾向微博和普通微博各50条作为测试集。

每条微博按行存储在txt文件里。训练集中,正常微博命名为normal.txt, 自杀倾向微博命名为die.txt。测试集存放在后缀为_test.txt的文件中:

此外,接下来我们会使用到一个机器学习工具包叫scikit-learn(sklearn),其打包好了许多机器学习模型和预处理的方法,方便我们构建分类器,在CMD/Terminal输入以下命令安装:

pip install -U scikit-learn

如果你还没有安装Python,请看这篇文章安装Python,然后再执行上述命令安装sklearn.

2.数据预处理

我们使用一个典型的中文自然语言预处理方法:对文本使用结巴分词后将其数字化。

由于具有自杀倾向的微博中,其实类似于"死"、“不想活”、"我走了"等这样的词语比较常见,因此我们可以用TF-IDF将字符串数字化。如果你不了解TF-IDF,请看这篇文章: 文本处理之 tf-idf 算法及其实践

数字化的部分代码如下。

print('(2) doc to var...')
from sklearn.feature_extraction.text import CountVectorizer, 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("the shape of train is "+repr(counts_train.shape)  )
count_v2 = CountVectorizer(vocabulary=count_v0.vocabulary_)
counts_test = count_v2.fit_transform(test_texts)
print("the shape of test is "+repr(counts_test.shape)  )# 保存数字化后的词典
joblib.dump(count_v0.vocabulary_, "model/die_svm_20191110_vocab.m")counts_all = count_v2.fit_transform(all_text)
print("the shape of all is "+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...')
from sklearn.svm import SVC# 使用线性核函数的SVM分类器,并启用概率估计(分别显示分到两个类别的概率如:[0.12983359 0.87016641])
svclf = SVC(kernel = 'linear', probability=True) # 开始训练
svclf.fit(x_train,y_train)
# 保存模型
joblib.dump(svclf, "model/die_svm_20191110.m")

这里我们忽略了SVM原理的讲述,SVM的原理可以参考这篇文章:支持向量机(SVM)——原理篇

4.测试

测试的时候,我们要分别计算模型对两个类别的分类精确率和召回率。scikit-learn提供了一个非常好用的函数classification_report来计算它们:

# 测试集进行测试
preds = svclf.predict(x_test)
y_preds = svclf.predict_proba(x_test)preds = preds.tolist()
for i,pred in enumerate(preds):# 显示被分错的微博if int(pred) != int(y_test[i]):try:print(origin_eval_text[i], ':', test_texts[i], pred, y_test[i], y_preds[i])except Exception as e: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 短文本自动识别个体是否有自杀倾向

Python 短文本自动识别个体是否有自杀倾向相关推荐

  1. Python短文本自动识别个体是否有自杀倾向【新手必学】

    我们以微博树洞为例,讲解了怎么自动爬取单个微博的评论.今天我们就要用上这些数据做一个自杀倾向分类器,这样的分类器如果应用得当,将可以帮助成千上万误入歧途的人们挽回生命. 为了简化问题,我们将短文本分为 ...

  2. python写一个自动识别图片提取文字

    python写一个自动识别图片提取文字. ** 1.介绍 使用python写一个自动识别图片提取文字的exe. 进行图像的文字识别,将图像中的文字提取出来,可以帮助我们完成很多有趣的事情. 准备工作 ...

  3. 大数据24小时:商汤科技获阿里15亿投资,Facebook要用AI监测用户自杀倾向

    "AlphaGo之父"DeepMind进军医疗,要用人工智能对抗乳腺癌:"自杀直播"事件频发,Facebook要用人工智能监测用户自杀倾向:半年内完成多轮融资, ...

  4. 用机器算法预测自杀倾向

    原文地址 大约有30%到三分之二的自杀企图都是一瞬间的冲动,这是极难预测的.这个数据来自于统计那些尝试了几乎致命的自杀企图的人,70%这样的人都是在不到一个小时内做出了决定.尽管这种自我了断的解决方式 ...

  5. 人工智能拯救生命:自杀倾向预测

    由弗罗里达州立大学研究者领导的开创性项目在自杀预测方面取得了巨大的进步,使得临床医生可能预测最多长达两年之后的自杀,准确率达到80%. 弗罗里达州立大学研究者Jessica Ribeiro急切希望解决 ...

  6. 基于Python的Opencv 自动识别银行卡卡号系统

    一. 摘要 此应用功能为自动识别并获取银行卡卡号,通过导入需要识别的银行卡图片,以及跟银行卡上卡号的数字相一致的数字模型,则可以成功实现识别并获取银行卡卡号的功能.如果你对此感兴趣的话,下面将会详细介 ...

  7. python tesseract selenium自动识别验证码登陆

    文章目录 前言 一.下载安装tesserocr 1. 环境:win7 x64位 +python3.6 2. 下载链接 3.安装注意事项 二.安装pytesseract和Pillow包 1.使用pych ...

  8. python动图自动识别_这种图片可以用Python自动识别吗()

    python如何检测字典的键中是否含有某串字符? 1.说明 python测字典的键中是否含有某串字符,便利字典键值,再判符串是否在键值中即可. 2例代码: # 定义一个字典 dic = {'1984/ ...

  9. Python 神器!自动识别文字中的省市区并绘图

    来源:Python实用宝典 在做NLP(自然语言处理)相关任务时,经常会遇到需要识别并提取省.城市.行政区的需求.虽然我们自己通过关键词表一个个查找也能实现提取目的,但是需要先搜集省市区关键词表,相对 ...

最新文章

  1. Codeforces 1093D Beautiful Graph
  2. python-字符串的格式化输出format
  3. JavaScript学习五
  4. 云计算-My Future, The IT's Future
  5. Flask 框架中 上下文基础理念,包括cookie,session存储方法,requset属性,current_app模块和g模块...
  6. 基于物理的渲染详尽指南 卷1光与介质:基于物理的渲染和着色理论
  7. MySQL 在并发场景下会遇到的问题及解决方案~
  8. Oracle数据库锁表查询
  9. 公众号引流进阶教程(公众号对接电影,影视资源)
  10. 7. 测度论-有限维乘积测度和Fubini定理
  11. matlab冒号,括号的用法
  12. 自定义设置HTTP响应头
  13. C# 反双曲余弦函数
  14. WorldFirst万里汇推出港币和离岸人民币账户!
  15. python画卡通人物_追忆童年,教你用Python画出儿时卡通人物
  16. localstorage在苹果手机浏览器无效
  17. 基于2022高考数学全国卷I概率题解题思路初步分析新冠病毒疫苗
  18. SQL Server 2017 安装必备
  19. Gate使用手册(四)数据输出
  20. python打造记账本,记账本-简单的python脚本

热门文章

  1. 又看到一种新的日志转贴方法
  2. 谐振电路的品质因数(Q值)
  3. 计算机等级良好和优秀是什么意思?
  4. 百度搜素推出细雨算法
  5. SMP与AMP体系结构
  6. 手把手教你快速搭建私服环境
  7. Hive 不同存储格式表数据同步问题
  8. IP欺骗种类有哪些?
  9. 花旗杯决赛第二 + 最佳移动应用
  10. MQTT网关如何接入物联网平台?