kesci文本情感分类练习赛(朴素贝叶斯)

原网址:https://www.kesci.com/home/competition/5c77ab9c1ce0af002b55af86/content/0
因为练习赛已经截止了,虽然提供了训练集和测试集,但是找不到答案。
他的数据集是名为「Roman Urdu DataSet」的公开数据集,所以我直接把这个数据集扒了下来,
从里面扣了9000条作为训练集,2000条作测试集,附于文末。
代码我是参考了这位大佬的博文,然后做了一些小的修改:
https://blog.csdn.net/sinat_34263473/article/details/89059912?tdsourcetag=s_pcqq_aiomsg
大的思路上面已经讲的很清楚了,代码我也附在文末,这里我说一下我觉得比较有价值的几个点:

朴素贝叶斯及数学推导

先来看一下朴素贝叶斯的公式;

概率论里有这样一个知识:
P(XY)=P(X|Y)P(Y)
即:事件X和事件Y同时发生的概率=事件Y发生的概率*事件Y发生的情况下事件X发生的概率
所以就可以做出如下推导:
P(XY)=P(YX)=P(X|Y)P(Y)=P(Y|X)P(X),
所以就可以得出:

在这道题里X就是出现了哪些单词,Y就是句子是Positive还是Negative。
又因为句子中出现哪些单词相互独立,所以假设单词为x1,x2,x3…
P(X)=p(x1)p(x2)…*p(xn)
就有了最上面的式子。
其中p(yi)就是句子是y(Positive/Negative)的概率,
p(xj|yi)就是在句子是y(Positive/Negative)的情况下出现单词xj的概率,
记录在下面程序的p0Vect和p1Vect中。

朴素贝叶斯的优化

我们知道加法是比减法快的,而取对数可以把乘法化为加法,
又因为自然对数函数ln单调递增,所以p(y0)和p(y1)的大小关系在取对数后不变。
两边取对数,得:
Log(P(yi|x1,x2,…,xd))=Log(P(yi))+∑Log(P(xj|yi))-∑Log(P(xj))
代到题目里面,就是说:
p0’=Log(P(y0|x1,x2,…,xd))=Log(P(y0))+∑Log(P(xj|y0))-∑Log(P(xj))
p1’=Log(P(y1|x1,x2,…,xd))=Log(P(y1))+∑Log(P(xj|y1))-∑Log(P(xj))
由于最后是做预测,肯定是比较p0’和p1’谁大,即句子是Negative还是Positive的概率大,就预测结果是0还是1,观察到两个式子的最后都有一个减项-∑Log(P(xj));因为是要比大小,又因为a-c>b-c则a>b,所以最后一项可以在求概率的时候去掉,节省了大量的计算。

概率向量的处理

主要是这一段:

# 训练二分类朴素贝叶斯,返回3个参数
# p0Vect表示在类别0中,各个词汇出现的概率向量
# p1Vect表示在类别1中,各个词汇出现的概率向量
# pAbusive表示训练集中,类别1的概率# trainMatrix表示训练集的词汇矩阵,是一组向量,trainMatrix[i]是一个向量
# trainCategory表示各个样本的类别
def trainNB0(trainMatrix, trainCategory):numTrainDocs = len(trainMatrix)numWords = trainMatrix.shape[1]# 二分类问题,可直接对类别向量进行求和,即类别1的个数pAbusive = sum(trainCategory) / numTrainDocsp0Num = np.ones(numWords).reshape(1, -1)p1Num = np.ones(numWords).reshape(1, -1)# 为避免计算概率时,分母为0,p0Denom = 2.p1Denom = 2.#下面的都是向量加法,每个词相加,加出来是向量for i in range(numTrainDocs):if trainCategory[i] == 1:p1Num += trainMatrix[i]p1Denom += sum(trainMatrix[i])else:p0Num += trainMatrix[i]p0Denom += sum(trainMatrix[i])# 将频率转换成概率p1Vect =np.log(p1Num / p1Denom)p0Vect =np.log(p0Num / p0Denom)print("Positive数据占比:",pAbusive)return p0Vect, p1Vect, pAbusive
p0Vect, p1Vect, pAbusive = trainNB0(train_mat[:, :-1], train_mat[:, -1])

之前我们把每个句子的词向量统计出来了,所谓词向量就是对于一个句子,其中出现的单词置1,没出现的单词置0.这里用的是向量加法,是不同向量间相同位置的元素相加,所以所有的句子加出来就是这样一个向量:[count(word1),count(word2),count(word3),…,count(wordn)]
用这个向量除以总的单词出现的个数sum(trainMatrix[i]),就是每个词的概率向量,即:
[p(x1),p(x2),p(x3),…,p(xn)]
又因为可以对数优化,再用numpy.log求个对数,方便后面朴素贝叶斯的优化计算。

预测

# 预测数据
# vec2Classify表示待预测的数据向量
# p0Vec, p1Vec, pClass1分别对应着之前朴素贝叶斯模型的参数
# p0Vect表示在类别0中,各个词汇出现的概率向量
# p1Vect表示在类别1中,各个词汇出现的概率向量
# pAbusive表示训练集中,类别1的概率def predictNB(vec2Classify,p0Vec, p1Vec, pClass1):p1 = np.sum(vec2Classify * p1Vec) + np.log(pClass1)         #∑p(xi)因为p1和p0都有,可以作为一个公系数略去。p0 = np.sum(vec2Classify * p0Vec) + np.log(1 - pClass1)if (p1>=p0): return 1else: return 0

