如果你在管理一个网上的社区,或者你是社区中的一个成员,那么,你每天都能看到其他用户产生的很多内容。也许,你有会一个新奇的想法,想知道整个社区的人,在发布内容的时候是怎样的心情。做到这一点也许不难,可以采用最笨的办法,就是把所有的内容找出来,一条一条浏览,看大家写的内容是怎么样的。这是一件很累人的事情,也许内容太多,你花一辈子也看不完。如果有一个程序能帮你做这件事,那会大大提高效率。
今天,我给大家介绍一个算法,叫朴素贝叶斯。它可以帮你做这件事情。
进入算法之前,我们先看一些用户产生的内容。比如,比如社区里有一篇文章,文章下面有用户的一些评论。我们把用户评价的内容列出来,并且人工判断这些的情绪,给他们打上标签。为了简单起见,我们只把情绪划分为两种,0表示正面情绪,像肯定、夸奖、赞扬都属于正面情绪。1表示负面情绪,像怀疑、批评、辱骂等都属于负面情绪。
用户评论内容 | 情绪(0表示正面情绪, 1:负面情绪) |
---|---|
这篇文章有点意思。 | 0 |
蠢货!写的真烂! | 1 |
楼主写的不错啊! | 0 |
作者是个蠢货! | 1 |
不错! | 0 |
打标签的目的是让我们的程序进行学习,待它学会以后,就可以对新的用户内容做情绪判断了。
现在,我们建立一个词汇表。这个表里面包含了上面所有的词语。表里面词语的顺序我们要约定好,比如按拼音的顺序排列,当然,也可以按笔画或其它方式排列。
啊 | 不错 | 蠢货 | 个 | 楼主 | 是 | 文章 | 写的 | 意思 | 有点 | 这篇 | 真烂 | 作者 |
---|
我这里的词汇表是按拼音排序的。第一个是“啊”,这个字在第三个评论里出现过。第二个词是“不错”,也是在第三条里出现过。第三个词语是“蠢货”,它在第2条和第4条里出现过。词汇表里的每一个词都至少在一篇内容中出现过,也就是说,词汇表是所有词语的总和。
为了简单起见,我们这里不考虑分词的因素。比如,“真烂”到底应该是分成“真”和“烂”两个字还是合并在一起作为一个词呢?我们这个例子里就把它当成一个词来用。
把每一条评论(或一篇内容)变成一个向量。向量是一个类似数组的结构,它的长度与词汇表长度相同。某个位置的词语,如果它在评论里出现过,则该位置就设定为1。如果没有出现过,就设为0。
第一条 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 |
---|
比如,第一条“作者是个蠢货!” 词汇表中第一个字“啊”没有出现过,所以第一个元素是0。第二个词“不错”也没出现过,所以也是0。一直到第七个词语“文章”,才出现过,所以第七个元素是1。同样方法,第八个元素是0,第九个是1,等等。这就是一个向量。
用同样的方法把其它每一条评论变成向量,就成了下面的向量列表。
第一条 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
第二条 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
第三条 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
第四条 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
第五条 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
上面总共5条评论,有两条评论是负面情绪的评论。所以,我们可以得出结论:
负面情绪出现的概率是 = 2/5 -------结论(1)
现在,我们把负面情绪的评论都列出来。
第二条 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
第四条 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
我们可以发现负面评论中,“蠢货”出现过2次,“个”出现过1次。“是”出现过1次。“写的”出现过1次,“真烂”出现过1次,“作者”出现过1次。
词语 | 出现次数 |
---|---|
蠢货 | 2 |
个 | 1 |
是 | 1 |
写的 | 1 |
真烂 | 1 |
作者 | 1 |
这两句评论总共有7个词语,所以可以得出结论(2):在负面评论中,“蠢货”出现的概率是2/7,“个”出现的概率是1/7。“是”出现的概率是1/7。“写的”出现的概率是1/7. “真烂”出现的概率是1/7。“作者”出现的概率是1/7。
词语 | 出现的概率 |
---|---|
蠢货 | 2/7 |
个 | 1/7 |
是 | 1/7 |
写的 | 1/7 |
真烂 | 1/7 |
作者 | 1/7 |
我们知道两个独立事件同时发生的概率等于各自发生的概率的乘积。----结论(3)
结合结论(2)和结论(3),我们可以知道:
在负面评论里,“写的”和“真烂”两个词语同时出现的概率是 1/7*1/7=1/49。 ----结论(4)
这里需要说明一下,我们这时是假定每个词出现是随机的。实际上,并不完全随机。比如“写的”后面跟着“真烂”的概率,比跟着“作者”要高。因为第二种情况不是一个合理的句式。但是,为了简化模型,我们有意忽略词语之间的相关性。这样虽然会损失一些准确性,但是仍然会有不错的表现。正是有了这种简化,所以这个模型被冠以“朴素”的名义。叫朴素贝叶斯。
用同样的方法,可以得出结论:
在正面评论里,“写的”和“真烂”两个词语同时出现的概率是 = 1/9 * 0 = 0。 ----结论(5)
某句话,既是负面评论,又同时出现了“写的”和“真烂”两个字,这种情况出现的概率是
2/5 * 1/49 = 0.004
某句话,既是正面评论,又同时出现了“写的”和“真烂”两个字,这种情况出现的概率是
3/5 * 0 =0
所以,如果有人写了一个评论,为“写的真烂”,那它是负面评论的可能性(0.004)比是正面评论的可能性(0)更大,即,我们就可以判断这个评论为负面评论,即用户情绪为负面。这就是简单的情绪识别。
假设我们的程序,发现一个评论是“作者是个蠢货”,那它就会做如下分析:
1. 某句话,既是负面评论,又同时出现了"作者"、“是”、“个”、“蠢货”的概率是
2/5 * 1/7*1/7*1/7*2/7 = 0.000333
2. 某句话,既是正面评论,又同时出现了"作者"、“是”、“个”、“蠢货”的概率是
3/5 *
p1Vec = [0, 0, 2/7, 1/7, 0, 1/7, 0, 1/7, 0, 0, 0, 1/7, 1/7]
p0Vec = [1/9, 2/9, 0, 0, 1/9, 0, 1/9, 1/9, 1/9, 1/9, 1/9, 0, 0]
负面情绪时 => “作者是个蠢货”出现的概率是 2/7*1/7*1/7*1/7*1/7*1/7