【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+'\n') 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了