直入正题,直接看代码:
这是一段判断是不是藏话的代码
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_vec 中对应位置的值设为 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) # 使用 NumPy 库创建了一个长度为 num_words 的一维数组 p0_num,并将数组中的所有元素初始化为 1。 p1_num = np.ones(num_words) p0_demon = 2.0 # 当某个特征在某个类别下从未出现时,使用 Laplace 平滑会将该特征的出现次数初始化为一个小的正数(通常是 1),并将分母加上特征总数乘以一个小的正数(通常是特征的种类数),从而使得概率值不会变成零。 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] p1_demon += sum(train_matrix[i]) # 样本中在类标签为1的单词出现的总次数p1_demon=7 else: p0_num += train_matrix[i] # p0_num=[1,0,1,0,1,1,1,1,1,0,0] p0_demon += sum(train_matrix[i]) # 样本中在类标签为0的单词出现总次数p0_demon=4 p1_vect = np.log(p1_num / p1_demon) # 举证p1_num和p0_num分别除以p1_demon和p0_demon即可以得到各自的条件概率 p0_vect = np.log(p0_num / p0_demon) # 使用了 NumPy 的 np.log() 函数来计算条件概率,避免数值溢出 return p0_vect, p1_vect, pAbusive # p1_vect表示正样本条件下的各单词的出现的概率,即条件概率 p(xi|y=yes) # 同理,p0_vect表示负样本条件下的各单词的出现的概率,即条件概率 p(xi|y=no) # 计算概率比较大小 # vec2classify: 待分类的特征向量 p0_vec: 类别 0 下各个特征的条件概率向量 p1_vec: 类别 1 下各个特征的条件概率向量 pClass1: 类别 1 的先验概率 def classifyNB(vec2classify, p0_vec, p1_vec, pClass1): p1 = sum(vec2classify * p1_vec) + np.log(pClass1) # 在类别 1 下的概率 p0 = sum(vec2classify * p0_vec) + np.log(1.0 - pClass1) # 在类别 0 下的概率 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)) # 使用 numpy 数组可以高效地进行元素级别的操作,例如计算两个向量的点积、元素相乘等。
代码来源