#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'
#文档词袋模型 一个单词可以在文档中出现多次,更能表达某种信息
贝叶斯分类示例
最新推荐文章于 2023-12-23 16:11:52 发布