1.目的

在公司实习,分别从国内国外两个网站爬取了一些展会数据,在数据处理上目前需要将其按照各个类别分类好,并提供对应展会地址的经纬度。

国内数据如下:

01.png

国内数据比较少,占四百多条,在类别上来看有所属行业这一列,所以比较好处理。

国外数据就有些尴尬:

02.png

国外网站展会数据将近五万多条,跟分类有关的只有categories这一列数据,都是一些标签词,还偏少。

现在需要将五万多条展会数据进行分类,如何解决这个问题,我觉得可以写个朴素贝叶斯分类器。

2.数据

朴素贝叶斯分类器是利用样本数据来进行训练的,每个样本必须含有一组特征词以及对应的分类。

2.1.数据的准备

获取的国内数据就很适合作为训练数据,可以将其处理成如下格式作为样本输入:

03.png

训练数据主要是这两列,所属行业以及展会范围,每一行的类别都有其对应的展会范围,将这些作为训练数据实在再好不过,我们将其称之为训练集。

那么相对应,国外待分类的展会数据便是测试集。

我们将利用训练好的分类器,将测试集一一输入,看看能否得到期望的输出结果。

可是现在有个问题,作为训练集的国内数据只有四百多条,实在太少,于是我只能再去那个国内展会网站将以前的展会数据尽量爬取下来,最终训练集达到了39555条,虽说数量还是不够,但是不试试最终分类器的分类结果,说不定准确率还可以呢?

2.2.分词&&提取

不积小流,无以成江海,以小见大,咱们看这样一条数据:所属行业:建材五金

展会范围:各类卫生洁具、浴室家具和配件、面盆、马桶、淋浴房、浴缸、花洒、水龙头及配件、浴室照明、镜子、五金挂件等

思考一下,这一条数据的所属行业和展会范围有什么关系,我们将从这里得到编写分类器的出发点。

在这条数据中,展会范围的内容是具有一定的代表性的,其代表这条数据的描述很偏向建材五金这个行业。

那我么是不是可以提炼出这个描述的关键词,从而让这个关键词代表建材五金这个行业。# 可以利用结巴分词import jieba.analyse

con = "各类卫生洁具、浴室家具和配件、面盆、马桶、淋浴房、浴缸、花洒、水龙头及配件、浴室照明、镜子、五金挂件等"feature = jieba.analyse.extract_tags(con, 8)

print(feature)# output:['配件', '各类', '家具', '五金', '照明', '浴室', '淋浴房', '浴缸']

那么刚刚那条数据可以这样看:# data_01所属行业:建材五金

描述关键词:'配件', '各类', '家具', '五金', '照明', '浴室', '淋浴房', '浴缸'

以此类推,如果一条未分类数据的关键词也是这样,那是不是可以将该数据归为建材五金这个类别,是的,你可以这么干。

但有个问题,若该未分类数据的关键词只含有以上关键词的某个,比如:# data_02所属行业:未知

描述关键词:'配件','家具'

这样子若分为建材五金不大对吧,我倒觉得应该分为房产家居,这个问题可以解决,就让我们的概率出场吧。

大三的时候学过概率统计,也记得一个公式名为贝叶斯定理。

04.jpg

这表示计算条件概率的公式:

P(A\B) = P(B\A)*P(A)/P(B) == 后验概率 = 先验概率 x 调整因子# 这样写会不会更加清晰P(category\keywords) = P(category) * P(keywords\category)/ P(keywords)## 朴素贝叶斯便是假设即将被组合的各个概率是独立的,可以理解成keyword1出现在category1的概率和keyword2出现在category1的概率是没有关系的,是独立的。P(category\keywords) = P(category) * P(keyword1\category)P(keyword2\category)...P(keywordn\category)/ P(keywords)

总结就是,我们先求出样本空间中每个分类的概率P(category)——先验概率

再求出一组待分类数据的关键词在各个类别中的概率P(keywords\category)——调整因子

最后先验概率 *  调整因子得出后验概率,再经过比较,后验概率最大的,便是待分类数据最可能的类别。

我们的准备很充足了,但在写分类器之前,还是先将下面要用到的数据提前提取出来。

2.2.1.确定训练数据有多少类别

2.2.2.训练数据的关键词集合,为了方便后续计算,将其转为id:word的格式存为id_word.txt

05.png

2.2.3.计算出每个关键词在每个不同类别出现的概率,将其转为category=id:pro(id)的格式存为tf_id_word.txt

06.png

2.2.4.求出样本空间中每个分类的概率P(category)——先验概率,将其转为category:pro(category)的格式存为type_pro.txt

07.png

3.编码

经过前面的步骤,现在编写代码实在简单,不过有两点要注意。

其一是关键词并不是在每个类别都会出现,这样会导致P(keyword\category) = 0,进而导致整个后验概率为0,为了解决这个问题,可以引入拉普拉斯平滑,这样便确保不会出现为0的情况,具体代码中有介绍。

