2019独角兽企业重金招聘Python工程师标准>>>

贝叶斯定理:

对于随机事件A和B:A发生的概率为P(A),B发生的概率为P(B),在B发生的情况下,A发生的概率为P(A|B)。A和B一起发生的联合概率为P(AB)。有:P(A|B) X P(B) = P(AB) = P(B|A) X P(A),则有:

P(A|B) = P(B|A)P(A) / P(B)

文本分类(Text Categorization)是指计算机将一片文档归于预先给定的某一类或几类的过程。文本分类的特征提取过程是分词。目前比较好的中文分词器有中科院的ictclas,庖丁,IK等等。经过分词后,每个词就是一个特征。分词中可以自己配置停用词库,扩展词库等。特征选择有诸如TF-IDF,CHI等特征选择算法,就不在此赘述。

朴素贝叶斯计算先验概率P(C)和条件概率P(X|C)的方法有两种:多项式模型伯努利模型。两者在计算的时候有两点差别:多项式会统计词频,而伯努利认为单词出现就记为1,没出现记为0,可以看到一个是基于词频,一个是基于文档频率;伯努利在分类时,将词库中的没有出现在待分类文本的词作为反方考虑

在计算条件概率时,当待分类文本中的某个词没有出现在词库中时,概率为0,会导致很严重的问题,需要考虑拉普拉斯平滑(laplace smoothing):它是将所有词出现的次数+1,再进行统计。

再一个问题就是概率太小而词数太多,会超double,用log将乘法转成加法

伯努利朴素贝叶斯算法伪代码如下:

伯努利朴素贝叶斯代码:

