标签:
这篇文章做了什么
朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等。而情感分析(Sentiment Analysis)是自然语言处理(Natural Language Progressing)中的重要问题,用以对文本进行正负面的判断,以及情感度评分和意见挖掘。本文借助朴素贝叶斯算法,针对文本正负面进行判别,并且利用C#进行编程实现。
不先介绍点基础?
朴素贝叶斯,真的很朴素
朴素贝叶斯分类算法,是一种有监督学习算法,通过对训练集的学习,基于先验概率与贝叶斯公式,计算出特定条件下样本属于某一类别的概率(条件概率),从而达到分类的目的。为什么说朴素贝叶斯朴素,其实这儿的朴素是英文翻译过来的,朴素贝叶斯叫Naive Bayesian Classification,这里的"Naive"被译为了朴素,其实翻译为天真更贴切一点,因为它假设了所有的样本都是独立的,这确实"Too Naive"。因此我们就有了半朴素贝叶斯和贝叶斯网络,这些将在后面为大家呈现。
情感分析是啥
自然语言处理(NLP)是人工智能之中非常重要的学科,与机器学习交叉甚广。而情感分析优势NLP中最为重要的内容之一,目前主要分为两大流派,一派是语言学派(推荐《自然语言处理综论》),他们从语法、句子结构、词性等角度出发,通过解析一个句子的结构来分析情感正负面或是中性;另一派是统计学派(推荐《统计自然语言处理》),通过高质量的语料库与训练集,借助统计理论与算法,完成句子的情感分析。
朴素贝叶斯如何实现情感分析
1.前期准备:
2.针对文本实现:
-
分词,推荐使用Jieba分词引擎,无论是python, C#, 还是R语言上都有非常优秀的第三方库,而且可以导入词库
-
获取正负面词,此时需要用到正负面词库,即通过正负面词库的匹配,筛选出文本中能够反映情感的词。
-
进入训练集中匹配,获取每个正面或者负面的词在两个训练集的词频,如“好吃”这个词在正面训练集里出现频率为0.1%,而在负面训练集里频率为0.001%。
-
通过贝叶斯公式计算出在文本出现“好吃”这个词的条件下位正面或者为负面的概率,例如:
p(正面|"好吃")=p(正面)p("好吃"|正面)p(正面)p("好吃"|正面)+p(负面)p("好吃"|负面)p(正面|"好吃")=p(正面)p("好吃"|正面)p(正面)p("好吃"|正面)+p(负面)p("好吃"|负面)
得到的概率即是在好吃这个词出现的条件下,该句子为正面的概率。
- 然而一句话可能有多个表示情感的词,比如"不好看"、"开心",我们最终要求得在这些词出现的条件下该文本为正面的条件概率:p(正面|"好吃","不好看","开心")$,具体计算过程见如下推导,令上述三个词分别为a,b,c,正面为pos,负面为neg,具体计算过程见如下推导,令上述三个词分别为a,b,c,正面为pos,负面为neg:
p(pos|a,b,c)==p(pos)p(a,b,c|pos)p(pos)p(a,b,c|pos)+p(neg)p(a,b,c|neg)p(pos)p(a|pos)p(b|pos)p(c|pos)p(pos)p(a|pos)p(b|pos)p(c|pos)+p(neg)p(a|neg)p(b|neg)p(c|neg)(1)(2)(1)p(pos|a,b,c)=p(pos)p(a,b,c|pos)p(pos)p(a,b,c|pos)+p(neg)p(a,b,c|neg)(2)=p(pos)p(a|pos)p(b|pos)p(c|pos)p(pos)p(a|pos)p(b|pos)p(c|pos)+p(neg)p(a|neg)p(b|neg)p(c|neg)
假设一句话为正面或是负面的先验概率均为0.5,则p(pos)=p(neg)=0.5p(pos)=p(neg)=0.5,那么(2)式等于:
=p(a|pos)p(b|pos)p(c|pos)p(a|pos)p(b|pos)p(c|pos)+p(a|neg)p(b|neg)p(c|neg)(3)(3)=p(a|pos)p(b|pos)p(c|pos)p(a|pos)p(b|pos)p(c|pos)+p(a|neg)p(b|neg)p(c|neg)
-
拉普拉斯平滑:为了避免某个词在训练集中出现概率为0导致结果有偏,拉普拉斯平滑法讲所有词出现次数加一,在样本量很大时,每个分量加一几乎不会对最终估计结果造成太大影响,但这样的好处是很好的解决了词频为0导致的有偏问题。
-
其他变式
贝叶斯推断及其互联网应用(二):过滤垃圾邮件 这篇文章中做了如下变形,将结果以单个词下正面或是负面的条件概率表示,但是文章并未提及拉普拉斯校准,而是用拍脑袋想出来的1%作为校准概率。由于:
p(a|pos)====p(a|pos)p(a)p(a)p(a|pos)p(a)p(a|pos)p(pos)+p(a|neg)p(neg) (全概率公式)p(a|pos)p(pos)p(a|pos)p(pos)+p(a|neg)p(neg)p(a)/p(pos)p(pos|a)p(a)p(pos)(4)(5)(6)(7)(4)p(a|pos)=p(a|pos)p(a)p(a)(5)=p(a|pos)p(a)p(a|pos)p(pos)+p(a|neg)p(neg) (全概率公式)(6)=p(a|pos)p(pos)p(a|pos)p(pos)+p(a|neg)p(neg)p(a)/p(pos)(7)=p(pos|a)p(a)p(pos)
所以有(3)式等于:
(3)式===p(pos|a)p(pos|b)p(pos|c)p(a)p(b)p(c)p(pos)3p(pos|a)p(pos|b)p(pos|c)p(a)p(b)p(c)p(pos)3+p(neg|a)p(neg|b)p(neg|c)p(a)p(b)p(c)p(neg)3p(pos|a)p(pos|b)p(pos|c)p(pos|a)p(pos|b)p