寒假老板给的任务,让我重现这个实验http://www.liuhaihua.cn/archives/15565.html。自己就随便试了下,用的都是比较经典(lao)的算法和知识,记录一下。

一、从网页上爬取POI数据

找了一圈,感觉这个网站比较靠谱:http://www.poi86.com,因为这里只需要POI标签,不需要其他类似地址啊什么的信息,所以这个网站足够用了。

爬网站使用的scrapy这个开源库,核心代码如下:

 import re
import json from scrapy.spider import BaseSpider class spider(BaseSpider):
name = "poi86"
allowed_domains = ["poi86.com"]
indexes = range(1,1000)
start_urls = []
for i in indexes:
url = 'http://www.poi86.com/poi/category/43/%s.html' % i
start_urls.append(url); def parse(self,response):
filename = response.url.split("/")[-1]
open(filename,'wb').write(response.body)

以上代码只做了“下载网页并保存”的工作,接下来的代码从每个网页中提取POI标签信息。

 import os
d = '/Users/sunshineatnoon/Documents/POI/train/'
article_number = [0,344,1143,1943,2572,3137]
names = ['finace','hotel','resturant','transport','amusment']
for i in range(1,len(article_number)):
begin = article_number[i-1]+1
all_shops = []
for k in range(begin,article_number[i]+1):
filename = str(k)+'.html';
file_object = open(d+filename)
all_text = file_object.read()
all_text_split = all_text.split('<table class="table table-bordered table-hover">')
names_split = all_text_split[1].split('title="">')
for j in range(1,len(names_split)):
shop_name_list = names_split[j].split('</a></td>')
all_shops.append(shop_name_list[0])
all_shops = list(set(all_shops))
output = open('/Users/sunshineatnoon/Documents/POI/preprocess/'+names[i-1],'w')
for item in all_shops:
output.write(item+'\n')
output.close()

最后的数据量大概是这样的:

类别

页面数量

POI标签数目

金融

344

9186

宾馆

799

37985

餐饮

800

37248

交通

629

22012

休闲娱乐

565

25737

总计

3137

132168

二、分词

下载到的POI标签信息,都是短文本,这里利用向量空间来表征这些短文本的特征。那么首先要进行分词,这里使用jieba分词,该工具有三种分词模式:精确模式,全模式,搜索引擎模式;这里使用的是精确模式。分词的核心代码如下:

 seg_list = jieba.cut(line,cut_all=False)
word_list = " ".join(seg_list)
word_list = word_list.split(" ")

分词完成后,选取词频大于等于5的词作为初步处理得到的字典。

三、 根据信息增益选取特征词

将POI信息中单词的信息增益值作为衡量单词对分类作用的大小,挑选出信息增益top10%(约1000个单词)的单词作为POI信息的特征。其中单词的信息增益计算公式如下:

其中上式中第一项为训练数据集中原始信息熵,对于所有的单词是相同的,所以这里只计算上式中后两项之和,即根据t分类后数据的信息熵,然后根据从小到大的顺序选取1000个单词作为特征词。

熵值排名前20的单词如下所示:百货店,宾馆,停车场,支行,酒店,加油站,中国,银行,网吧,邮政储蓄,中国农业银行,KTV,所,会,分理处,网络,客运站,旅馆,财产保险,公寓;可以看出上述大部分单词都是以上五个类别(金融,交通,休闲娱乐,宾馆,餐饮)的典型代表词。

四、多项式朴素贝叶斯模型

上述特征词形成了一组“特征”,根据这组特征词,可以将一个POI信息表示为0-1向量,该向量作为POI信息的向量空间表示,输入到朴素贝叶斯模型进行分类。后续实验中利用weka中得朴素贝叶斯模型,所以这里将向量整理为weka输入格式,如下所示:

@RELATION POI
@ATTRIBUTE 1 NUMERIC
@ATTRIBUTE 2 NUMERIC
……
@ATTRIBUTE 1006 NUMERIC
@ATTRIBUTE class {1,2,3,4,5}
@DATA
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
……

其中最后的1表示该样本属于第一类,即finance类.

这里借助weka分类工具,训练多项式朴素贝叶斯分类模型,并通过十折交叉验证得到模型准确率。结果如下:

模型准确率为88.6%。

参考资料:

【1】http://www.liuhaihua.cn/archives/15565.html

【2】http://www.cnblogs.com/wentingtu/archive/2012/03/24/2416235.html

【3】http://scrapy.org

【4】http://www.cs.waikato.ac.nz/~ml/weka/

