Naive Bayesian文本分类器
贝叶斯学习方法中有用性非常高的一种为朴素贝叶斯学习期,常被称为朴素贝叶斯分类器。
在某些领域中与神经网络和决策树学习相当。尽管朴素贝叶斯分类器忽略单词间的依赖关系。即如果全部单词是条件独立的,但朴素贝叶斯分类在实际应用中有非常出色的表现。
朴素贝叶斯文本分类算法伪代码:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
朴素贝叶斯文本分类算法流程:
通过计算训练集中每一个类别的概率与不同类别下每一个单词的概率,然后利用朴素贝叶斯公式计算新文档被分类为各个类别的概率。终于输出概率最大的类别。
C++源代码:
/*
Bayesian classifier for document classifiaction
15S103182
Ethan
2015.12.27
*/
#include <iostream>
#include <vector>
#include <iterator>
#include <map>
#include <fstream>
#include <iomanip>
#include <sstream>
using namespace std;
int stringToInteger(string a){
stringstream ss;
ss<<a;
int b;
ss>>b;
return b;
}
vector<int> openClassificationFile(const char* dataset){
fstream file;
file.open(dataset,ios::in);
if(!file)
{
cout <<"Open File Failed!" <<endl;
vector<int> a;
return a;
}
vector<int> data;
int i=1;
while(!file.eof()){
string temp;
file>>temp;
data.push_back(stringToInteger(temp));
}
file.close();
return data;
}
vector<string> openFile(const char* dataset){
fstream file;
file.open(dataset,ios::in);
if(!file)
{
cout <<"Open File Failed!" <<endl;
vector<string> a;
return a;
}
vector<string> data;
int i=1;
while(!file.eof()){
string temp;
file>>temp;
data.push_back(temp);
}
file.close();
for(int i=0;i<data.size();i++) cout<<data[i]<<"\t";
cout<<endl;
cout<<"Open file successfully!"<<endl;
return data;
}
vector<vector<string> > openFiles(const vector<char*> files){
vector<vector<string> > docs;
for(int i=0;i<files.size();i++){
vector<string> t = openFile(files[i]);
docs.push_back(t);
}
return docs;
}
void bayesian(vector<vector<string> > docs,vector<int> c,vector<string> d){
map<string,int> wordFrequency;//每一个单词出现的个数
map<int,float> cWordProbability;//类别单词频率
map<int,int> cTotalFrequency;//类别单词个数
map<int,map<string,int> > cWordlTotalFrequency;//类别下单词个数
int totalWords=0;
for(int i=0;i<docs.size();i++){
totalWords += docs[i].size();
cWordProbability[c[i]] = cWordProbability[c[i]] + docs[i].size();
map<string,int> sn;
for(int j=0;j<docs[i].size();j++){
wordFrequency[docs[i][j]] = wordFrequency[docs[i][j]] + 1;
sn[docs[i][j]] = sn[docs[i][j]] + 1;
}
map<string,int>::iterator isn;
for(isn = sn.begin();isn!=sn.end();isn++){
cWordlTotalFrequency[c[i]][isn->first] = cWordlTotalFrequency[c[i]][isn->first] + isn->second;
}
}
int tw = wordFrequency.size();
map<int,float>::iterator icWordProbability;
for(icWordProbability=cWordProbability.begin();icWordProbability!=cWordProbability.end();icWordProbability++){
cTotalFrequency[icWordProbability->first] = icWordProbability->second;
cWordProbability[icWordProbability->first] = icWordProbability->second / totalWords;
}
cout<<"Word Frequency:"<<endl;
map<string,int>::iterator iwordFrequency;
for(iwordFrequency=wordFrequency.begin();iwordFrequency!=wordFrequency.end();iwordFrequency++){
cout<<setw(8)<<iwordFrequency->first<<"\tFrequency:"<<iwordFrequency->second<<endl;
}
cout<<"Conditional Probability:"<<endl;
map<string,int> dtw;//待分类文档词频
for(int i=0;i<d.size();i++) dtw[d[i]] = dtw[d[i]] + 1;
map<string,map<int,float> > cp;//单词类别概率
map<string,int>::iterator idtw;
for(idtw=dtw.begin();idtw!=dtw.end();idtw++){
map<int,float> cf;
for(int j=0;j<cTotalFrequency.size();j++){
float p=0;
p = (float)(cWordlTotalFrequency[j][idtw->first] +1) / (cTotalFrequency[j] + wordFrequency.size());
cf[j] = p;
cout<<"P("<<idtw->first<<"|"<<j<<") \t= "<<p<<endl;
}
cp[idtw->first] = cf;
}
cout<<"Classification Probability:"<<endl;
float mp = 0;
int classification=0;
for(int i=0;i<cTotalFrequency.size();i++){
float tcp=1;
for(int j=0;j<d.size();j++){
tcp = tcp * cp[d[j]][i];
}
tcp = tcp * cWordProbability[i];
cout<<"classification:"<<i<<"\t"<<"Probability:"<<tcp<<endl;
if(mp<tcp) {
mp = tcp;
classification = i;
}
}
cout<<"The new document classification is:"<<classification<<endl;
} int main(int argc, char** argv) {
vector<vector<string> > docs;
vector<int> c = openClassificationFile("classification.txt");
vector<char *> files;
files.push_back("1.txt");files.push_back("2.txt");files.push_back("3.txt");files.push_back("4.txt");files.push_back("5.txt");
cout<<"训练文档集:"<<endl;
docs = openFiles(files);
vector<string> d;
cout<<"待分类文档:"<<endl;
d = openFile("new.txt");
bayesian(docs,c,d);
return 0;
}
效果展示:
结论:
朴素贝叶斯分类器用于处理离散型的文本数据,可以有效对文本文档进行分类。在实验过程中,最困难的地方在于数据结构的设计。因为要统计每一个文档类别的频数和每一个文档类别下单词的概率,这个地方须要用到复杂映射与统计。在编码过程中经过不断的思考,终于通过多级映射的形式储存所需的数据,终于计算出新文档的类别。通过实验,成功将新的未分类文档输入样例分类为期待的文档类型。实验结果较为惬意。
Naive Bayesian文本分类器的更多相关文章
- 基于Bayes和KNN的newsgroup 18828文本分类器的Python实现
向@yangliuy大牛学习NLP,这篇博客是数据挖掘-基于贝叶斯算法及KNN算法的newsgroup18828文本分类器的JAVA实现(上)的Python实现.入门为主,没有太多自己的东西. 1. ...
- 算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification) 0.写在前面的话 我个人一直很喜欢算法一类的东西,在我看来算法是人类智慧的精华,其中蕴含着无与伦比 ...
- 朴素贝叶斯(Naive Bayesian)
简介 Naive Bayesian算法 也叫朴素贝叶斯算法(或者称为傻瓜式贝叶斯分类) 朴素(傻瓜):特征条件独立假设 贝叶斯:基于贝叶斯定理 这个算法确实十分朴素(傻瓜),属于监督学习,它是一个常用 ...
- 分类算法之朴素贝叶斯分类(Naive Bayesian classification)
分类算法之朴素贝叶斯分类(Naive Bayesian classification) 0.写在前面的话 我个人一直很喜欢算法一类的东西,在我看来算法是人类智慧的精华,其中蕴含着无与伦比的美感.而每次 ...
- 朴素贝叶斯分类器(Naive Bayesian Classifier)
本博客是基于对周志华教授所著的<机器学习>的"第7章 贝叶斯分类器"部分内容的学习笔记. 朴素贝叶斯分类器,顾名思义,是一种分类算法,且借助了贝叶斯定理.另外,它是一种 ...
- 后端程序员之路 18、朴素贝叶斯模型(Naive Bayesian Model,NBM)
贝叶斯推断及其互联网应用(一):定理简介 - 阮一峰的网络日志http://www.ruanyifeng.com/blog/2011/08/bayesian_inference_part_one.ht ...
- [ML学习笔记] 朴素贝叶斯算法(Naive Bayesian)
[ML学习笔记] 朴素贝叶斯算法(Naive Bayesian) 贝叶斯公式 \[P(A\mid B) = \frac{P(B\mid A)P(A)}{P(B)}\] 我们把P(A)称为"先 ...
- 一个使用fasttext训练的新闻文本分类器/模型
fastext是什么? Facebook AI Research Lab 发布的一个用于快速进行文本分类和单词表示的库.优点是很快,可以进行分钟级训练,这意味着你可以在几分钟时间内就训练好一个分类模型 ...
- 基于KNN的newsgroup 18828文本分类器的Python实现
还是同前一篇作为学习入门. 1. KNN算法描述: step1: 文本向量化表示,计算特征词的TF-IDF值 step2: 新文本到达后,根据特征词确定文本的向量 step3 : 在训练文本集中选出与 ...
随机推荐
- tar.xz结尾的文件的解压缩方法
例如: codeblocks-13.12-1_i386.debian.stable.tar 这个压缩包也是两层压缩,外面是xz压缩方式,里层是tar压缩方式. 解压缩方法: $xz -d ***.ta ...
- NetBeans无法使用编码GBK安全地打开该文件
今天用NetBeans打开包含路径里面的UTF-8编码的文件时,提示:NetBeans无法使用编码GBK安全地打开该文件. 后来在网上搜索找到了解决方案,原文地址:http://qdjinxin.it ...
- Maven项目下Tomcat插件选择方法
1. 进入Tomcat官网:http://tomcat.apache.org/ 选择Maven plugin 2. 选择版本 3. 查看版本对应的插件版本: 有两种方式添加:如下图所示:
- CRM知识点汇总(未完💩💩💩💩💩)
一:项目中每个类的作用 StarkSite 对照admin中的AdminSite,相当于一个容器,用来存放类与类之间的关系. 先实例化对象,然后执行该对象的register方法.将注册类添加到_reg ...
- C++ ---->中include <iostream>和include <iostream.h>的区别
简单来说: .h的是标准C的头文件,没有.h的是标准C++的头文件,两种都是头文件. 造成这两种形式不同的原因,是C++的发展历史决定的,刚才正好有别的人也问这个问题,这里我再回答一下(注意vs200 ...
- 刷题总结——二逼平衡树(bzoj3224线段树套splay)
题目: Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在 ...
- [USACO07NOV]牛继电器Cow Relays (最短路,DP)
题目链接 Solution 非正解 似乎比较蛇啊,先个一个部分分做法,最短路+\(DP\). 在求最短路的堆或者队列中存储元素 \(dis_{i,j}\) 代表 \(i\) 这个节点,走了 \(j\) ...
- 在vue单页面应用当中使用sass
之前在项目当中有使用过sass,但是使用的方式有点Low,是在vue文件当中的style下面通过@import的方式引入的. 其实在webpack当中也可以通过在main.js当中import &qu ...
- bzoj 4311 向量 时间线建线段树+凸包+三分
题目大意 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 分析 按时间线建线段树 大致 ...
- Bzoj2038 小Z的袜子(hose)
Time Limit: 20000MS Memory Limit: 265216KB 64bit IO Format: %lld & %llu Description 作为一个生活散漫 ...