zoukankan      html  css  js  c++  java
  • 朴素贝叶斯——对侮辱性言论分类(易上手,易懂,代码运行可用,亲测,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-zu4e00-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类别下,每个单词出现次数的占比:
    ",p1Vect)
    154     print("在0类别下,每个单词出现次数的占比:
    ", p0Vect)
    155     print("代表的就是多少个侮辱性文件,与文件的总数相除就得到了侮辱性文件的出现概率:
    ", 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))
  • 相关阅读:
    iOS,Android,WP, .NET通用AES加密算法
    iOS开发笔记-图标和图片大小官方最新标准
    因为对 Docker 不熟悉建了 N 多个 Nginx
    Docker 学习笔记 2019-05-27
    Linux Mint 19.1 安装 Docker 过程笔记
    W600 一块新的 KiCad PCB
    KiCad Mark 点名称
    一次乙型流感记录(2019-05-24)
    为什么不喜欢在 QQ 群里回答问题?
    Git 的两种忽略文件方式 gitignore 和 exclude
  • 原文地址:https://www.cnblogs.com/smartisn/p/12494697.html
Copyright © 2011-2022 走看看