Java代码  

  1. /**

  2. * @author zhongmin.yzm

  3. * 语料训练并载入内存

  4. * */

  5. public class TrainingDataManager {

  6. /** 特征索引 */

  7. private Map<String, Integer> termIndex;

  8. /** 类索引 */

  9. private Map<String, Integer> classIndex;

  10. /** 索引-类名 */

  11. public List<String>          className;

  12. /**类的个数*/

  13. private int                  numClasses = 0;

  14. /**训练样本的所有特征(出现多次只算一个)*/

  15. private int                  vocabulary = 0;

  16. /**训练文本总数*/

  17. private int                  DocsNum    = 0;

  18. /**属于某类的文档个数*/

  19. private int[]                classDocs;

  20. /**类别c中包含属性 x的训练文本数量*/

  21. private int[][]              classKeyMap;

  22. /** 标志位: 分类时的优化 */

  23. private static boolean       flag[];

  24. private void buildIndex(List<List<String>> contents, List<String> labels) {

  25. classIndex = new HashMap<String, Integer>();

  26. termIndex = new HashMap<String, Integer>();

  27. className = new ArrayList<String>();

  28. Integer idTerm = new Integer(-1);

  29. Integer idClass = new Integer(-1);

  30. DocsNum = labels.size();

  31. for (int i = 0; i < DocsNum; ++i) {

  32. List<String> content = contents.get(i);

  33. String label = labels.get(i);

  34. if (!classIndex.containsKey(label)) {

  35. idClass++;

  36. classIndex.put(label, idClass);

  37. className.add(label);

  38. }

  39. for (String term : content) {

  40. if (!termIndex.containsKey(term)) {

  41. idTerm++;

  42. termIndex.put(term, idTerm);

  43. }

  44. }

  45. }

  46. vocabulary = termIndex.size();

  47. numClasses = classIndex.size();

  48. }

  49. public void startTraining(List<List<String>> contents, List<String> labels) {

  50. buildIndex(contents, labels);

  51. //去重

  52. List<List<Integer>> contentsIndex = new ArrayList<List<Integer>>();

  53. for (int i = 0; i < DocsNum; ++i) {

  54. List<Integer> contentIndex = new ArrayList<Integer>();

  55. List<String> content = contents.get(i);

  56. for (String str : content) {

  57. Integer wordIndex = termIndex.get(str);

  58. contentIndex.add(wordIndex);

  59. }

  60. Collections.sort(contentIndex);

  61. int num = contentIndex.size();

  62. List<Integer> tmp = new ArrayList<Integer>();

  63. for (int j = 0; j < num; ++j) {

  64. if (j == 0 || contentIndex.get(j - 1) != contentIndex.get(j)) {

  65. tmp.add(contentIndex.get(j));

  66. }

  67. }

  68. contentsIndex.add(tmp);

  69. }

  70. //

  71. classDocs = new int[numClasses];

  72. classKeyMap = new int[numClasses][vocabulary];

  73. flag = new boolean[vocabulary];

  74. for (int i = 0; i < DocsNum; ++i) {

  75. List<Integer> content = contentsIndex.get(i);

  76. String label = labels.get(i);

  77. Integer labelIndex = classIndex.get(label);

  78. classDocs[labelIndex]++;

  79. for (Integer wordIndex : content) {

  80. classKeyMap[labelIndex][wordIndex]++;

  81. }

  82. }

  83. }

  84. /** 分类 时间复杂度 O(c*v) */

  85. public String classify(List<String> text) {

  86. double maxPro = Double.NEGATIVE_INFINITY;

  87. int resultIndex = 0;

  88. //标记待分类文本中哪些特征 属于 特征表

  89. for (int i = 0; i < vocabulary; ++i)

  90. flag[i] = false;

  91. for (String term : text) {

  92. Integer wordIndex = termIndex.get(term);

  93. if (wordIndex != null)

  94. flag[wordIndex] = true;

  95. }

  96. //对特征集中的每个特征: 若出现在待分类文本中,直接计算;否则作为反方参与

  97. for (int classIndex = 0; classIndex < numClasses; ++classIndex) {

  98. double pro = Math.log10(getPreProbability(classIndex));

  99. for (int wordIndex = 0; wordIndex < vocabulary; ++wordIndex) {

  100. if (flag[wordIndex])

  101. pro += Math.log10(getClassConditionalProbability(classIndex, wordIndex));

  102. else

  103. pro += Math.log10(1 - getClassConditionalProbability(classIndex, wordIndex));

  104. }

  105. if (maxPro < pro) {

  106. maxPro = pro;

  107. resultIndex = classIndex;

  108. }

  109. }

  110. return className.get(resultIndex);

  111. }

  112. /** 先验概率: 类C包含的文档数/总文档数 */

  113. private double getPreProbability(int classIndex) {

  114. double ret = 0.0;

  115. ret = 1.0 * classDocs[classIndex] / DocsNum;

  116. return ret;

  117. }

  118. /** 条件概率: 类C中包含关键字t的文档个数/类C包含的文档数 */

  119. private double getClassConditionalProbability(int classIndex, int termIndex) {

  120. int NCX = classKeyMap[classIndex][termIndex];

  121. int N = classDocs[classIndex];

  122. double ret = (NCX + 1.0) / (N + DocsNum);

  123. return ret;

  124. }

  125. }

转载于:https://my.oschina.net/u/2510243/blog/644403

