def setOfWords2Vec(vocabList, inputSet):
'''
文档向量对比函数
:param vocabList: 词汇表向量
:param inputSet: 文档
:return: 对比处理后的向量结果集
'''
returnVec = [0] * len(vocabList)#创建一个与单词表相同长度的向量并都初始化为0
for word in inputSet:#遍历该文档,若出现单词表中的单词则将输出文档向量对应位置设为1
if word in vocabList:
returnVec[vocabList.index(word)] = 1
else:
print "the word: %s is not in my Vocabulary!" % word
return returnVec
def textParse(bigString):
'''
文本处理函数
:param bigString: 文本
:return: 处理好的单词
'''
import re
#使用正则表达式来切分句子,分隔符是除单词、数字外的任意字符串
listOfTokens=re.split(r'\W*',bigString)
#返回时要注意去掉空字符串而且对于该项目来说我们希望所有词的形式都是统一的因此将所有字符变为小写
return [tok.lower() for tok in listOfTokens if len(tok)>2]
2、使用朴素贝叶斯进行交叉验证
def spamTest():
'''
自动化处理函数,用于测试算法,使用朴素贝叶斯进行交叉验证
:return:
'''
docList=[]
classList=[]
fullText=[]
for i in range(1,26):
wordList=textParse(open("email/spam/%d.txt" %i).read())
#注意两种添加元素的方法是不同的
docList.append(wordList)
fullText.extend(wordList)
classList.append(1)
wordList=textParse(open("email/ham/%d.txt" %i).read())
docList.append(wordList)
fullText.extend(wordList)
classList.append(0)
vocabList=createVocabList(docList)
#训练集
trainingSet=range(50)
#测试集
testSet=[]
'''
随机抽取10个文件,选择10个文件到测试集,并将其从训练集中剔除,
这种随机选择数据的一部分作为训练集,而剩余部分作为测试集的过程称为存留交叉验证
'''
for i in range(10):
randIndex=int(random.uniform(0,len(trainingSet)))
testSet.append(trainingSet[randIndex])
del(trainingSet[randIndex])
trainMat=[]
trainClasses=[]
#将选好的10个样本存入训练矩阵和训练分类器中
for docIndex in trainingSet:
trainMat.append(setOfWords2Vec(vocabList,docList[docIndex]))
trainClasses.append(classList[docIndex])
p0v,p1v,pSpam=trainNB0(array(trainMat),array(trainClasses))
errorCount=0
#对测试集分类
for docIndex in testSet:
wordVector=setOfWords2Vec(vocabList,docList[docIndex])
if classifyNB(array(wordVector),p0v,p1v,pSpam)!=classList[docIndex]:
errorCount+=1
print 'the error rate is ',float(errorCount)/len(testSet)