机器学习实战0:评论爬虫+贝叶斯模型标注恶意评论+分布式形式

  

一 引言

  本程序是一个完整的机器学习过程,先编写基于python的爬虫脚本,爬取目标论坛网站的评论到本地存储,然后使用贝叶斯分类模型对评论进行分类,预测新 的评论是否为垃圾评论。如果遇到大数据量的问题,可以把贝叶斯算法写成mapreduce模式,map负责把数据集划分成键值对格式,类序号为key,属 性向量为value,reduce进行汇总每类的先验概率和条件概率,主server汇总所有类的统计量。

二 爬虫脚本

  1 编写爬虫脚本,爬取目标论坛的评论。其中,headers是必须的,因为我们需要伪装成浏览器在访问论坛的服务器。使用requests包获取指定url的数据流。

mport requests
from bs4 import BeautifulSoup
import re
import json
import time

headers = {
‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘,
‘Accept-Language‘: ‘zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3‘,
‘Accept-Encoding‘: ‘gzip, deflate, br‘,
‘Connection‘: ‘keep-alive‘,
‘Cookie‘: ‘__cfduid=d653bf931cbde10f9243b63e991f70dc41466778585; loid=a5WUnHRHlleKL9OSSR; loidcreated=2016-06-24T14%3A29%3A45.413Z; _recent_srs=t5_2qu49; _ga=GA1.2.54465388.1466778724; pc=ne; __utma=55650728.54465388.1466778724.1466778728.1466843492.2; __utmz=55650728.1466778728.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=55650728.0.10.1466843492; __utmc=55650728‘,
‘Host‘: ‘www.reddit.com‘,
‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0‘,
}

url = ‘https://www.reddit.com/r/AskReddit/comments/4qfh01/what_are_some_classes_you_must_take_in/‘
r = requests.get(url,headers=headers)
r.encoding = r.apparent_encoding

  2 使用BeautifulSoup解析爬去的html文件,css定位我们需要的字段,输出到本地文件comments.txt保存即可。

soup = BeautifulSoup(r.text)
res = soup.select("div.md")
comments = []
for item1 in res[1:]:
    comments.append(item1.contents)
print comments

fd = open(‘comments.txt‘,‘w+‘)

p_soup = BeautifulSoup(str(comments))
res2 = p_soup.findAll(‘p‘)
for item2 in res2:
    ct = str(item2.contents).encode(‘utf-8‘)
    print ct[3:-2]
    fd.write(ct[3:-2] + ‘\n‘)

fd.close()

三 实战1 -文本分类(应用过滤恶意留言等)

  下面是二分类问题,文档只能属于0和1两个类别,

  1 载入数据集:本地读取文件comments.txt中爬虫爬取的评论。

from numpy import *def loadDataSet():    fd = open(‘comments.txt‘)    postingList = []    classVec = []    for line in fd.readlines():        tmp = line.split()        postingList.append(tmp[1:])        classVec.append(int(tmp[0]))    return postingList,classVec

  2 创建词汇表:利用集合结构内元素的唯一性,创建一个包含所有词汇的词表。

def createVocabList(dataSet):    vocabSet = set([])  #create empty set    for document in dataSet:        vocabSet = vocabSet | set(document) #union of the two sets    return list(vocabSet)

  3 把输入文本根据词表转化为计算机可处理的01向量形式:

  eq,测试文本1: [‘love‘, ‘my‘, ‘dalmation‘]

     词汇表:[‘cute‘, ‘love‘, ‘help‘, ‘garbage‘, ‘quit‘, ‘I‘, ‘problems‘, ‘is‘, ‘park‘, ‘stop‘, ‘flea‘, ‘dalmation‘, ‘licks‘, ‘food‘, ‘not‘, ‘him‘, ‘buying‘, ‘posting‘, ‘has‘, ‘worthless‘, ‘ate‘, ‘to‘, ‘maybe‘, ‘please‘, ‘dog‘, ‘how‘, ‘stupid‘, ‘so‘, ‘take‘, ‘mr‘, ‘steak‘, ‘my‘]

    向量化结果:[0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]

