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/

  • 相关阅读:
    CF 142B Tprimes
    CF 231A Team
    poj 2001 Shortest Prefixes ——字典树入门
    hdu 1039 Easier Done Than Said?
    poj 2528 Mayor's posters
    hdu 1061 Rightmost Digit
    poj 2503 Babelfish
    CF271 A. Beautiful Year
    poj 2752
    CF271 B. Prime Matrix
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/4308771.html
Copyright © 2011-2022 走看看