zoukankan      html  css  js  c++  java
  • 使用朴素贝叶斯分类器从个人广告中获取区域倾向

    引入

    使用来自不同城市的广告训练一个分类器,然后观察分类器的效果。我们的目的并不是使用该分类器进行分类,而是通过观察单词和条件概率值来发现与特定城市相关的内容。

     1 def calcMostFreq(vocabList,fullText):
     2     import operator
     3     freqDict = {}
     4     for token in vocabList:
     5         freqDict[token]=fullText.count(token)
     6     sortedFreq = sorted(freqDict.iteritems(), key=operator.itemgetter(1), reverse=True) 
     7     return sortedFreq[:30]       
     8 
     9 def localWords(feed1,feed0):
    10     import feedparser
    11     docList=[]; classList = []; fullText =[]
    12     minLen = min(len(feed1['entries']),len(feed0['entries']))
    13     for i in range(minLen):
    14         wordList = textParse(feed1['entries'][i]['summary'])
    15         docList.append(wordList)
    16         fullText.extend(wordList)
    17         classList.append(1) #NY is class 1
    18         wordList = textParse(feed0['entries'][i]['summary'])
    19         docList.append(wordList)
    20         fullText.extend(wordList)
    21         classList.append(0)
    22     vocabList = createVocabList(docList)#create vocabulary
    23     top30Words = calcMostFreq(vocabList,fullText)   #remove top 30 words
    24     for pairW in top30Words:
    25         if pairW[0] in vocabList: vocabList.remove(pairW[0])
    26     trainingSet = range(2*minLen); testSet=[]           #create test set
    27     for i in range(20):
    28         randIndex = int(random.uniform(0,len(trainingSet)))
    29         testSet.append(trainingSet[randIndex])
    30         del(trainingSet[randIndex])  
    31     trainMat=[]; trainClasses = []
    32     for docIndex in trainingSet:#train the classifier (get probs) trainNB0
    33         trainMat.append(bagOfWords2VecMN(vocabList, docList[docIndex]))
    34         trainClasses.append(classList[docIndex])
    35     p0V,p1V,pSpam = trainNB0(array(trainMat),array(trainClasses))
    36     errorCount = 0
    37     for docIndex in testSet:        #classify the remaining items
    38         wordVector = bagOfWords2VecMN(vocabList, docList[docIndex])
    39         if classifyNB(array(wordVector),p0V,p1V,pSpam) != classList[docIndex]:
    40             errorCount += 1
    41     print 'the error rate is: ',float(errorCount)/len(testSet)
    42     return vocabList,p0V,p1V

    第一个函数遍历词汇表中的每个词并统计它在文本中出现的次数,然后根据出现次数从高到低对词典进行排序,最后返回排序最高的30个单词

    第二个函数使用两个RSS源作为参数。这个函数和之前的spamTest函数几乎相同。区别在于这里访问的是RSS源而不是文件。

    词袋模型在解决文档分类问题上比词集模型有所提高。

     1 def getTopWords(ny,sf):
     2     import operator
     3     vocabList,p0V,p1V=localWords(ny,sf)
     4     topNY=[]; topSF=[]
     5     for i in range(len(p0V)):
     6         if p0V[i] > -6.0 : topSF.append((vocabList[i],p0V[i]))
     7         if p1V[i] > -6.0 : topNY.append((vocabList[i],p1V[i]))
     8     sortedSF = sorted(topSF, key=lambda pair: pair[1], reverse=True)
     9     print "SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**"
    10     for item in sortedSF:
    11         print item[0]
    12     sortedNY = sorted(topNY, key=lambda pair: pair[1], reverse=True)
    13     print "NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**"
    14     for item in sortedNY:
    15         print item[0]
    >>> import feedparser
    >>> import bayes
    >>> ny=feedparser.parse('http://newyork.craigslist.org/stp/index.rss')
    >>> sf=feedparser.parse('http://sfbay.craigslist.org/stp/index.rss')
    >>> voacblist,psf,pny=bayes.localWords(ny,sf)
    the error rate is:  0.25
    >>> voacblist,psf,pny=bayes.localWords(ny,sf)
    the error rate is:  0.45
    >>> voacblist,psf,pny=bayes.localWords(ny,sf)
    the error rate is:  0.4
    >>> voacblist,psf,pny=bayes.localWords(ny,sf)
    the error rate is:  0.3
    voacblist,psf,pny=bayes.localWords(ny,sf)
    >>> 
    >>> 
    KeyboardInterrupt
    >>> 
    >>> voacblist,psf,pny=bayes.localWords(ny,sf)
    the error rate is:  0.25
    >>> bayes.getTopWords(ny,sf)

    使用两个RSS源作为输入,然后训练并测试朴素贝叶斯分类器,返回使用的概率值。然后创建两个列表用于元素的存储,返回大于某个阈值的所有词,然后按照他们的条件概率进行排序。

  • 相关阅读:
    vue 保留两位小数 不能直接用toFixed(2) ?
    分页导航 简洁版 只有上一页下一页
    vue style width a href动态拼接问题 ?
    使用html元素的getBoundingClientRect来获取dom元素的时时位置和大小
    javascript中函数的闭包自调用
    javascript中的Promise使用
    常用css样式颜色值: 64位真彩和256位值
    javascript数组Array强大的splice()方法
    Bootatrap常用样式
    angularjs上传图片和文件
  • 原文地址:https://www.cnblogs.com/xiaoyingying/p/7524923.html
Copyright © 2011-2022 走看看