这里的vec2Classify即句子的词组成向量,句子中出现的单词置1,没出现的单词置0.
0乘任何数等于0,所以只有出现了的单词才会被计算,即实现了对公式:

中x1,x2…,xj的筛选。
至于公式为什么长这样在第一部分已经做了推导。

运行结果


最后是数据集和代码:
链接:https://pan.baidu.com/s/10zKUxKP-_VTgRDMdF1k41g
提取码:axfz

kesci文本情感分类练习赛相关推荐

  1. 【Kesci】【预选赛】2019中国高校计算机大赛——大数据挑战赛(基于FastText的文本情感分类)

    比赛链接:https://www.kesci.com/home/competition/5cb80fd312c371002b12355f 预选赛题--文本情感分类模型 本预选赛要求选手建立文本情感分类 ...

  2. 循环神经网络实现文本情感分类之使用LSTM完成文本情感分类

    循环神经网络实现文本情感分类之使用LSTM完成文本情感分类 1. 使用LSTM完成文本情感分类 在前面,使用了word embedding去实现了toy级别的文本情感分类,那么现在在这个模型中添加上L ...

  3. 循环神经网络实现文本情感分类之Pytorch中LSTM和GRU模块使用

    循环神经网络实现文本情感分类之Pytorch中LSTM和GRU模块使用 1. Pytorch中LSTM和GRU模块使用 1.1 LSTM介绍 LSTM和GRU都是由torch.nn提供 通过观察文档, ...

  4. python 多分类情感_文本情感分类(一):传统模型

    前言:四五月份的时候,我参加了两个数据挖掘相关的竞赛,分别是物电学院举办的"亮剑杯",以及第三届 "泰迪杯"全国大学生数据挖掘竞赛.很碰巧的是,两个比赛中,都有 ...

  5. 二十一、文本情感分类二

    1.1 文本训练化概述 深度学习构建模型前需要将文本转化为向量表示(Word Embedding).首先需要将文本转化为数字(文本序列化),在把数字转化为向量. 可以考虑把文本中的每个词语和其对应的数 ...

  6. python 多分类情感_python 文本情感分类

    对于一个简单的文本情感分类来说,其实就是一个二分类,这篇博客主要讲述的是使用scikit-learn来做文本情感分类.分类主要分为两步:1)训练,主要根据训练集来学习分类模型的规则.2)分类,先用已知 ...

  7. python 多分类情感词典_基于情感词典的文本情感分类

    基于情感词典的文本情感分类 传统的基于情感词典的文本情感分类,是对人的记忆和判断思维的最简单的模拟,如上图.我们首先通过学习来记忆一些基本词汇,如否定词语有"不",积极词语有&qu ...

  8. tensorflow笔记-文本情感分类

    本文是在学习tensorflow2.0官方教程时的一个笔记,原始教程请见文本情感分类 准备工作 1. 安装tensorflow并导入相关库 如果已经安装了可以略去此步 !pip install ten ...

  9. 使用Python和机器学习进行文本情感分类

    使用Python和机器学习进行文本情感分类 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何使用Python进行机器学习的文本情感分类(Text Emotions Classificat ...

最新文章

  1. golang 调用库函数错误 cannot refer to unexported name
  2. pam_mysql模块安装
  3. Basic的Json与Xml
  4. fopen在linux中打开文件夹,plain C:用fopen()打开一个目录
  5. 局域网内抢网速_路由器要不要每天重启?多亏宽带师傅透露,难怪网速一天比一天慢...
  6. java lambda使用_使用Java 8和Lambda简化ReadWriteLock
  7. aws cognito_使用AWS Cognito的用户管理—(1/3)初始设置
  8. 办公自动化-发送邮件功能-无格式-有格式-带附件-0225
  9. 虚拟机查看cpu型号_CentOS7安装KVM虚拟机
  10. ibm软件工程师含金量_【上海IBM工资】软件开发工程师待遇-看准网
  11. python混合asp_用python实现面向对象的ASP程序实例
  12. addEventListener和attachEvent二者绑定的执行函数中的this不相同【转载】
  13. 应用代理 socket TCP协议 的资料
  14. ajax应用培训ppt,《ajax培训课件.ppt
  15. 《AlignedReID: Surpassing Human-Level Performance in Person Re-Identification》论文解读
  16. SQL语句增删改查公司-员工3表典型案例
  17. StrStrI 与 strstr
  18. Ubuntu双网卡主机给其他主机共享网络
  19. 多个经纬度地点数据,如何同时在地图上标注出来(路径显示)
  20. html让图片中心旋转,使用CSS让图片旋转起来

热门文章

  1. Grafana平台监控应用实例
  2. 通信系统中dB、dBm、dBFS、dBi的含义
  3. Googledrive 下载大文件
  4. php 高校党员培训管理系统-计算机毕设 附源码56161
  5. chatGPT回答:java如何将dwg转为dxf
  6. IMDB-WIKI - 具有年龄和性别标签的500k +脸部图像
  7. C++:设置有效位数/保留小数点两位
  8. Python之EXCEL文件转换为CSV文件
  9. 福师计算机辅助设计1PS在线作业二,奥鹏福师《计算机辅助设计1(PS)》在线作业二1...
  10. ajax完整功能框架