其二是若每个调整因子的数值都很小,大家都知道很小的值相乘,会导致结果变得更小,这样子表现出各个分类结果的后验概率便会出现问题,这个问题便是下溢出问题,解决办法便是将其转化为对数,对数相乘便是对数相加,这样便很巧妙的解决了这个问题。

好了,直接上代码,让我们看看分类的结果吧。# -*-coding:utf-8-*-__author__ = 'howie'import jieba.analyseimport pandas as pdimport mathclass Pridict(object):

"""

利用txt/中数据进行朴素贝叶斯算法训练

"""

def __init__(self):

# 初始化结果字典

self.resultData = {}    def getKeyword(self, path):

"""

通过结巴分词进行关键词提取

:param path: 待分词文件路径 相关参数可更改 也可不调用直接写

:return: keywordDic = {index:['word1','word2'...]}

"""

keywordDic = {}

df = pd.read_csv(path)        for des in df.values:

jieba.analyse.set_idf_path('txt/type_dict.txt')

feature = jieba.analyse.extract_tags(des[15], 8)

keywordDic[des[16]] = feature        return keywordDic    def idDic(self, keywordDic):

"""

将每条待分类关键词替换成对应的单词向量

:param keywordDic:格式 keywordDic = {index:['word1','word2'...]}

:return: keywordDic = {'1': ['12198', '16311', '6253', '8302']}

"""

with open('txt/id_word.txt', 'r', encoding='utf8') as of:

lines = of.read().split('\n')        for key, values in keywordDic.items():

id_word = []            for eachValue in values:

id_word += [eachLine.split(':')[0] for eachLine in lines if eachValue == eachLine.split(':')[-1]]

keywordDic[key] = id_word        return keywordDic    def calPro(self, keywordDic):

"""

计算每一组待分类数据关键词对应概率总和

:param keywordDic:格式 keywordDic = {'1': ['12198', '16311', '6253', '8302']}

:return: result = {'1': {'type1': -33.23204707236557, 'type3': -31.376043125934267, 'type3': -27.385192803356617...}

"""

result = {}        # print(keywordDic)

# 获取每个类别关键词出现概率

with open('txt/tf_id_word.txt', 'r', encoding='utf8') as of:

lines = of.read().split('\n')[0:-1]        # 循环待分类数据

for key, values in keywordDic.items():

result[key] = {}            # 读取分类概率文件中读取每行数据

for eachLine in lines:

valLen = len(values)

valPro = list(map(lambda x: '', [x for x in range(0, valLen)]))

laplace = ''

# 分类名称 该分类下关键词概率

lineData = eachLine.split("=")                # 该分类下每个关键词概率

eachLineData = lineData[-1].split("#")                # 循环每个待分类字典的关键字向量

for index,eachValue in enumerate(values):                    # 每个关键词对应的词向量以及词概率 得到所有关键词该分类下的概率列表

resPro = [eachPro.split(':')[1] for eachPro in eachLineData if eachValue == eachPro.split(':')[0]]                    # 防止待分类关键词概率为0,添加拉普拉斯平滑

laplace = str(1 / (valLen + len(eachLineData)))

valPro[index] = (resPro[0] if resPro else laplace)

valPrlLen = int(valLen / 2)                # 处理关键词为空 增加限制条件,排除小概率分类影响后验概率大小

if valPro:                    if valPro.count(laplace) <= valPrlLen:                        # 防止下溢出转化为对数相加

typePro = sum([math.log(float(x)) for x in valPro])

result[key][lineData[0]] = typePro                else:                    # 将该待分类数据标记为None

result[key] = None

return result    def resPro(self, result):

"""

为各个分类乘上先验概率 提高分类成功率

:param result: 格式 result = {'1': {'type1': -33.23204707236557, 'type3': -31.376043125934267, 'type3': -27.385192803356617...}

:return: resultData = {'1': {'type': -28.135469210164924}}

"""

for eachKey, eachVal in result.items():            # 初始化每个待分类数据字典 储存最可能分类的概率

self.resultData[eachKey] = {}            # 初始化最终分类结果概率

allPro = {}            if eachVal:                # print(eachVal)

with open('txt/type_pro.txt', 'r', encoding='utf8') as of:

lines = of.read().split('\n')                for line in lines:

lineData = line.split(':')                    # 乘上该分类概率 即先验概率

allPro = dict(allPro,**{key:(value + math.log(float(lineData[1]))) for key, value in eachVal.items() if key == lineData[0]})                    # 返回各个分类对应后验概率最大值

largest = max(zip(allPro.values(),allPro.keys()))

self.resultData[eachKey][largest[1]] = largest[0]            else:                # 无法分类

self.resultData[eachKey] = {'failed': None}        return self.resultDatadef mainPri(keywordDic):

pri = Pridict()

dic = pri.idDic(keywordDic)

result = pri.calPro(dic)

resultData = pri.resPro(result)    return resultData

初步写好分类器,其实这才是任务的开始,分类器的最重要的是第二部分的数据提取,接下来需要通过不断地训练,让数据变得更加优雅美丽,从而让分类器的结果趋于完美,本人苦逼地调了一个星期,现在也就勉强能用。

