朴素贝叶斯——对侮辱性言论分类(易上手,易懂,代码运行可用,亲测,python3)另有用handle 分词
因为里面有很详细的解释,所以就不做过多阐释:
1 from pyhanlp import * 2 import numpy as np 3 import re 4 5 '''创建数据集:单词列表postingList, 所属类别classVec''' 6 def Handle_data(content): 7 reg = "[^0-9A-Za-z\u4e00-\u9fa5]" 8 CustomDictionary.add("傻缺", "nr 300") 9 CustomDictionary.insert("语音识别", "nz 1024") 10 CustomDictionary.add("巨大成功", "nz 1024 n 1") 11 CustomDictionary.add("深度学习", "nz 1025") 12 content=re.sub(reg, '', content) 13 Get_value = HanLP.segment(content) 14 lists=[] 15 for term in Get_value: 16 lists.append(term.word) 17 return lists 18 def loadDataSet(): 19 Train = [ 20 "你个傻缺", 21 "今天天气真的很好,我要开始新的一天去学习", 22 "我太不开心了,我日", 23 "每一个太阳都很大", 24 "你真是个傻缺", 25 "你太狗了", 26 "加油,我最棒" 27 ] 28 Train_y = [ 29 1, 0, 1, 0, 1, 1, 0 30 ] 31 Train_x = [] 32 for n in Train: 33 a = Handle_data(n) 34 Train_x.append(a) 35 return Train_x, Train_y 36 37 '''获取所有单词的集合:返回不含重复元素的单词列表''' 38 def createVocabList(dataSet): 39 vocabSet = set([]) 40 41 for document in dataSet: 42 vocabSet = vocabSet | set(document) # 操作符 | 用于求两个集合的并集 43 #print(vocabSet,"PPPPPPP") 44 return list(vocabSet) 45 46 '''词集模型构建数据矩阵''' 47 def setOfWords2Vec(vocabList, inputSet): 48 # 创建一个和词汇表等长的向量,并将其元素都设置为0 49 returnVec = [0] * len(vocabList) 50 # 遍历文档中的所有单词,如果出现了词汇表中的单词,则将输出的文档向量中的对应值设为1 51 for word in inputSet: 52 if word in vocabList: 53 returnVec[vocabList.index(word)] = 1 54 else: 55 print("单词: %s 不在词汇表之中!" % word) 56 #print(returnVec) 57 return returnVec 58 '''文档词袋模型构建数据矩阵''' 59 def bagOfWords2VecMN(vocabList, inputSet): 60 returnVec = [0] * len(vocabList) 61 for word in inputSet: 62 if word in vocabList: 63 returnVec[vocabList.index(word)] += 1 64 #print(returnVec) 65 return returnVec 66 67 '''朴素贝叶斯分类器训练函数''' 68 def _trainNB0(trainMatrix, trainCategory): 69 numTrainDocs = len(trainMatrix) # 文件数 70 numWords = len(trainMatrix[0]) # 单词数 71 # 侮辱性文件的出现概率,即trainCategory中所有的1的个数, 72 # 代表的就是多少个侮辱性文件,与文件的总数相除就得到了侮辱性文件的出现概率 73 pAbusive = sum(trainCategory) / float(numTrainDocs) 74 75 # 构造单词出现次数列表 76 p0Num = np.zeros(numWords) # [0,0,0,.....] 77 p1Num = np.zeros(numWords) # [0,0,0,.....] 78 p0Denom = 0.0;p1Denom = 0.0 # 整个数据集单词出现总数 79 for i in range(numTrainDocs): 80 # 遍历所有的文件,如果是侮辱性文件,就计算此侮辱性文件中出现的侮辱性单词的个数 81 if trainCategory[i] == 1: 82 p1Num += trainMatrix[i] #[0,1,1,....]->[0,1,1,...] 83 p1Denom += sum(trainMatrix[i]) 84 else: 85 # 如果不是侮辱性文件,则计算非侮辱性文件中出现的侮辱性单词的个数 86 p0Num += trainMatrix[i] 87 p0Denom += sum(trainMatrix[i]) 88 # 类别1,即侮辱性文档的[P(F1|C1),P(F2|C1),P(F3|C1),P(F4|C1),P(F5|C1)....]列表 89 # 即 在1类别下,每个单词出现次数的占比 90 p1Vect = p1Num / p1Denom# [1,2,3,5]/90->[1/90,...] 91 # 类别0,即正常文档的[P(F1|C0),P(F2|C0),P(F3|C0),P(F4|C0),P(F5|C0)....]列表 92 # 即 在0类别下,每个单词出现次数的占比 93 p0Vect = p0Num / p0Denom 94 return p0Vect, p1Vect, pAbusive 95 '''训练数据优化版本''' 96 def trainNB0(trainMatrix, trainCategory): 97 numTrainDocs = len(trainMatrix) # 总文件数 98 numWords = len(trainMatrix[0]) # 总单词数 99 pAbusive = sum(trainCategory) / float(numTrainDocs) # 侮辱性文件的出现概率 100 # 构造单词出现次数列表,p0Num 正常的统计,p1Num 侮辱的统计 101 # 避免单词列表中的任何一个单词为0,而导致最后的乘积为0,所以将每个单词的出现次数初始化为 1 102 p0Num = np.ones(numWords)#[0,0......]->[1,1,1,1,1.....],ones初始化1的矩阵 103 p1Num = np.ones(numWords) 104 105 # 整个数据集单词出现总数,2.0根据样本实际调查结果调整分母的值(2主要是避免分母为0,当然值可以调整) 106 # p0Denom 正常的统计 107 # p1Denom 侮辱的统计 108 p0Denom = 2.0 109 p1Denom = 2.0 110 for i in range(numTrainDocs): 111 if trainCategory[i] == 1: 112 p1Num += trainMatrix[i] # 累加辱骂词的频次 113 p1Denom += sum(trainMatrix[i]) # 对每篇文章的辱骂的频次 进行统计汇总 114 else: 115 p0Num += trainMatrix[i] 116 p0Denom += sum(trainMatrix[i]) 117 # 类别1,即侮辱性文档的[log(P(F1|C1)),log(P(F2|C1)),log(P(F3|C1)),log(P(F4|C1)),log(P(F5|C1))....]列表,取对数避免下溢出或浮点舍入出错 118 p1Vect = np.log(p1Num / p1Denom) 119 # 类别0,即正常文档的[log(P(F1|C0)),log(P(F2|C0)),log(P(F3|C0)),log(P(F4|C0)),log(P(F5|C0))....]列表 120 p0Vect = np.log(p0Num / p0Denom) 121 return p0Vect, p1Vect, pAbusive 122 123 '''分类''' 124 def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1): 125 # 计算公式 log(P(F1|C))+log(P(F2|C))+....+log(P(Fn|C))+log(P(C)) 126 # 使用 NumPy 数组来计算两个向量相乘的结果,这里的相乘是指对应元素相乘,即先将两个向量中的第一个元素相乘,然后将第2个元素相乘,以此类推。这里的 vec2Classify * p1Vec 的意思就是将每个词与其对应的概率相关联起来 127 p1 = sum(vec2Classify * p1Vec) + np.log(pClass1) 128 p0 = sum(vec2Classify * p0Vec) + np.log(1.0 - pClass1) 129 if p1 > p0: 130 return 1 131 else: 132 return 0 133 134 def classifyPrint(i): 135 if(i==1): 136 return "侮辱性" 137 else: 138 return "正常" 139 140 if __name__ == '__main__': 141 #获取数据 142 Train_x, Train_y=loadDataSet() 143 #获得单词集合 144 Value=createVocabList(Train_x) 145 #获取每一句话中所有的出现频率 146 Translat_x=[] 147 for n in Train_x: 148 m=setOfWords2Vec(Value,n) 149 Translat_x.append(m) 150 151 #训练数据 152 p0Vect, p1Vect, pAbusive=trainNB0(Translat_x,Train_y) 153 print("在1类别下,每个单词出现次数的占比:\n",p1Vect) 154 print("在0类别下,每个单词出现次数的占比:\n", p0Vect) 155 print("代表的就是多少个侮辱性文件,与文件的总数相除就得到了侮辱性文件的出现概率:\n", pAbusive) 156 157 #测试 158 test="你真是个傻缺" 159 testEntry=Handle_data(test) 160 thisDoc = np.array(setOfWords2Vec(Value, testEntry)) 161 i=classifyNB(thisDoc, p0Vect, p1Vect, pAbusive) 162 163 print(testEntry, '分类结果是: ',classifyPrint(i))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
2019-03-14 第三堂课测试——数组文件
2019-03-14 第三周