朴素贝叶斯分类器(没什么价值,作为路标留给自己看)

/****************************
//朴素贝叶斯算法实现文档分类。
//高级人工智能第二次作业。
//P.S. 炼狱般的升华啊,
//平均十行程序,
//才能有一行留到最后。
//          CodeAnt Koo,2010-4-22
****************************/


/*编程日志:
21:33 2010-4-09 统计Example信息。
17:05 2010-4-10 记录概率项。
08:16 2010-4-12 计算概率项。
10:40 2010-4-12 编写Learn_Naive_Bayes_Text函数。
10:47 2010-4-13 编写Max函数返回数组最大值。
10:49 2010-4-13 编写Classify_Naive_Bayes_Text函数,返回文档目标值。
16:46 2010-4-13 调试程序。编译报错。
21:06 2010-4-13 修改Length函数。
21:24 2010-4-13 放弃Length函数。
08:25 2010-4-14 修改Max函数。
09:02 2010-4-14 Length函数编译通过,结果错误,还是放弃。
09:52 2010-4-14 修改Classify_Naive_Bayes_Text函数。不能返回数组。
10:24 2010-4-14 函数内数组赋值报错。
10:34 2010-4-14 函数形参……OMG。
10:46 2010-4-14 公式演算,参数类型不匹配。
10:59 2010-4-14 修改Classify_Naive_Bayes_Text函数。编译通过。
18:27 2010-4-14 分离VocaCount函数。编译通过。
21:30 2010-4-14 分离RecN函数。编译通过。
21:30 2010-4-14 在main函数中调用,报错redefinition; different basic types。
21:34 2010-4-14 在main函数中调用,编译通过。
09:24 2010-4-15 修改数值型数组结束标志。
09:27 2010-4-15 分离CompuN函数。编译通过。
09:53 2010-4-15 第一次写完。编译查错。
16:01 2010-4-15 计算公式处报错。拆成两步计算。
16:25 2010-4-15 函数重定义?
16:46 2010-4-15 先定义后调用……子啊带我走吧~
16:51 2010-4-15 第一次全程序编译通过。调试崩溃。
10:56 2010-4-17 调试Judge函数。程序崩溃~莫名其妙~道可道非常道~
08:51 2010-4-18 再次调试,再次崩溃。原本可以的程序都崩溃了。
15:59 2010-4-22 修改Max函数。
16:15 2010-4-22 修正Judge函数。
19:25 2010-4-22 重写getVoca函数。崩溃。放弃。
21:23 2010-4-22 重写getWord函数。
21:52 2010-4-22 重新调试,通过。
15:37 2010-4-24 修正求和函数。
19:28 2010-4-24 测试程序。
21:44 2010-4-25 重写注释。
14:23 2010-4-26 添加训练功能。
*/


#include <stdio.h>
#include <string.h>


/***************输出数组最大值********************/
float MaxValue(float *a)
{
 float temp;   //暂存最大值
 int i=0;   //循环变量
 
 //temp始终指向当前最大值
 for (i=0;i<sizeof(*a);i++) 
 {
  if(temp<(*(a+i)))
  {
   temp=(*(a+i));
  }
 }
 return temp;
}


/********************统计文档单词******************/
void getVoca(char *Example,int *numVoca,char *Voca)
{
 int i;    //循环变量
 int j;    //循环变量
 
 
 for(i=0;i<30;i++)
 {
  for(j=0;j<30;j++) 
  {
   //若该单词已存在于文档子集,则对应计数自加1
   if(*(Voca+j)==*(Example+i))
   {
    *(numVoca+j) = (*(numVoca+j)+1);
    break;
    
   }
   
   //若循环结束仍未在文档子集中找到该单词,
   //则说明该单词是第一次出现;
   //将该单词插入文档子集结束处,
   //对应计数设为1,
   //并扩展文档集长度。
   else
   {
    *(Voca+j+1)=*(Example);
    *(numVoca+j+1)=1;
    break;
   }
   
  }
  //*(Voca+j+2)='*'; //数组结束标记
 }
}

/******************统计"敏感词汇"*******************/
void getWord(char *Example, char *Vfinance,int *numfinance)
{
 int i;    //循环变量
 int j;    //循环变量
 
 for(j=0;*(Vfinance+j)!='/0';j++)
 {
  for(i=0;*(Example+i)!='/0';i++)
  {
   //若该单词是目标值,则对应计数自加1
   if(*(Example+i)==*(Vfinance+j))
   {
    *(numfinance+j)=(*(numfinance+j)+1);
   }
  }
 }
}

