朴素贝叶斯从个人广告中获取区域倾向--python实现

背景:广告商往往想知道关于一个人的一些特定人口统计信息,以便能更好地定向推销广告。

我们将分别从美国的两个城市中选取一些人,通过分析这些人发布的信息,来比较这两个城市的人们在广告用词上是否不同。如果结论确实不同,那么他们各自常用的词是那些,从人们的用词当中,我们能否对不同城市的人所关心的内容有所了解。

1、收集数据:导入RSS源

使用python下载文本,在http://code.google.com/p/feedparser/下浏览相关文档,安装feedparse,首先解压下载的包,并将当前目录切换到解压文件所在的文件夹,然后在python提示符下输入:

# python setup.py install

创建一个bayes.py文件,添加以下代码:

#创建一个包含在所有文档中出现的不重复词的列表
def createVocabList(dataSet):
    vocabSet=set([])    #创建一个空集
    for document in dataSet:
        vocabSet=vocabSet|set(document)   #创建两个集合的并集
    return list(vocabSet)
def setOfWords2VecMN(vocabList,inputSet):
    returnVec=[0]*len(vocabList)  #创建一个其中所含元素都为0的向量
    for word in inputSet:
        if word in vocabList:
                returnVec[vocabList.index(word)]+=1
    return returnVec
#朴素贝叶斯分类器训练函数
def trainNBO(trainMatrix,trainCategory):
    numTrainDocs=len(trainMatrix)
    numWords=len(trainMatrix[0])
    pAbusive=sum(trainCategory)/float(numTrainDocs)
    p0Num=ones(numWords);p1Num=ones(numWords)   #计算p(w0|1)p(w1|1),避免其中一个概率值为0,最后的乘积为0
    p0Demo=2.0;p1Demo=2.0  #初始化概率
    for i in range(numTrainDocs):
        if trainCategory[i]==1:
               p1Num+=trainMatrix[i]
               p1Demo+=sum(trainMatrix[i])
        else:
               p0Num+=trainMatrix[i]
               p0Demo+=sum(trainMatrix[i])
    #p1Vect=p1Num/p1Demo
    #p0Vect=p0Num/p0Demo
    p1Vect=log(p1Num/p1Demo) #计算p(w0|1)p(w1|1)时,大部分因子都非常小,程序会下溢出或得不到正确答案(相乘许多很小数,最后四舍五入会得到0)
    p0Vect=log(p0Num/p0Demo)
    return p0Vect,p1Vect,pAbusive
#朴素贝叶斯分类函数
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
    p1=sum(vec2Classify*p1Vec)+log(pClass1)
    p0=sum(vec2Classify*p0Vec)+log(1.0-pClass1)
    if p1>p0:
        return 1
    else:
        return 0
#文件解析及测试函数
def textParse(bigString):
    import re
    listOfTokens=re.split(r‘\W*‘,bigString)
    return [tok.lower() for tok in listOfTokens if len(tok)>2]

添加以下代码:

#RSS源分类器及高频词去除函数
def calcMostFreq(vocabList,fullText):
    import operator
    freqDict={}
    for token in vocabList:
        freqDict[token]=fullText.count(token)
    sortedFreq=sorted(freqDict.iteritems(),key=operator.itemgetter(1),reverse=True)
    return sortedFreq[:30]
def localWords(feed1,feed0):
    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)
        fullText.extend(wordList)
        classList.append(1)
        wordList=textParse(feed0[‘entries‘][i][‘summary‘])
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(0)
    vocabList=createVocabList(docList)
    top30Words=calcMostFreq(vocabList,fullText)
    for pairW in top30Words:
        if pairW[0] in vocabList:vocabList.remove(pairW[0])
    trainingSet=range(2*minLen);testSet=[]
    for i in range(20):
        randIndex=int(random.uniform(0,len(trainingSet)))
        testSet.append(trainingSet[randIndex])
        del(trainingSet[randIndex])
    trainMat=[];trainClasses=[]
    for docIndex in trainingSet:
        trainMat.append(bagOfWords2VecMN(vocabList,docList[docIndex]))
        trainClasses.append(classList[docIndex])
    p0V,p1V,pSpam=trainNBO(array(trainMat),array(trainClasses))
    errorCount=0
    for docIndex in testSet:
        wordVector=bagOfWords2VecMN(vocabList,docList[docIndex])
        if classifyNB(array(wordVector),p0V,p1V,pSpam)!=classList[docIndex]:
            errorCount+=1
    print ‘the error rate is:‘,float(errorCount)/len(testSet)
    return vocabList,p0V,p1V

