(1)收集数据:提供文本文件。
(2)准备数据:将文本文件解析成词条向量。
(3)分析数据:检查词条确保解析的正确性。
(4)训练算法:计算不同的独立特征的条件概率。
(5)测试算法:计算错误率。
(6)使用算法:构建一个完整的程序对一组文档进行分类。
(1) 分词
使用正则表达式将邮件文本其划分成一个个单词的形式
import re
def textParse(bigString):
listOfTokens = re.split(r‘\W*‘, bigString)
return [tok.lower() for tok in listOfTokens if len(tok) > 2]
(2) 生成词汇表
将所有的邮件进行分词后生成一个dataSet,然后生成一个词汇表,这个词汇表是一个集合,即每个单词只出现一次。
def createVocabList(dataSet):
vocabSet = set([]) # 创建一个空的不重复列表
for document in dataSet:
vocabSet = vocabSet | set(document) # 取并集
return list(vocabSet)
(3) 生成词向量
每一封邮件的词汇都存在了词汇表中,因此将每一封邮件生成一个词向量,若该词汇存在于词汇表中,对应位置则为1,不存在为0,这里词向量的维度与词汇表相同。
def setOfWords2Vec(vocabList, inputSet):
returnVec = [0] * len(vocabList) # 创建一个元素都为0的向量
for
word in
inputSet:
if
word in
vocabList:
# 如果词条存在于词汇表中,则置1
returnVec[vocabList.index(word)] = 1 # 查找单词索引
else:
print("the word: %s is
not in my Vocabulary!" % word)
return
returnVec
# 返回文档向量
(4) 训练算法
计算Pr(W|S)、Pr(W|H),Pr( |S)表示在垃圾邮件的条件下第i个特征的概率,首先将所有的类别为1的词向量相加,可以得到每个特征的个数,除以类别为1的单词总数就是垃圾邮件中每个单词的概率。
def trainNB0(trainMatrix, trainCategory):
numTrainDocs = len(trainMatrix) # 计算训练的文档数目
numWords = len(trainMatrix[0]) # 计算每篇文档的词条数
pAbusive = sum(trainCategory) / float(numTrainDocs) # 文档属于垃圾邮件类的概率
p0Num = np.ones(numWords)
p1Num = np.ones(numWords) # 创建numpy.ones数组,词条出现数初始化为1,拉普拉斯平滑
p0Denom = 2.0
p1Denom = 2.0 # 分母初始化为2 ,拉普拉斯平滑
for i in
range(numTrainDocs):
if
trainCategory[i] == 1: # 统计属于侮辱类的条件概率所需的数据,即P(w0|1),P(w1|1),P(w2|1)···
p1Num += trainMatrix[i]
p1Denom += sum(trainMatrix[i])
else: # 统计属于非侮辱类的条件概率所需的数据,即P(w0|0),P(w1|0),P(w2|0)···
p0Num += trainMatrix[i]
p0Denom += sum(trainMatrix[i])
p1Vect = np.log(p1Num / p1Denom)
p0Vect = np.log(p0Num / p0Denom) # 取对数,防止下溢出
return p0Vect, p1Vect, pAbusive # 返回属于正常邮件类的条件概率数组,属于侮辱垃圾邮件类的条件概率数组,文档属于垃圾邮件类的概率
原文:https://www.cnblogs.com/love528/p/10133202.html