第四章总结起来就是,首先找到数据,利用textParse来切分文本,然后用createVocabList创建一个不重复的词的列表,然后使用函数SetOfWords2Vec来把每个文档变为一个文档向量,每一个元素都是0或者1(元素若在词列表中出现,那相应的位置为1),这个向量的长度和词列表的长度是一样的。然后利用trainNB0函数计算PAb(即侮辱性文档在总文档占得比例),p1V(每个侮辱词出现的个数除以总的侮辱词的数量,即每个侮辱词在总的侮辱词中占得比例),p0V(每个非侮辱词出现的个数除以总的非侮辱词的数量,即每个非侮辱词在总的非侮辱词中占得比例),随机从训练集中选择一些测试集,利用SetOfWords2Vec把测试集转化为文档向量,然后利用classifyNB来计算每个测试集是侮辱性和非侮辱性的大小,判断出类型,然后和测试集的classList进行比较,看预测的和实际的是否一致,如果不一致则统计错误率。 def calcMostFreq(vocabList, fullText): """ Function: 计算出现频率 Args: vocabList:词汇表 fullText:全部词汇 Returns: sortedFreq[:30]:出现频率最高的30个词 """ import operator freqDict = {} for token in vocabList:#遍历词汇表中的每个词,统计它在文本中出现的次数 freqDict[token] = fullText.count(token)#返回token在列表中出现的次数 #在用Python进行文本数据处理时,经常会用到字典结构,并对其中关键词出现频率进行排序。 # 此时,可以用下列固定的代码进行排序。 #>> > import operator # >> > sortedFreq = sorted(freqDict.iteritems(), key=operator.itemgetter(1), reverse=True) # freqDict: 字典结构, #此时返回的降序排列后的元组的列表。即列表每个元素为一个元组,元组由键及其键值所组成 sortedFreq = sorted(freqDict.items(), key=operator.itemgetter(1), reverse=True)#键值为该字符串在文本中出现的频率。reverse = True: 按降序排列 return sortedFreq[:30] def localWords(feed1, feed0): """ Function: RSS源分类器 Args: feed1:RSS源 feed0:RSS源 Returns: vocabList:词汇表 p0V:类别概率向量 p1V:类别概率向量 """ import feedparser #初始化数据列表 docList = []; classList = []; fullText = [] minLen = min(len(feed1['entries']), len(feed0['entries'])) #导入文本文件 for i in range(minLen): #切分文本 wordList = textParse(feed1['entries'][i]['summary'])#切分每条文本(用前面定义的函数) #切分后的文本以原始列表形式加入文档列表 docList.append(wordList)# 把wordList的元素都附加到里面, #切分后的文本直接合并到词汇列表,# 每次只扩展一个位置,wordList以数组的形式放在里面,请参考:https://blog.csdn.net/youhuakongzhi/article/details/86258372 fullText.extend(wordList) #标签列表更新 classList.append(1) # 附加数字1 ,代表垃圾邮件 #切分文本 wordList = textParse(feed0['entries'][i]['summary']) #切分后的文本以原始列表形式加入文档列表 docList.append(wordList) #切分后的文本直接合并到词汇列表 fullText.extend(wordList) #标签列表更新 classList.append(0) #获得词汇表 vocabList = createVocabList(docList)# 给docList里面的单词去重 #获得30个频率最高的词汇 top30Words = calcMostFreq(vocabList, fullText) #去掉出现次数最高的那些词 for pairW in top30Words: if pairW[0] in vocabList: vocabList.remove(pairW[0]) trainingSet = list(range(2*minLen))#训练数据集中文档的个数 testSet = []#测试集为空 #随机构建测试集,随机选取二十个样本作为测试样本,并从训练样本中剔除 for i in range(20): #随机得到Index randIndex = int(random.uniform(0, len(trainingSet)))#随机生成0到训练集长度的数并取整(不包含数len(trainingSet)) #将该样本加入测试集中 testSet.append(trainingSet[randIndex]) #同时将该样本从训练集中剔除 del(trainingSet[randIndex]) #初始化训练集数据列表和标签列表 trainMat = []; trainClasses = [] #遍历训练集 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 classfifyNB(array(wordVector), p0V, p1V, pSpam) != classList[docIndex]: #如果不一致则错误计数加1 errorCount += 1 #并且输出出错的文档 print("classification error", docList[docIndex]) #打印输出信息 print('the erroe rate is: ', float(errorCount)/len(testSet)) #返回词汇表和两个类别概率向量 return vocabList, p0V, p1V
python 个人广告获取区域倾向
最新推荐文章于 2022-03-03 09:31:43 发布