/********************文档分类*********************/
void Judge(float max,char *Class)
{
 //输出概率值
 printf("The probability of this article to be %s is :%f/n",Class,max);
 //根据阈值判断分类
 if (max>0.01)
 {
  printf("The document's classify is %s./n",Class);
 }
 else
 {
  printf("The document's classify is not %s./n",Class);
 }
}

/*****************数组求和********************/
int Analyze(int *numfinance,int *wFinance)
{
 int i;       //循环变量
 int sumfinance=0;    //暂存当前总和
 
 for(i=0;i<30;i++)
 {
  sumfinance = sumfinance+numfinance[i]*wFinance[i];
 }
 
 return sumfinance;
}

/*******************求概率**********************/
float pWord(int sumWord)
{
 float PWord;
 
 PWord=(float)sumWord/30;
 
 return PWord; 
}


/*****************使用分类功能*****************/
void useClass(char *Example, char *classfinance,char *classmail,int *wFinance,int *wMail,char *Vfinance,char *Vmail,int *numfinance,int *nummail,int sumfinance,int summail,float pfinance,float pmail)
{
  //提示输入待分类文档,保存
  printf("Please input the article you want to classify.No more than 30 letters./n");
  scanf("%s",Example);
  
  //输出已获得的文本信息,及使用的目标值
  printf("*********************/n");
  printf("Information:/n");
  printf("Example is:%s/n",Example);
  printf("Vfinance was:%s/n",Vfinance);
  printf("Vmail was:%s/n",Vmail);
  printf("*********************/n");
  printf("Result:/n");
  
  //获得文档子集及计数
  getWord(Example, Vfinance,numfinance);
  getWord(Example, Vmail,nummail);
  
  //求和,获取对应目标数组总计数
  sumfinance=Analyze(numfinance,wFinance);
  summail=Analyze(nummail,wMail);
  
  //求相应概率
  pfinance=pWord(sumfinance);
  pmail=pWord(summail);
  
  //判断分类
  Judge(pfinance,classfinance);
  Judge(pmail,classmail);
}
/*******************主程序*********************/
main()

 char Example[30];     //储存待分类的文本
 
 
 char classfinance[]={"Finance"};  //分类名:Finance
 char classmail[]={"Mail"};   //分类名:Mail
 
 int  wFinance[30]={1,1};    //设置训练集元素权重,默认为1
 int  wMail[30]={1};     //设置训练集元素权重,默认为1
 
 char Vfinance[30]={"$%"};   //Finance类的目标值
 char Vmail[30]={"@"};    //Mail类的目标值
 
 int  numfinance[30]={0};    //Finance类目标值对应的计数值
 int  nummail[30]={0};    //Mail类目标值对应的计数值
 
 int  sumfinance=0;     //Finance类所有目标值的计数值综合
 int  summail;      //Mail类所有目标值的计数值综合
 
 float pfinance={0.0};     //设定属于Finance类的概率初值
 float pmail={0.0};     //设定属于Mail类的概率初值
 

 //提示用户选择程序功能:分类/训练
 printf("Train first(Type 'T') or classify derectly?(type any letter)");  
 if(getchar()=='T')      //训练
 {
  //提示输入训练文档,保存
  printf("Please input the article you want to classify.No more than 30 letters./n");
  scanf("%s",Example);

  //提示输入文档类型
  printf("Please input the class of the article. Finance or Mail.(F/M)/n");
  
  //根据文档类型修改训练集
  if(getchar()=='F')
  {
   //修改训练集
   getVoca(Example,wFinance,Vfinance);
   
  }
  else if(getchar()=='M')
  {
   //修改训练集
   getVoca(Example,wMail,Vmail);
   
  }
 }
 
 //分类
 useClass(Example,classfinance,classmail,wFinance,wMail,Vfinance,Vmail,numfinance,nummail,sumfinance,summail,pfinance,pmail);
  
  
 //程序结束
 printf("*********************/n");
 printf("--------THE END---------/n/n/n/n");
 printf("Press any key to exit./n");
 
 //保持输出界面
 system("pause");
 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值