【Tech】POI标签分类的更多相关文章

  1. scikit-learn一般实例之八:多标签分类

    本例模拟一个多标签文档分类问题.数据集基于下面的处理随机生成: 选取标签的数目:泊松(n~Poisson,n_labels) n次,选取类别C:多项式(c~Multinomial,theta) 选取文 ...

  2. CSS.02 -- 样式表 及标签分类(块、行、行内块元素)、CSS三大特性、背景属性

    样式表书写位置  内嵌式写法 <head> <style type="text/css"> 样式表写法 </style> </head&g ...

  3. html(常用标签,标签分类),页面模板, CSS(css的三种引入方式),三种引入方式优先级

    HTML 标记语言为非编程语言负责完成页面的结构 组成: 标签:被<>包裹的由字母开头,可以结合合法字符( -|数字 ),能被浏览器解析的特殊符号,标签有头有尾 指令:被<>包 ...

  4. Python-HTML 最强标签分类

    编程: 使用(展示)数据 存储数据 处理数据 前端 1. 前端是做什么的? 2. 我们为什么要学前端? 3. 前端都有哪些内容? 1. HTML 2. CSS 3. JavaScript 4.jQue ...

  5. 前端 HTML 标签分类

    三种: 1.块级标签: 独占一行,可设置宽度,高度.如果设置了宽度和高度,则就是当前的宽高.如果宽度和高度没有设置,宽度是父盒子的宽度,高度根据内容填充. 2.行内标签:在一行内显示,不能设置宽度,高 ...

  6. htm基础知识,css的链入以及标签分类。

    <!DocTYPE>  DOC--Document 文档  TYPE  类型  文档类型 告诉浏览器这是什么文件 单标签: meta  设置   charset  设置编码 双标签: 开始 ...

  7. 如何用softmax和sigmoid来做多分类和多标签分类

    首先,说下多类分类和多标签分类的区别 多标签分类:一个样本可以属于多个类别(或标签),不同类之间是有关联的,比如一个文本被被划分成“人物”和“体育人物”两个标签.很显然这两个标签不是互斥的,而是有关联 ...

  8. 前端入门html(常用标签及标签分类)

    day47 参考:https://www.cnblogs.com/liwenzhou/p/7988087.html 任何标签都有有三个属性:ID,class.style <!DOCTYPE ht ...

  9. 使用 scikit-learn 实现多类别及多标签分类算法

    多标签分类格式 对于多标签分类问题而言,一个样本可能同时属于多个类别.如一个新闻属于多个话题.这种情况下,因变量yy需要使用一个矩阵表达出来. 而多类别分类指的是y的可能取值大于2,但是y所属类别是唯 ...

随机推荐

  1. tomcat设置web根目录

  2. 安装nextant

    1. 安装java sudo apt-get install default-jre 然后用下面语句试试 java -version 2. 下载和解压solr,去https://lucene.apac ...

  3. 面试题:谈谈你对hibernate的理解

    说说这类问题一般要和一个东西比較.说说他们的长处和缺点,hibernate就和JDBC比較呗.你就说说JDBC的优缺点.然后说说hibernate的优缺点,最后对照得出hibernate更好. hib ...

  4. ionic2常见问题-启动后白屏问题

    问题描述 app启动后大概有几秒白屏,才会显示首页,如下gif图 启动有白屏.gif 解决方法1 请查看以下3张图的标注 图 1-最初config.xml配置 图 2-更改后的splash配置 图 3 ...

  5. poj 3189(枚举+多重匹配)

    题目链接:http://poj.org/problem?id=3189 思路:由于题目要求最小的差值,而Range最多也才20,因此我们可以枚举上下限,多重匹配验证即可. http://paste.u ...

  6. gcc 编译 连接 生成可执行文件

    gcc c语言编译器 g++ c++编译器 gcc a.c  生成默认的a.out 可执行文件  ./a.out  来执行 gcc -c a.c 编译生成 a.o 目标文件 可以检查语法错误 gcc ...

  7. python time与datetime.date/datetime模块

    https://docs.python.org/3/library/datetime.html 1.用于日期比较大小的方法 方法名 方法说明 用法 __eq__(…) 等于(x==y) x.__eq_ ...

  8. codevs1068 乌龟棋==洛谷P1541 乌龟棋

    P1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家 ...

  9. jquery lazyload延迟加载技术的实现原理分析_jquery

    前言 懒加载技术(简称lazyload)并不是新技术,它是js程序员对网页性能优化的一种方案.lazyload的核心是按需加载.在大型网站中都有lazyload的身影,例如谷歌的图片搜索页,迅雷首页, ...

  10. 批量索引以提高索引速度 -d --data-binary

    index create update 第1.2行分别为:信息行.数据行,在索引中增加或更换文档delete 移除文档,只包含信息行 Bulk API | Elasticsearch Referenc ...