def setOfWords2Vec(vocabList, inputSet):    returnVec = [0]*len(vocabList)    for word in inputSet:        if word in vocabList:            returnVec[vocabList.index(word)] = 1        else: print "the word: %s is not in my Vocabulary!" % word    return returnVec

  4训练模型:在训练样本中计算先验概率 p(Ci) 和 条件概率 p(x,y | Ci),本实例有0和1两个类别,所以返回p(x,y | 0),p(x,y | 1)和p(Ci)。

  此处有两个改进的地方:

    (1)若有的类别没有出现,其概率就是0,会十分影响分类器的性能。所以采取各类别默认1次累加,总类别(两类)次数2,这样不影响相对大小。

    (2)若很小是数字相乘,则结果会更小,再四舍五入存在误差,而且会造成下溢出。采取取log,乘法变为加法,并且相对大小趋势不变。

def trainNB0(trainMatrix,trainCategory):    numTrainDocs = len(trainMatrix)    numWords = len(trainMatrix[0])    pAbusive = sum(trainCategory)/float(numTrainDocs)    p0Num = ones(numWords); p1Num = ones(numWords)      #change to ones()     p0Denom = 2.0; p1Denom = 2.0                        #change to 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 = log(p1Num/p1Denom)          #change to log()    p0Vect = log(p0Num/p0Denom)          #change to log()    return p0Vect,p1Vect,pAbusive

  5 分类:根据计算后,哪个类别的概率大,则属于哪个类别。

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise mult
    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else:
        return 0

  6 测试函数:

    加载数据集+提炼词表;

    训练模型:根据六条训练集计算先验概率和条件概率;

    测试模型:对训练两条测试文本进行分类。

def testingNB():    listOPosts,listClasses = loadDataSet()    myVocabList = createVocabList(listOPosts)    trainMat=[]    for postinDoc in listOPosts:        trainMat.append(setOfWords2Vec(myVocabList, postinDoc))    p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses))    testEntry = [‘friends‘, ‘my‘, ‘take‘]    thisDoc = array(setOfWords2Vec(myVocabList, testEntry))    print testEntry,‘classified as: ‘,classifyNB(thisDoc,p0V,p1V,pAb)    testEntry = [‘stupid‘, ‘garbage‘]    thisDoc = array(setOfWords2Vec(myVocabList, testEntry))    print testEntry,‘classified as: ‘,classifyNB(thisDoc,p0V,p1V,pAb)

  缺点:词表只能记录词汇是否出现,不能体现这个词汇出现的次数。改进方法:采用词袋模型,见下面垃圾邮件分类实战。

  结果图:[‘friends‘, ‘wish‘, ‘classes‘] 被分到 正常评论类;
      [‘stupid‘, ‘garbage‘] 被分到垃圾评论类;分类结果正确。

四 算法的MapReduce形式

  本人正在把这个贝叶斯分类算法转换成分布式算法,初步思想是,可以把贝叶斯算法写成mapreduce模式,map负责把数据集划分成键值对格式,类序号为key,属 性向量为value,reduce进行汇总每类的先验概率和条件概率,主server汇总所有类的统计量。

时间: 2024-11-06 03:20:34

机器学习实战0:评论爬虫+贝叶斯模型标注恶意评论+分布式形式的相关文章

《机器学习实战》笔记——朴素贝叶斯

运用贝叶斯公式(朴素贝叶斯假设每个特征每个特征都是独立的)可以解决的问题有,已知某些特征,用来判断某情况发生的可能性大小,设置可能性最大的情况作为预测值. 是一种监督算法. 广泛应用于垃圾邮件检测等等. 1 # _*_coding:utf-8_*_ 2 from numpy import * 3 4 # 4-1 词表到向量的转换函数(实验样本) 5 def loadDataSet(): 6 postingList = [['my', 'dog', 'has', 'flea', 'problems

机器学习Matlab实战之垃圾邮件分类————朴素贝叶斯模型

本系列来自于我<人工智能>课程复习总结以及机器学习部分的实验总结 垃圾邮件分类是监督学习分类中一个最经典的案例,本文先复习了基础的概率论知识.贝叶斯法则以及朴素贝叶斯模型的思想,最后给出了垃圾邮件分类在Matlab中用朴素贝叶斯模型的实现 1.概率 1.1 条件概率 定义:事件B发生的情况下,事件A发生的概率记作条件概率P(A|B) P(A|B)=P(A∧B)P(B) 条件概率也叫后验概率,无条件概率也叫先验概率(在没有任何其它信息存在的情况下关于命题的信度) 可以得到乘法规则: P(A∧B)

