kesci文本情感分类练习赛
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文本情感分类练习赛相关推荐
- 【Kesci】【预选赛】2019中国高校计算机大赛——大数据挑战赛(基于FastText的文本情感分类)
比赛链接:https://www.kesci.com/home/competition/5cb80fd312c371002b12355f 预选赛题--文本情感分类模型 本预选赛要求选手建立文本情感分类 ...
- 循环神经网络实现文本情感分类之使用LSTM完成文本情感分类
循环神经网络实现文本情感分类之使用LSTM完成文本情感分类 1. 使用LSTM完成文本情感分类 在前面,使用了word embedding去实现了toy级别的文本情感分类,那么现在在这个模型中添加上L ...
- 循环神经网络实现文本情感分类之Pytorch中LSTM和GRU模块使用
循环神经网络实现文本情感分类之Pytorch中LSTM和GRU模块使用 1. Pytorch中LSTM和GRU模块使用 1.1 LSTM介绍 LSTM和GRU都是由torch.nn提供 通过观察文档, ...
- python 多分类情感_文本情感分类(一):传统模型
前言:四五月份的时候,我参加了两个数据挖掘相关的竞赛,分别是物电学院举办的"亮剑杯",以及第三届 "泰迪杯"全国大学生数据挖掘竞赛.很碰巧的是,两个比赛中,都有 ...
- 二十一、文本情感分类二
1.1 文本训练化概述 深度学习构建模型前需要将文本转化为向量表示(Word Embedding).首先需要将文本转化为数字(文本序列化),在把数字转化为向量. 可以考虑把文本中的每个词语和其对应的数 ...
- python 多分类情感_python 文本情感分类
对于一个简单的文本情感分类来说,其实就是一个二分类,这篇博客主要讲述的是使用scikit-learn来做文本情感分类.分类主要分为两步:1)训练,主要根据训练集来学习分类模型的规则.2)分类,先用已知 ...
- python 多分类情感词典_基于情感词典的文本情感分类
基于情感词典的文本情感分类 传统的基于情感词典的文本情感分类,是对人的记忆和判断思维的最简单的模拟,如上图.我们首先通过学习来记忆一些基本词汇,如否定词语有"不",积极词语有&qu ...
- tensorflow笔记-文本情感分类
本文是在学习tensorflow2.0官方教程时的一个笔记,原始教程请见文本情感分类 准备工作 1. 安装tensorflow并导入相关库 如果已经安装了可以略去此步 !pip install ten ...
- 使用Python和机器学习进行文本情感分类
使用Python和机器学习进行文本情感分类 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何使用Python进行机器学习的文本情感分类(Text Emotions Classificat ...
最新文章
- golang 调用库函数错误 cannot refer to unexported name
- pam_mysql模块安装
- Basic的Json与Xml
- fopen在linux中打开文件夹,plain C:用fopen()打开一个目录
- 局域网内抢网速_路由器要不要每天重启?多亏宽带师傅透露,难怪网速一天比一天慢...
- java lambda使用_使用Java 8和Lambda简化ReadWriteLock
- aws cognito_使用AWS Cognito的用户管理—(1/3)初始设置
- 办公自动化-发送邮件功能-无格式-有格式-带附件-0225
- 虚拟机查看cpu型号_CentOS7安装KVM虚拟机
- ibm软件工程师含金量_【上海IBM工资】软件开发工程师待遇-看准网
- python混合asp_用python实现面向对象的ASP程序实例
- addEventListener和attachEvent二者绑定的执行函数中的this不相同【转载】
- 应用代理 socket TCP协议 的资料
- ajax应用培训ppt,《ajax培训课件.ppt
- 《AlignedReID: Surpassing Human-Level Performance in Person Re-Identification》论文解读
- SQL语句增删改查公司-员工3表典型案例
- StrStrI 与 strstr
- Ubuntu双网卡主机给其他主机共享网络
- 多个经纬度地点数据,如何同时在地图上标注出来(路径显示)
- html让图片中心旋转,使用CSS让图片旋转起来