朴素贝叶斯文本分类算法源代码
来源:互联网 发布:社交网络对生活的影响 编辑:程序博客网 时间:2024/04/28 20:51
附录:朴素贝叶斯文本分类算法源代码
1、算法实现
实验的实现使用的是C#。训练数据存放在D://train文件夹中,测试数据存放在D://test文件夹中。均以“类别号 (索引号).txt”格式命名单个文档,其中类别号为1-4,分别对应于计算机、艺术、历史和体育,索引号为1-100,对应每个类别的100个文档。
1.1 定义、初始化部分:
1 HashSet<string> dict = new HashSet<string>();//对应训练样本中的所有单词统计vocabulary2 HashSet<string> ignore = new HashSet<string>() {"——", "“", ",", "。", "”", ":", "、","【", "】", "的", "了", "在", "是", "我", "有", "和", "就", "不", "人", "都", "一", "一个", "上", "也", "很", "到", "说", "要", "去", "你", "会","着", "没有", "看", "好", "自己", "这" };//标点符号和停止词3 Dictionary<int, Dictionary<string, int>> posts = newDictionary<int, Dictionary<string, int>>();//文本中没个词的出现次数4 int num_class = 4;//共考虑4类文本5 int[] num = new int[num_class];//算法中的n,某类文本中的不同单词位置总数6 double[] P1;//先验概率7 P1 = new double[num_class];8 double[,] P2;//条件概率9 P2 = new double[num_class, num_vocabulary];10 int[] err;//统计测试结果中每个类别文档误判数11 err = new int[num_class];12 for (int m = 0; m < num_class; m++)13 err[m] = 0;
1.2 训练部分
(1)获取vocabulary
14 for (int pr = 1; pr <= num_class; pr++)//循环所有训练集,获得vocabulary以及读取所有文档到post15 {16 for (int i = 1; i <= 100;i++)17 {18 string line, context ="";19 StreamReader sr = newStreamReader(@"d:\train\" + pr.ToString() + " (" + i.ToString() +").txt");20 while (!sr.EndOfStream)21 {22 line =sr.ReadLine().Trim();23 context = context +line;24 }25 string[] arr =context.Split(' ');26 num[pr-1] = num[pr-1] +arr.Length;27 28 posts[(pr-1)*100+i-1] = newDictionary<string, int>();29 for (int idx = 0; idx <arr.Length; ++idx)//循环一个文本中的所有词30 {31 arr[idx] =GetWord(arr[idx]);32 if(arr[idx].Trim().Length == 0)33 continue;34 if(ignore.Contains(arr[idx]))//是否是停止词或者标点胡浩35 continue;36 if(!dict.Contains(arr[idx]))//加入新词37 dict.Add(arr[idx]);38 if (!posts[(pr - 1) *100 + i - 1].ContainsKey(arr[idx]))//统计每个文本中每个词的出现次数39 posts[(pr - 1) * 100+ i - 1][arr[idx]] = 1;40 else41 posts[(pr - 1) * 100+ i - 1][arr[idx]]++;42 }43 }44 }45 Console.WriteLine("{0} words in dict.", dict.Count);//输出vocabulary中词的个数
(2)计算先验概率和条件概率
46 int num_vocabulary = dict.Count;47 for (int i = 0; i < num_class; i++)//先验概率P(Vj)48 P1[i] = (double)1 / (double)num_class;49 50 for (int i = 0; i < num_class; i++)//条件概率51 {52 int j = 0;53 foreach (string word in dict)54 {55 int num1 = 0;//记录某个单词在vocabulary中的位置56 for (int k = 100 * i; k <100 * i + 100; k++)57 {58 Dictionary<string,int> post = posts[k];59 if(post.ContainsKey(word))60 num1 += post[word];61 }62 P2[i, j] = (double)(num1 +1) / (double)(num[i] + num_vocabulary);63 j++;64 }65 }
1.3 分类部分
66 for (int pr = 1; pr <= num_class; pr++)//循环测试集中每个文档67 {68 for (int i = 1; i <= 100;i++)69 {70 double[] P3;//对于某文本属于4个类别的概率71 P3 = new double[num_class];72 for (int k = 0; k <num_class; k++)73 P3[k] = P1[k];74 75 string cs_line, cs_context ="";76 StreamReader cs_sr = newStreamReader(@"d:\test\" + pr.ToString() + " (" + i.ToString() +").txt");77 while (!cs_sr.EndOfStream)78 {79 cs_line =cs_sr.ReadLine().Trim();80 cs_context = cs_context+ cs_line;81 }82 string[] cs_arr =cs_context.Split(' ');83 84 for (int idx = 0; idx <cs_arr.Length; ++idx)//计算4个概率85 {86 cs_arr[idx] =GetWord(cs_arr[idx]);87 if(cs_arr[idx].Trim().Length == 0)88 continue;89 if(ignore.Contains(cs_arr[idx]))90 continue;91 92 int num2 = 0;//作用同num193 if(dict.Contains(cs_arr[idx]))94 {95 foreach (string wordin dict)96 {97 if(cs_arr[idx].Equals(word))98 break;99 num2++;100 }101 for (int k = 0; k< num_class; k++)102 P3[k] = P3[k] *P2[k, num2];103 104 while (P3[0] <0.0001 && P3[1] < 0.0001 && P3[2] < 0.0001 &&P3[3] < 0.0001)//由于数据太小,之后大小无法比较,故对其同时放大105 for (int k = 0;k < num_class; k++)106 P3[k] *=1000;107 }108 }109 110 int result = 0;111 result = Max(P3);112 if (result != pr)113 err[pr - 1]++;114 if (1 <= i && i<= 9)115 Console.Write(pr.ToString() +" (0" + i.ToString() + ").txt: " + "类别" + result.ToString() +" ");116 else117 Console.Write(pr.ToString() +" (" + i.ToString() + ").txt: " + "类别" + result.ToString() +" ");118 }119 Console.Write("\n");120 }
0 0
- 朴素贝叶斯文本分类算法源代码
- 朴素贝叶斯文本分类算法
- 朴素贝叶斯文本分类算法
- 朴素贝叶斯文本分类算法
- 朴素贝叶斯文本分类算法java实现
- 朴素贝叶斯文本分类算法java实现(二)
- 朴素贝叶斯文本分类算法学习
- 朴素贝叶斯文本分类
- 朴素贝叶斯文本分类过程
- 朴素贝叶斯文本分类
- 朴素贝叶斯文本分类
- Mahout朴素贝叶斯文本分类
- 朴素贝叶斯文本分类
- 朴素贝叶斯文本分类应用
- 朴素贝叶斯文本分类
- 手写朴素贝叶斯文本分类
- 朴素贝叶斯文本分类java实现
- 利用Python实现朴素贝叶斯文本分类
- 串口控件MSCOMM的注册方法(使用MSCOMM串口控件程序的发布问题)
- 滚动条ScrollView、HorizontalScrollView
- 图文按钮、图文TextView
- android中network的连接不能在直接在主线程运行
- MSComm的串口通信程序,在没有安装Vc的机器上没有办法运行 MSComm控件注册
- 朴素贝叶斯文本分类算法源代码
- Android Socket多线程
- Android// 全屏显示 //获取屏的尺寸
- android bitmap的放大缩小
- Android图片素描
- android 通过按钮控制水平滚动条
- 子线程中使用Toast或者更新UI
- Windows Phone 8 理解编译和部署
- android中scrollTo和scrollBy的理解~~