机器学习实战(代码部分)-- 朴素贝叶斯之文本分类(Ⅰ 从文本中构建词向量)

mac2024-08-18  61

朴素贝叶斯是贝叶斯分类器的一个扩展,是用于文档分类的常用算法。

4-1 词表到向量的转换函数

假设有六组数据,它们的分类如下:

# 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

(1)加载数据集的函数(创建实验样本):返回词条集合和对应的类别标签的集合。

''' 加载数据集的函数 postingList:存放词条列表 classVec:存放每个词条的所属类别 ''' def loadDataSet(): postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], # 切分的词条 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'], ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'], ['stop', 'posting', 'stupid', 'worthless', 'garbage'], ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'], ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']] classVec = [0, 1, 0, 1, 0, 1] # 类别标签向量,1代表侮辱性词汇,0代表不是 return postingList, classVec

(2)创建一个包含在所有文档中出现的不重复的词的列表。【词集模型】

方法:建立一个空的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集合如下:

(3)将输入的词汇表和某个文档转换为文档向量。

方法:创建一个词汇表长度的都为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)

打印出的文档向量如下:

 

最新回复(0)