资源简介

python源码,用朴素贝叶斯算法实现垃圾邮件的过滤.

资源截图

代码片段和文件信息

# -*- coding: utf-8 -*-
“““
Created on Thu Apr 11 00:02:15 2019

@author: 自律给我自由
“““
import xlrd
import re
import jieba
import math
import random
import numpy as np
import os
file=‘chinesespam.xlsx‘
wb=xlrd.open_workbook(filename=file)
ws=wb.sheet_by_name(‘chinesespam.‘)
dataset=[]
dataset1=[]
dataset2=[]
temp=[]
vocabList=[]
Percision = 0.0
Percision_All = 0.0
Recall = 0.0
Recall_All = 0.0
General = 0.0
General_All = 0.0

for i in range(1ws.nrows):
     temp.append(ws.cell(i0).value)
     if  ‘ham‘==temp[i-1]:
         dataset1.append(0)
     else: 
         dataset1.append(1)
     
for r in range(1ws.nrows):
     dataset2.append(ws.cell(r1).value)
     
def textHandle(bigString):
    #分词,有的在网上找到的例子中创建了停止词列表将那些无关语义表达的词如“一天”删去
    list1 = jieba.lcut(bigString)
    newList = [re.sub(r‘\W*‘‘‘s) for s in list1] 
    #将不是字母,数字,下划线,汉字的字符删去
    return[tok.lower() for tok in newList if len(tok) > 0]
for i in range(len(dataset2)):   #将分好的词存入到列表中
    dataset.append(textHandle(dataset2[i]))
    
#测试用 print(dataset) 
def createVocabList(dataSet):
    vocabSet=set([])  #创建一个空集
    for document in dataSet:
         vocabSet=vocabSet|set(document) #取两个集合的并集
    return list(vocabSet)     #以list的方式返回结果
vocabList=createVocabList(dataset)   
#该变量是已分好词的列表     
# print(createVocabList(dataset)) 测试用
def setOfWords2Vec(vocabListinputSet):
    returnVec=np.zeros(len(vocabList)) #生成零向量的array
    for word in inputSet:
            if word in vocabList:
                    returnVec[vocabList.index(word)]=1 #单词出现则记为1
            else: print(‘the word:%s is not in my Vocabulary!‘% word)
    return returnVec #返回0.1向量
#测试用 for i in range(149):
#测试用    print(setOfWords2Vec(vocabListdataset[i]))
#测试用 8127  print(len(vocabList))
#现在要做 减少8000维度经过一番想法,还是改用词集模型
def trainNB(trainDataSettrainLabels):
    numTrains = len(trainDataSet)  #训练数据组数
    numWords = len(trainDataSet[0]) #每组训练的大小
    pClass1 = sum(trainLabels)/float(numTrains) #垃圾邮件出现的概率
    p0Num = np.ones(numWords) #正常邮件分词出现频率
    p1Num = np.ones(numWords) #垃圾邮件分词出现频率
    p0SumWords = 2.0    #正常邮件中分词总数
    p1SumWords = 2.0    #垃圾邮件中分词总数
    for i in range(numTrains):
        if trainLabels[i]==1:
            p1Num += trainDataSet[i]    #统计垃圾邮件各分词
        else:
            p0Num += trainDataSet[i]    #统计正常邮件各分词
    p0SumWords = sum(p0Num)
    p1SumWords = sum(p1Num)
    p0Vect = p0Num/p0SumWords #正常邮件中各分词出现概率
    p1Vect = p1Num/p1SumWords #垃圾邮件中各分词出现概率
    return pClass1p0Vectp1Vect
    

def classifyNB(vec2Classifyp0Vecp1VecpClass1):
    temp0 = vec2Classify*p0Vec
    temp1 = vec2Classify*p1Vec
    temp00 = []
    temp11 = []
    for x in temp0:
        if x>0:
            temp00.append(math.log(x))
        else:
            temp00.append(0)
    for x in temp1:
        if x>0:
            temp11.append(math.log(x))
        else:
            temp11.append(0)
    p1=sum(temp11)+math.log(pClass1)
    p0=sum(temp

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       6937  2019-04-14 10:32  bayes.py

     文件     114184  2019-04-14 00:44  chinesespam.xlsx

----------- ---------  ---------- -----  ----

               121121                    2


评论

共有 条评论