python 个人广告获取区域倾向

第四章总结起来就是,首先找到数据,利用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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值