zoukankan      html  css  js  c++  java
  • 【Tech】POI标签分类

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

    一、从网页上爬取POI数据

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

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

     1 import re
     2 import json
     3 
     4 from scrapy.spider import BaseSpider
     5 
     6 class spider(BaseSpider):
     7     name = "poi86"
     8     allowed_domains = ["poi86.com"]
     9     indexes = range(1,1000)
    10     start_urls = []
    11     for i in indexes:
    12         url = 'http://www.poi86.com/poi/category/43/%s.html' % i
    13         start_urls.append(url);
    14 
    15     def parse(self,response):
    16         filename = response.url.split("/")[-1]
    17         open(filename,'wb').write(response.body)

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

     1 import os
     2 d = '/Users/sunshineatnoon/Documents/POI/train/'
     3 article_number = [0,344,1143,1943,2572,3137]
     4 names = ['finace','hotel','resturant','transport','amusment']
     5 for i in range(1,len(article_number)):
     6     begin = article_number[i-1]+1
     7     all_shops = []
     8     for k in range(begin,article_number[i]+1):
     9         filename = str(k)+'.html';
    10         file_object = open(d+filename)
    11         all_text = file_object.read()
    12         all_text_split = all_text.split('<table class="table table-bordered table-hover">')
    13         names_split = all_text_split[1].split('title="">')
    14         for j in range(1,len(names_split)):
    15             shop_name_list = names_split[j].split('</a></td>')
    16             all_shops.append(shop_name_list[0])
    17     all_shops = list(set(all_shops))
    18     output = open('/Users/sunshineatnoon/Documents/POI/preprocess/'+names[i-1],'w')
    19     for item in all_shops:
    20         output.write(item+'
    ')
    21     output.close()

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

    类别

    页面数量

    POI标签数目

    金融

    344

    9186

    宾馆

    799

    37985

    餐饮

    800

    37248

    交通

    629

    22012

    休闲娱乐

    565

    25737

    总计

    3137

    132168

    二、分词

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

    1 seg_list = jieba.cut(line,cut_all=False)
    2 word_list = " ".join(seg_list)
    3 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/

  • 相关阅读:
    Anaconda 换国内源、删源最全集锦(转载)
    【2019】安装anaconda及环境变量的配置(安装第三方库测试)(转载)
    python 中 urlparse 模块介绍
    正则表达式之前瞻后顾
    indows下如何安装python第三方库lxml
    Ubuntu下开启SSH服务 vs:18
    Linux终端访问网页
    关于ubuntu无线网络配置
    SQL语句报错,无法绑定由多个部分组成的标识符解决
    "@P0"附近有语法错误解释及定位修复
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/4308771.html
Copyright © 2011-2022 走看看