机器学习基础——带你实战朴素贝叶斯模型文本分类

本文始发于个人公众号:TechFlow 上一篇文章当中我们介绍了朴素贝叶斯模型的基本原理. 朴素贝叶斯的核心本质是假设样本当中的变量服从某个分布,从而利用条件概率计算出样本属于某个类别的概率.一般来说一个样本往往会含有许多特征,这些特征之间很有可能是有相关性的.为了简化模型,朴素贝叶斯模型假设这些变量是独立的.这样我们就可以很简单地计算出样本的概率. 想要回顾其中细节的同学,可以点击链接回到之前的文章: 机器学习基础--让你一文学会朴素贝叶斯模型 在我们学习算法的过程中,如果只看模型的原理以及理

机器学习基础——让你一文学会朴素贝叶斯模型

今天这篇文章和大家聊聊朴素贝叶斯模型,这是机器学习领域非常经典的模型之一,而且非常简单,适合初学者入门. 朴素贝叶斯模型,顾名思义和贝叶斯定理肯定高度相关.之前我们在三扇门游戏的文章当中介绍过贝叶斯定理,我们先来简单回顾一下贝叶斯公式: \[P(A|B)=\frac{P(A)P(B|A)}{P(B)}\] 我们把\(P(A)\)和\(P(B)\)当做先验概率,那么贝叶斯公式就是通过先验和条件概率推算后验概率的公式.也就是寻果溯因,我们根据已经发生的事件去探究导致事件发生的原因.而朴素贝叶斯模型正

机器学习Matlab打击垃圾邮件的分类————朴素贝叶斯模型

该系列来自于我<人工智能>课程回顾总结,以及实验的一部分进行了总结学习机 垃圾分类是有监督的学习分类最经典的案例,本文首先回顾了概率论的基本知识.则以及朴素贝叶斯模型的思想.最后给出了垃圾邮件分类在Matlab中用朴素贝叶斯模型的实现 1.概率 1.1 条件概率 定义:事件B发生的情况下,事件A发生的概率记作条件概率P(A|B) P(A|B)=P(A∧B)P(B) 条件概率也叫后验概率.无条件概率也叫先验概率(在没有不论什么其他信息存在的情况下关于命题的信度) 能够得到乘法规则: P(A∧B)

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

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

我理解的朴素贝叶斯模型

我理解的朴素贝叶斯模型 我想说:"任何事件都是条件概率."为什么呢?因为我认为,任何事件的发生都不是完全偶然的,它都会以其他事件的发生为基础.换句话说,条件概率就是在其他事件发生的基础上,某事件发生的概率. 条件概率是朴素贝叶斯模型的基础. 假设,你的xx公司正在面临着用户流失的压力.虽然,你能计算用户整体流失的概率(流失用户数/用户总数).但这个数字并没有多大意义,因为资源是有限的,利用这个数字你只能撒胡椒面似的把钱撒在所有用户上,显然不经济.你非常想根据用户的某种行为,精确地估计一

多种贝叶斯模型构建文本分类

多种贝叶斯模型构建及文本分类的实现 作者:白宁超 2015年9月29日11:10:02 摘要:当前数据挖掘技术使用最为广泛的莫过于文本挖掘领域,包括领域本体构建.短文本实体抽取以及代码的语义级构件方法研究.常用的数据挖掘功能包括分类.聚类.预测和关联四大模型.本文针对四大模型之一的分类进行讨论.分类算法包括回归.决策树.支持向量机.贝叶斯等,显然,不少涉及机器学习的知识(随后会写些机器学习专题).本文重点介绍贝叶斯分类,涉及朴素贝叶斯模型.二项独立模型.多项模型.混合模型等知识.在本人研究贝叶斯

我理解的朴素贝叶斯模型【转】

转自:http://www.cnblogs.com/nxld/p/6607943.html 我想说:"任何事件都是条件概率."为什么呢?因为我认为,任何事件的发生都不是完全偶然的,它都会以其他事件的发生为基础.换句话说,条件概率就是在其他事件发生的基础上,某事件发生的概率. 条件概率是朴素贝叶斯模型的基础. 假设,你的xx公司正在面临着用户流失的压力.虽然,你能计算用户整体流失的概率(流失用户数/用户总数).但这个数字并没有多大意义,因为资源是有限的,利用这个数字你只能撒胡椒面似的把钱