朴素贝叶斯在文本分类中的应用之 伯努利相关推荐

  1. 七、朴素贝叶斯中文文本分类

    1.朴素贝叶斯中文文本分类 中文分词 停用词 朴素贝叶斯中文分类举例:新闻文档分类 朴素贝叶斯中文分类的具体过程:加载停用词.中文分词.文本向量化.模型训练和保存.模型的加载和预测. 2 中文分词 2 ...

  2. 朴素贝叶斯网络matlab实现_基于朴素贝叶斯的文本分类方法实战

    基于朴素贝叶斯的文本分类方法 一.朴素贝叶斯原理的介绍 二.朴素贝叶斯分类器的代码实现 分类器有时会产生错误结果,这时可以要求分类器给出一个最优的类别猜测结果,同时会给出这个猜测的概率估计值.朴素贝叶 ...

  3. 基于朴素贝叶斯实现文本分类

    基于朴素贝叶斯实现文本分类 数据集介绍 数据集为网上公开的新闻数据,其中数据集包含10个类别. 模型选择 贝叶斯分类 贝叶斯公式 朴素贝叶斯 拉普拉斯平滑引入 某个属性的条件概率为0,则会导致整体概率 ...

  4. python朴素贝叶斯的文本分类_自给自足,完全手写一个朴素贝叶斯分类器,完成文本分类...

    Part 1: 本文解决的问题: 我在有这样的一个数据集,里面存放了人们对近期播放电影的评价,当然评价也就分成两部分,好评和差评.我们想利用这些数据训练一个模型,然后可以自动的对影评做出判断,到底是好 ...

  5. 基于朴素贝叶斯的文本分类算法

    基于朴素贝叶斯的文本分类算法 摘要:常用的文本分类方法有支持向量机.K-近邻算法和朴素贝叶斯.其中朴素贝叶斯具有容易实现,运行速度快的特点,被广泛使用.本文详细介绍了朴素贝叶斯的基本原理,讨论多项式模 ...

  6. 朴素贝叶斯文本分类java_基于朴素贝叶斯的文本分类算法

    基于朴素贝叶斯的文本分类算法 摘要:常用的文本分类方法有支持向量机.K-近邻算法和朴素贝叶斯.其中朴素贝叶斯具有容易实现,运行速度快的特点,被广泛使用.本文详细介绍了朴素贝叶斯的基本原理,讨论多项式模 ...

  7. 朴素贝叶斯基于朴素贝叶斯的文本分类算法

    朴素贝叶斯 以及 基于朴素贝叶斯的文本分类算法 参考文章: https://www.cnblogs.com/jorbin/articles/1915888.html

  8. NLP系列(3)_用朴素贝叶斯进行文本分类(下)

    作者: 龙心尘 && 寒小阳 时间:2016年2月. 出处:http://blog.csdn.net/longxinchen_ml/article/details/50629110 h ...

  9. 朴素贝叶斯算法——文本分类(离散型)

    朴素贝叶斯算法:按照概率分类的算法. 我们在豆瓣上经常能看到一些书籍和电影评价,有好的评价,也有差评. 关于影评好坏的结果是怎么来的呢?后台小姐姐一条条的看,然后进行分类吗?利用我们的朴素贝叶斯算法, ...

  10. (三)朴素贝叶斯运用——文本分类

    1.贝叶斯理论 当我们有样本(包含特征和类别)的时候,我们非常容易通过 p(x)p(y|x)=p(y)p(x|y) p ( x ) p ( y | x ) = p ( y ) p ( x | y ) ...

最新文章

  1. 第九周项目一-深复制体验(1)
  2. python使用缩进来体现代码之间的逻辑关系-Python 使用缩进来体现代码之间的逻辑关系 ....
  3. python3 如何读中文路径_Python 3.8.2安装教程
  4. 软考计算之运筹学-决策分析问题
  5. Xcode 新项目删除 storyboard 文件
  6. yii2 关掉php notice,yii2关闭错误提示
  7. 自然语言处理中的Attention Model:是什么以及为什么[一]
  8. Arrays.sort()用来自定义排序的使用
  9. 基于Java学院网页的搜索引擎设计和实现
  10. 凝聚共识 聚力前行丨《数据库系统的分类和评测研究》报告发布
  11. java day47【redis概念 、下载安装 、 命令操作 、持久化操作 、使用Java客户端操作redis】...
  12. mac os 10.10 safari java插件_OS X 10.10 Yosemite强大而漂亮的Safari 8浏览器
  13. oracle 日期函数trunc,oracle 日期函数 TRUNC
  14. 2021厦门LED照明产业展览会
  15. Go (Golang) 语言-快速开始
  16. 需求分析——需求分析的步骤
  17. 低代码:正在改变软件的开发方式
  18. 生地中考总结(也许是对人生的感慨)
  19. Linux下软连接的概念
  20. Android开发之百度地图定位打卡

热门文章

  1. Computing the cost J(θ)----吴恩达机器学习作业
  2. php小插件,PHPStrom中一些我收藏的小插件
  3. 频谱感知1:未知确定信号的能量检测
  4. 推荐系统实践--基于用户的协同过滤算法
  5. 数据库基础(4)函数依赖公理和推论(Armstrong公理),属性闭包和求候选键的技巧
  6. 文件服务器 测试,python-文件服务器测试
  7. 计算机网络技术提纲,计算机网络技术复习提纲
  8. c++输入回车结束循环,C++ cin如何输入回车停止
  9. 注解 @EnableFeignClients 与 @ComponentScan 有冲突
  10. redis实现高并发下的抢购/秒杀功能