朴素贝叶斯是贝叶斯分类器的一个扩展,是用于文档分类的常用算法。
假设有六组数据,它们的分类如下:
# 1代表侮辱性文字,0代表非侮辱性文字 ['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'] 0 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'] 1 ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'] 0 ['stop', 'posting', 'stupid', 'worthless', 'garbage'] 1 ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'] 0 ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid'] 1方法:建立一个空的set集合,然后每次读取数据时候与其取并集,将新的不重复的数据并入到set中。最后返回这个set创建的list对象。
# 创建词汇表,文档向量化的第一步 def createVocabList(dataSet): vocab_set = set([]) # 创建一个空的不重复列表(set无序,不重复) for document in dataSet: vocab_set = vocab_set | set(document) # 取并集 return list(vocab_set)测试效果:
在主函数中编写代码如下:
if __name__ == "__main__": postingList, classVec = loadDataSet() myVocabList = createVocabList(postingList) print(myVocabList)打印出创建的list集合如下:
方法:创建一个词汇表长度的都为0的向量,对输入的词条进行遍历,若位于词汇表中则在对应索引位置置1,返回文档向量。
# 返回值类似[1, 0, 1, 0, 0, 0,...] def setWordsToVec(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 # 返回文档向量测试效果:
在主函数中编写代码如下:
if __name__ == "__main__": postingList, classVec = loadDataSet() myVocabList = createVocabList(postingList) print(myVocabList) trainMat = [] for postinDoc in postingList: trainMat.append(setWordsToVec(myVocabList, postinDoc)) # trainMat类似[1, 0, 1, 0, 0, 0, ...],[0, 1, 0, 0, 0, 0, ...], ... print('trainMat:\n', trainMat)打印出的文档向量如下: