IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 使用朴素贝叶斯分类器从个人广告中获取区域倾向 -> 正文阅读

[人工智能]使用朴素贝叶斯分类器从个人广告中获取区域倾向

完整代码在最后
示例:使用朴素贝叶斯来发现地域相关的用词
(1) 收集数据:从 RSS 源收集内容,这里需要对 RSS 源构建一个接口。
(2) 准备数据:将文本文件解析成词条向量。
(3) 分析数据:检查词条确保解析的正确性。
(4) 训练算法:使用我们之前建立的 trainNB0() 函数。
(5) 测试算法:观察错误率,确保分类器可用。可以修改切分程序,以降低错误率,提高分类结果。
(6) 使用算法:构建一个完整的程序,封装所有内容。给定两个 RSS源,该程序会显示最常用的公共词。
1.? 收集数据:导入 RSS
????????接下来要做的第一件事是使用Python 下载文本。幸好,利用 RSS,这些文本很容易得到。现在所需要的是一个 RSS 阅读器。 Universal Feed Parser Python 中最常用的 RSS 程序库。
①下载feedparser安装包,解压文件夹到自己想放的地方。
https://pypi.org/project/feedparser/
②cmd命令行打开,进入setup.py所在目录,执行命令:
python? setup.py?install
③测试,关闭pycharm,再重新打开,命令行输入:import feedparser
不报错即为安装成功
RSS 源分类器及高频词去除函数
#计算出现频率
def calcMostFreq(vocabList,fullText):
    import operator
    freqDict = {}
    for token in vocabList:
        freqDict[token] = fullText.count(token)
    sortedFreq = sorted(freqDict.items(),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):
        #每次访问一条RSS源
        wordList = textParse(feed1['entries'][i]['summary'])
        # 提取RSS源中的字符串文本并切分为字符串列表
        docList.append(wordList)
        # 将每个字符串列表放入一个总的列表里
        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)
    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):
        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,pSam=trainNB0(array(trainMat),array(trainClasses))
    # 朴素贝叶斯分类器
    errorCount = 0
    # 定义错误计数器
    for docIndex in testSet:
        wordVector = bagOfWords2VecMN(vocabList,docList[docIndex])
        # 测试集的词集
        if classifyNB(array(wordVector),p0V,p1V,pSam) != classList[docIndex]:
            errorCount += 1
            # 如果分类错误,计数器加一
    print("错误率为:",float(errorCount)/len(testSet))
    return vocabList,p0V,p1V
????????该函数遍历词汇表中的每个词并统计它在文本中出现的次数,然后根据出现次数从高到低对词典进行排序,最后返回排序最高的30 个单词。
????????下一个函数localWords() 使用两个 RSS 源作为参数。 RSS源要在函数外导入,这样做的原因是 RSS源会随时间而改变。如果想通过改变代码来比较程序执行的差异,就应该使用相同的输入。重新加载RSS源就会得到新的数据,但很难确定是代码原因还是输入原因导致输出结果的改变。调用函数 calcMostFreq()来获得排序最高的30个单词并随后将它们移除 。你可以注释掉用于移除高频词的三行代码,然后比较注释前后的分类性能 。我自己也尝试了一下,去掉这几行代码之后,我发现错误率为 54% ,而保留这些代码得到的错误率为 70%。这里观察到的一个有趣现象是,这些留言中出现次数最多的前 30 个词涵盖了所有用词的 30%。我在进行测试的时候, vocabList 的大小约为3000个词。也就是说,词汇表中的一小部分单词却占据了所有文本用词的一大部分。产生这种现象的原因是因为语言中大部分都是冗余和结构辅助性内容。另一个常用的方法是不仅移除高频词,同时从某个预定词表中移除结构上的辅助词。
程序测试:
>>> ny=feedparser.parse('http://www.nasa.gov/rss/dyn/image_of_the_day.rss')
>>> sf=feedparser.parse('http://www.cppblog.com/kevinlynx/category/6337.html/rss')
>>> importlib.reload(bayes)
<module 'bayes' from 'E:\\python\\机器学习\\bayes.py'>
>>> vocabList,pSF,pNY=bayes.localWords(ny,sf)
错误率为: 0.45
>>> vocabList,pSF,pNY=bayes.localWords(ny,sf)
错误率为: 0.5

这里的RSS源不太稳定(指不定什么时候就不行了),备用参考RSS源

http://www.nasa.gov/rss/dyn/image_of_the_day.rss
http://rss.tom.com/happy/happy.xml
http://rss.yule.sohu.com/rss/yuletoutiao.xml
http://www.ftchinese.com/rss/news
http://www.cppblog.com/kevinlynx/category/6337.html/rss

通过cmd判断能否使用:

>>> ny=feedparser.parse('http://www.nasa.gov/rss/dyn/image_of_the_day.rss')
>>> len(ny['entries'])
60

len(ny['entries'])返回值大于0即为RSS源有效且可正常使用

2.? 分析数据:显示地域相关的用词
????????可以先对向量pSF pNY进行排序,然后按照顺序将词打印出来。下面的最后一段代码会完成这部分工作。再次打开 bayes.py 文件,将下面的代码添加到文件中。
最具表征性的词汇显示函数
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**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**NY**NY**")
    for item in sortedNY:
        print(item[0])
????????函数getTopWords() 使用两个 RSS源作为输入,然后训练并测试朴素贝叶斯分类器,返回使用的概率值。然后创建两个列表用于元组的存储。与之前返回排名最高的X个单词不同,这里可以返回大于某个阈值的所有词。这些元组会按照它们的条件概率进行排序。面看一下实际的运行效果,保存 bayes.py 文件,在 Python 提示符下输入:
>>> bayes.getTopWords(ny,sf)
错误率为: 0.5
SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**SF**
void
highlight
int
strong
codemacro
mov
lynx
kevin
display
tid
std
protobuf
call
NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**NY**
the
this
and
from
space
jupiter
arrived

完整代码:

from numpy import *

def createVocabList(dataSet):
    vocabSet = set([])  #创建一个空集
    for document in dataSet:
        vocabSet = vocabSet | set(document)  #创建两个集合的合集
    return  list(vocabSet)

def bagOfWords2VecMN(vocabList, inputSet):
    returnVec = [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] += 1
    return returnVec

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbisive = sum(trainCategory)/float(numTrainDocs) #侮辱性文档的概率3/6
    #初始化概率
    # p0Num = zeros(numWords);p1Num = zeros(numWords)
    # p0Denom = 0.0;p1Denom = 0.0
    p0Num = ones(numWords);p1Num = ones(numWords)
    p0Denom = 2.0;p1Denom = 2.0
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:
            #向量相加
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    # p1Vect = p1Num/p1Denom   #侮辱性文字的概率
    # p0Vect = p0Num/p0Denom   #正常文字的概率
    p1Vect = log(p1Num/p1Denom)   #侮辱性文字的概率
    p0Vect = log(p0Num/p0Denom)   #正常文字的概率
    return p0Vect,p1Vect,pAbisive
# #
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]

#计算出现频率
def calcMostFreq(vocabList,fullText):
    import operator
    freqDict = {}
    for token in vocabList:
        freqDict[token] = fullText.count(token)
    sortedFreq = sorted(freqDict.items(),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):
        #每次访问一条RSS源
        wordList = textParse(feed1['entries'][i]['summary'])
        # 提取RSS源中的字符串文本并切分为字符串列表
        docList.append(wordList)
        # 将每个字符串列表放入一个总的列表里
        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)
    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):
        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,pSam=trainNB0(array(trainMat),array(trainClasses))
    # 朴素贝叶斯分类器
    errorCount = 0
    # 定义错误计数器
    for docIndex in testSet:
        wordVector = bagOfWords2VecMN(vocabList,docList[docIndex])
        # 测试集的词集
        if classifyNB(array(wordVector),p0V,p1V,pSam) != classList[docIndex]:
            errorCount += 1
            # 如果分类错误,计数器加一
    print("错误率为:",float(errorCount)/len(testSet))
    return vocabList,p0V,p1V

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**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**NY**NY**")
    for item in sortedNY:
        print(item[0])

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:12:14  更:2021-08-25 12:12:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 18:44:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码