让我们看看分类器的分类效果:

08.png

可以看到分类器给出的参考分类很有代表性,这一段就此结束,若有错误,敬请指出,谢谢。

作者:howie6879

链接:https://www.jianshu.com/p/f5202892bc9d

python朴素贝叶斯分布对数据的要求_python之朴素贝叶斯对展会数据分类相关推荐

  1. python中print又可将数据写入文件_Python第五课-将写入文件的列表格式化

    1.上节课代码中的问题 第四课中介绍了python持久化的基础实例--将数据写入文本文件. 可当我们试着把保存数据的文件读取出来会怎样呢? try: with open('man.txt', 'r') ...

  2. python朴素贝叶斯分布对数据的要求_统计学习方法与Python实现(三)——朴素贝叶斯法...

    统计学习方法与Python实现(三)--朴素贝叶斯法 1.定义 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率分布.然 ...

  3. python绘制折线图先对数据进行处理_python气象数据分析并绘制折线图-女性时尚流行美容健康娱乐mv-ida网...

    女性时尚流行美容健康娱乐mv-ida网 mvida时尚娱乐网 首页 美容 护肤 化妆技巧 发型 服饰 健康 情感 美体 美食 娱乐 明星八卦 首页 > 高级搜索 excel 2010巧妙处理 折 ...

  4. python中print又可将数据写入文件_Python 通过print_lol将数据保存到文件中

    1. 定义一个print_lol函数来控制列表的缩进和写入位置 import sys """this is a new fuction, which work for a ...

  5. python爬取appstore的评论数据的步骤_python数据抓取分析

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  6. python第七章文件和数据格式化选择题_python第七章-文件和数据格式化

    1.文本文件 vs 二进制文件#文本形式打开文件 tf = open("f.txt", "rt") print(tf.readline()) tf.close( ...

  7. 自编程实现朴素贝叶斯算法,Navie Bayes程序(python),并对鸢尾花数据进行分类。

    自编程实现朴素贝叶斯算法,Navie Bayes程序(python),并对鸢尾花数据进行分类. 目录 自编程实现朴素贝叶斯算法,Navie Bayes程序(python),并对鸢尾花数据进行分类. 朴 ...

  8. Python 数据科学手册 5.5 朴素贝叶斯分类

    5.5 朴素贝叶斯分类 原文:In Depth: Naive Bayes Classification 译者:飞龙 协议:CC BY-NC-SA 4.0 译文没有得到原作者授权,不保证与原文的意思严格 ...

  9. python代码设置超参数_超参数调优总结,贝叶斯优化Python代码示例

    本文介绍超参数(hyperparameter)的调优方法. 神经网络模型的参数可以分为两类,模型参数,在训练中通过梯度下降算法更新: 超参数,在训练中一般是固定数值或者以预设规则变化,比如批大小(ba ...

最新文章

  1. OSI第六层:表示层功能作用
  2. Oracle 10g R2 RAC手动打补丁PSU(10.2.0.5.19)
  3. 上海巨人网络参与网络诈骗整个流程
  4. 约瑟夫环java链表_java使用链表实现约瑟夫环
  5. Windows Server 2012改造成Windows8的方法(转载)
  6. 我国的省级行政区中,哪些邻省最多,哪些最少?
  7. 微信服务号使用微信支付
  8. [Win] 免登录百度网盘高速下载器 ENFI下载器 v1.3.1
  9. Java动态修改注解的属性值
  10. Exif文件格式描述(转载)
  11. 【Rust日报】 2019-03-12
  12. js josn prase
  13. 松贷后房价涨跌内幕 吃透楼市12个规律不吃亏
  14. C语言---集合---合取-析取-异或-条件语句-双条件语句
  15. 89岁,他拿下人生第三个博士学位
  16. 滴滴打车创新盈利方式
  17. vue实现倒计时定时器
  18. QPSK调制解调和误码率
  19. PPPcloud云主机免费送!
  20. mysql 时间按季度分类_mysql 按时间段统计(年,季度,月,天,时)

热门文章

  1. 客户下单服务器代码实现之实现后台系统自动分单
  2. 批量向数据库多张表导入数据的实现
  3. “阿拉丁”、“凤巢”以及热门的“移动搜索”成为重点,今年,将推动市场占有率第一的百度继续变革
  4. DM5 java实现
  5. 阿里程序员相亲被拒;用Python做直播竞答外挂|一周业界事
  6. 按采购单收货反冲后找不到采购单
  7. 科技圈2020十大并购:罗永浩直播公司卖身翻车 TikTok生死成谜
  8. MongoDB、Hbase、Redis等NoSQL优劣势、应用场景
  9. lt;meta http-equiv=Content-Type content=text/html; charset=utf-8 /gt;
  10. 宁波大学计算机硕士就业薪水,宁波大学|计算机技术在职研究生|就业前景|宁波大学计算机技术在职研究生就业前景如何_宁波大学在职研究生 - 在职研究生教育信息网...