数据挖掘--朴素贝叶斯分类方法

1. 案例简介
利用朴素贝叶斯分类方法对文本数据进行情感分析,进而设计一 个留言板过滤系统.( 以下代码实现不要使用 SKLEARN 模块 )
2. 数据采集
以下表格中是一个文本分类的问题,区分一句话是粗鲁的还是文 明的,类别标签只有 Yes No ,表示是粗鲁的和不是粗鲁的语句。
数据挖掘--朴素贝叶斯分类方法_第1张图片
3. 数据预处理
给定一个 词典 【”my”,“name”,“is”,“Devin”,“you”,“are”,“stupid”, “boyfriend”, “SB” “looks” “very” “smart”,”like”,”much” 】需要将 每一段文字进行离散化,即进行空间向量化。
4. 建模与分析
p1Vecp1Vec :表示正样本条件下的各单词的出现的概率,即条件 概率 p( x i |y=yes), p1Num=[1,0,1,0,1,1,1,1,1,0,0,0,0,0]
p1Vecp1Vec :表示负样本条件下的各单词的出现的概率,即条件 概率 p( x i |y=no), p0Num=[2,1,1,1,2,0,0,0,0,1,2,1,1,1]
样本中在类标签为 1 的单词出现的总次数 p1Count=7
样本中让举证 p1Num p0Num 分别除以 p1Count p0Count , 即可以得到各自的条件概率:
P1Vec=[1/7,0,1/7,0,1/7,1/7,1/7,1/7,1/7,0,0,0,0,0]p1
P2Vec=[1/7,0,1/7,0,1/7,1/7,1/7,1/7,1/7,0,0,0,0,0]
最后计算概率并比较大小
p1=p(y=1)*{p(x1|y=1) *p(x2|y=1)...p(xn|y=1)}
p0=p(y=0) * {p(x 1 |y=0) * p(x 2 |y=0)...p(x n |y=0)}
利用朴素贝叶斯分类方法测试语句“ I like you. ”是粗鲁的和不是粗鲁?(答案不粗鲁)
5.Python代码实现
import numpy as np
#数据采集
def load_dataset():
    sent_list=[['my','name','is','Devin'],
               ['you','are','stupid'],
               ['my','boyfriend','is','SB'],
               ['you','looks','very','smart','I','like','you','very','much']]
    class_vec=[-1,1,1,-1] #-1代表不粗鲁,1代表粗鲁
    return sent_list,class_vec

#数据预处理
def create_vocab_list(dataset):
    vocab_set=set([])
    for doc in dataset:
        vocab_set=vocab_set | set(doc)
    return list(vocab_set)

def set_of_words2vec(vocab_list,input_set): #将每一段文字进行离散化,即进行空间向量化
    return_vec=[0]*len(vocab_list)
    for word in input_set:
        if word in vocab_list:
            return_vec[vocab_list.index(word)]=1
    return return_vec

#建模与分析
def trainNB(train_matrix,train_catagory):
    num_train_docs=len(train_matrix)
    num_words=len(train_matrix[0])
    pos_num=0
    for i in train_catagory:
        if i==1:
            pos_num+=1
    pAbusive=pos_num/float(num_train_docs)
    p0_num=np.ones(num_words)
    p1_num=np.ones(num_words)
    p0_demon = 2.0
    p1_demon = 2.0
    for i in range(num_train_docs):
        if train_catagory[i] == 1:
            p1_num += train_matrix[i] #p1_num=[1,0,1,0,1,1,1,1,1,0,0,0,0,0]
            p1_demon += sum(train_matrix[i])#样本中在类标签为1的单词出现的总次数p1_demon=7
        else:
            p0_num += train_matrix[i] #p0Num=[2,1,1,1,2,0,0,0,0,1,2,1,1,1]
            p0_demon += sum(train_matrix[i])#样本中在类标签为2的单词出现总次数p0_demon=3
    p1_vect = np.log(p1_num / p1_demon)#举证p1_num和p0_num分别除以p1_demon和p0_demon即可以得到各自的条件概率
    p0_vect = np.log(p0_num / p0_demon)
    return p0_vect, p1_vect, pAbusive #p1_vect表示正样本条件下的各单词的出现的概率,即条件概率 p(xi|y=yes)
    #同理,p0_vect表示负样本条件下的各单词的出现的概率,即条件概率 p(xi|y=no)

#计算概率比较大小
def classifyNB(vec2classify,p0_vec,p1_vec,pClass1):
    p1 = sum(vec2classify * p1_vec) + np.log(pClass1)
    p0 = sum(vec2classify * p0_vec) + np.log(1.0 - pClass1)
    if p1>p0:
        return 1
    elif p0>p1:
        return -1
    else:
        return 0
list_sents, list_classes = load_dataset()
my_vocab_list = create_vocab_list(list_sents)
train_mat = []
for sent_in_doc in list_sents:
	train_mat.append(set_of_words2vec(my_vocab_list, sent_in_doc))

p0V,p1V,pAb=trainNB(train_mat,list_classes)
test_entry=['I','like','you']
print("利用朴素贝叶斯测试语句“I like you”是粗鲁还是不粗鲁:")
print("1代表粗鲁,-1代表不粗鲁")
print("结果为:")
print(classifyNB(np.array(set_of_words2vec(my_vocab_list,test_entry)),p0V,p1V,pAb))

你可能感兴趣的:(Python数据挖掘,数据挖掘,分类,python)