贝叶斯分类示例

#coding=utf-8

'''
贝叶斯决策理论

核心思想:选择高概率对应的类别

引入先验概率和逻辑推理来处理不确定的命题

使用条件概率来进行分类

示例使用贝叶斯分类来屏蔽侮辱性言论

构建分类:0:非侮辱性 1:侮辱性

从文本构建词向量
    1.将文本分解成token向量
    2.计算所有文档中出现的词的集合,这个集合包含了所有的词汇
    3.构建一个长度为词汇集合大小的全0向量,如果token出现过,为在相应位置标记为1

举个例子
    两个文档分别是:
        doc1: ['dog','cat','horse']
        doc2: ['pig','fox','bird']
    则构建词向量的过程:
        doc1,doc2构成信息集合: voc = ['dog','cat','horse','pig','fox','bird']
    doc1和doc2的词向量长度都为 len(voc),把相应元素用voc的下标替换
    dog:0  cat:1  horse:2 所以doc1,0,1,2下标的元素为1,其他位置的元素之都为0,doc2同理
    得到:
        doc1: [1,1,1,0,0,0]
        doc2: [0,0,0,1,1,1]
    顺便说一下这种词向量的表示方式丢失了语义信息


本文需要技术
    1.条件概率公式
    2.计算每个类别概率
    3.计算每个单词的概率
    4.计算每个文档概率对数
    5.比较大小
'''

import  numpy as np
A=np.mat([
    ['me','today','nice','enen','nice','go','school','learning'],
    ['today','weather','is','bad','cao','cao','cao','hehe'],
    ['i','want','to','see','sex','girl','cao','sex'],
    ['today', 'is', 'very', 'good', 'to', 'study', 'python', 'good'],
    ['tommorrow','i','will','go','to','dance','after','stduy'],
    ['i','want','to','see','sex','girl','cao','cao']
])

#类别向量
classVec=[0,1,1,0,0,1]

#构建词汇集合
def creaeVocList(dataSet):
    dataSet = dataSet.getA()
    vocablist=set([])
    for doucment in dataSet:
        vocablist = vocablist | set(doucment)
    return list(vocablist)

#构建词向量
def word2Vec(dataSet):
    vocList = creaeVocList(dataSet)
    dataSet = dataSet.getA()
    result = [];
    for i in range(dataSet.shape[0]):
        vec = [0]*len(vocList)
        for word in dataSet[i,:]:
            if word in vocList:
                vec[vocList.index(word)]+=1
        result.append(vec)
    return np.mat(result)

def word2Vec2(input,dataSet):
    vocList = creaeVocList(dataSet)
    vec = [0] * len(vocList)
    for word in input:
        if word in vocList:
            vec[vocList.index(word)] += 1
    return vec


'''
#打印词汇表和词向量
print creaeVocList(A)
print word2Vec(A)
'''

#计算每个类别的条件概率 P(ci) 以及在该类别下每个词的概率P(Wi|ci)
'''
每个类别的概率:该类别数/总类别数
P(Wi|ci): 该分类下某个单词出现的个数/该分类下总词语数

'''

def train(dataSet,category):
    #总类别
    numCategorys = len(category)
    #侮辱性文档的先验概率
    p  = sum(category)/float(numCategorys)
    pA = np.log(p)
    pB = np.log(1-p)

    #计算词的概率
    vec_len = len(np.array(dataSet[0,:])[0,:])
    p1 = np.ones(vec_len)
    p0=np.ones(vec_len)
    p1Numwords = 2;
    p0Numwords = 2;
    for i in range(dataSet.shape[0]):
        tmp = np.array(dataSet[i,:])[0,:]
        if category[i]==1:
            p1 += tmp
            p1Numwords += sum(tmp)
        else:
            p0 += tmp
            p0Numwords +=sum(tmp)

    #侮辱性文档中每个单词的概率
    p1_vec = np.log(p1/p1Numwords)
    p0_vec = np.log(p0/p0Numwords)
    return p1_vec,p0_vec,pA,pB


wordVec=word2Vec(A)
#p1_vec 类别为1个单词出现频率 ,p0_vec类别为0下各单词出现的评论,pA类别为1出现的概率
p1_vec,p0_vec,pA,pB=  train(wordVec,classVec)

#结合现实需要优化的点
'''
优化背景:
    1.计算某个文档为侮辱性类别的概率
        p(W1|1)*P(W2|1)*...P(Wn|1) 因为每个概率都都是0-1范围的,所以最终文档的概率可能都是为0
        1.对乘积取对数

    2.某些没有出现的词的概率为0,导致结果为0
        1.开始设置默认每个词出现的次数为1
'''

#给定一段文本判断分类
'''
 B=['cao','good']
 word->vec  B=[1,1,0,0,0...]
 P=(0.181)*(0.181)*(0.045)*(0.045)..

'''

T1=['cao','sex','hehe','nice','go']
T2=['wo','me','today','school','nice']

p_class_1 = sum(word2Vec2(T2,A)*p1_vec)+pA
p_class_2 = sum(word2Vec2(T2,A)*p0_vec)+pB

if p_class_1 > p_class_2:
    print 'class1'
else:
    print 'class2'

#文档词袋模型 一个单词可以在文档中出现多次,更能表达某种信息


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值