函数localWords()使用了两个RSS源作为参数,RSS源要在函数外导入,这样做的原因是RSS源会随时间而改变,重新加载RSS源就会得到新的数据.

>>> reload(bayes)
<module ‘bayes‘ from ‘bayes.pyc‘>
>>> import feedparser
>>> ny=feedparser.parse(‘http://newyork.craigslist.org/stp/index.rss‘)
>>> sy=feedparser.parse(‘http://sfbay.craigslist.org/stp/index.rss‘)
>>> vocabList,pSF,pNY=bayes.localWords(ny,sf)
the error rate is: 0.2
>>> vocabList,pSF,pNY=bayes.localWords(ny,sf)
the error rate is: 0.3
>>> vocabList,pSF,pNY=bayes.localWords(ny,sf)
the error rate is: 0.55

为了得到错误率的精确估计,应该多次进行上述实验,然后取平均值

2、分析数据:显示地域相关的用词

可以先对向量pSF与pNY进行排序,然后按照顺序打印出来,将下面的代码添加到文件中:

#最具表征性的词汇显示函数
def getTopWords(ny,sf):
    import operator
    vocabList,p0V,p1V=localWords(ny,sf)
    topNY=[];topSF=[]
    for i in range(len(p0V)):
        if p0V[i]>-6.0:topSF.append((vocabList[i],p0V[i]))
        if p1V[i]>-6.0:topNY.append((vocabList[i],p1V[i]))
    sortedSF=sorted(topSF,key=lambda pair:pair[1],reverse=True)
    print "SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**"
    for item in sortedSF:
        print item[0]
    sortedNY=sorted(topNY,key=lambda pair:pair[1],reverse=True)
    print "NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**"
    for item in sortedNY:
        print item[0]

函数getTopWords()使用两个RSS源作为输入,然后训练并测试朴素贝叶斯分类器,返回使用的概率值。然后创建两个列表用于元组的存储,与之前返回排名最高的X个单词不同,这里可以返回大于某个阈值的所有词,这些元组会按照它们的条件概率进行排序。

保存bayes.py文件,在python提示符下输入:

时间: 2024-10-11 04:12:58

朴素贝叶斯从个人广告中获取区域倾向--python实现的相关文章

机器学习之路--朴素贝叶斯

一,引言 前两章的KNN分类算法和决策树分类算法最终都是预测出实例的确定的分类结果,但是,有时候分类器会产生错误结果:本章要学的朴素贝叶斯分类算法则是给出一个最优的猜测结果,同时给出猜测的概率估计值. 1 准备知识:条件概率公式 相信学过概率论的同学对于概率论绝对不会陌生,如果一时觉得生疏,可以查阅相关资料,在这里主要是想贴出条件概率的计算公式: P(A|B)=P(A,B)/P(B)=P(B|A)*P(A)/P(B) 2 如何使用条件概率进行分类 假设这里要被分类的类别有两类,类c1和类c2,那

朴素贝叶斯-基于概率的分类方法

决策树.knn算法都是结果确定的分类算法,数据示实例最终被明确的划分到某个分类中 贝叶斯:不能完全确定数据实例应该划分到某个类,湖综合只能给出数据实例属于给定分类的概率 *引入先验概率与逻辑推理来处理不确定命题 *(扩展命题),另一种叫频数概率,从数据本身出发得到结论,不考了逻辑推理及先验知识. 朴素贝叶斯:整个形式化过程中制作最原始,最简单的假设 python文本能力:将文本划分为词向量,利用词向量对文本分类 朴素贝叶斯:选择高概率对应的类别 优点:在数据较少的情况下仍然有效,可以处理多类别问

实现 | 朴素贝叶斯模型算法研究与实例分析

实现 | 朴素贝叶斯模型算法研究与实例分析(白宁超2018年9月4日09:03:21) 导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果.所以很受欢迎,对于朴素贝叶斯的学习,本文首先介绍理论知识即朴素贝叶斯相关概念和公式推导,为了加深理解,采用一个维基百科上面性别分类例子进行形式化描述.然后通过编程实现朴素贝叶斯分类算法,并在屏蔽社区言论.垃圾邮件.个人广告中获取区域倾向等几个方面进行应用,包括创建数据集.数据预处理.词集模型和词袋模型.朴素贝叶斯

4 基于概率论的分类方法:朴素贝叶斯(三)

4.7 示例:使用朴素贝叶斯分类器从个人广告中获取区域倾向 前面介绍了两个应用:1.过滤网站的恶意留言:2.过滤垃圾邮件. 4.7.1 收集数据:导入RSS源 Universal Feed Parser是Python中最常用的RSS程序库. 在Python提示符下输入: 构建类似于spamTest()函数来对测试过程自动化. #RSS源分类器及高频词去除函数 def calcMostFreg(vocabList, fullText): import operator freqDict = {}

C#编程实现朴素贝叶斯算法下的情感分析

C#编程实现 这篇文章做了什么 朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等.而情感分析(Sentiment Analysis)是自然语言处理(Natural Language Progressing)中的重要问题,用以对文本进行正负面的判断,以及情感度评分和意见挖掘.本文借助朴素贝叶斯算法,针对文本正负面进行判别,并且利用C#进行编程实现. 不先介绍点基础? 朴素贝叶斯,真的很朴素 朴素贝叶斯分类算法,是一种有监督学习算法,通过对训练集的学习,基于先验概率与贝叶

朴素贝叶斯算法的实例

贝叶斯的应用 过滤垃圾邮件 贝叶斯分类器的著名的应用就是垃圾邮件过滤了,这方面推荐想详细了解的可以去看看<黑客与画家>或是<数学之美>中对应的章节,贝叶斯的基础实现看这里 数据集 两个文件夹,分别是正常邮件和垃圾邮件,其中各有25封邮件 测试方法 从50封邮件中随机选取10封做为测试数据 实现细节 1.首先我们需要将文本转成我们需要的向量的样子,这里需要使用一点正则表达式2.由于采取交叉验证的方式,随机过程会导致每次的结果不尽相同 1 #coding=utf-8 2 from nu

[白话解析] 深入浅出朴素贝叶斯模型原理及应用

[白话解析] 深入浅出朴素贝叶斯模型原理及应用 0x00 摘要 朴素贝叶斯模型是机器学习中经常提到的概念.但是相信很多朋友都是知其然而不知其所以然.本文将尽量使用易懂的方式介绍朴素贝叶斯模型原理,并且通过具体应用场景和源码来帮助大家深入理解这个概念. 0x01 IT相关概念 1. 分类问题 已知m个样本 (x1,y1), ...... (xm,ym),x是特征变量,y是对应的类别.要求得一个模型函数或者映射规则h,对于新的样本 xt,能够尽量准确的预测出 yt = h(xt). 我们也可以从概率

高斯判别分析、朴素贝叶斯和逻辑回归

近来看论文中经常看到GDA和朴素贝叶斯,并且论文中说的算法中用到的贝叶斯公式,对怎么用的原理比较困惑,今天主要看了斯坦福机器学习的关于GDA,NB和LR的讲义部分.理解了贝叶斯公式在GDA和NB中的原理,以及GDA和LR的关系. 与以前学习贝叶斯公式相比贝叶斯公式:对于目标B有不同的到达方式Ai,i=1,2,3,...,n.已知p(Ai)和p(B|Ai)的话,如果知道B发生了,可以知道Ai的后验概率. 贝叶斯公式图示 在GDA和NB中,类别标签就相当于Ai,每一个特征相当于B的一个分量.根据采集

【转载】判别模型、生成模型与朴素贝叶斯方法

判别模型.生成模型与朴素贝叶斯方法 转载时请注明来源:http://www.cnblogs.com/jerrylead 1判别模型与生成模型 上篇报告中提到的回归模型是判别模型,也就是根据特征值来求结果的概率.形式化表示为,在参数确定的情况下,求解条件概率.通俗的解释为在给定特征后预测结果出现的概率. 比如说要确定一只羊是山羊还是绵羊,用判别模型的方法是先从历史数据中学习到模型,然后通过提取这只羊的特征来预测出这只羊是山羊的概率,是绵羊的概率.换一种思路,我们可以根据山羊的特征首先学习出一个山羊