目 录
摘 要 I
Abstract II
第 1 章 绪 论 1
1.1课题的研究背景和意义 1
1.1.1目前网站分类的研究情况 1
1.1.2现有解决方案的优点与不足 1
1.1.3基于特征熵值分析的网站分类系统的设计目标 2
1.2论文的研究内容与组织结构 2
1.2.1论文的研究内容 2
1.2.2论文的组织结构 3
第 2 章 系统模块组成介绍 4
2.1系统总体架构 4
2.2爬虫模块功能和技术 6
2.3网页处理模块功能和技术 6
2.4特征提取与文本表示模块功能和技术 7
2.5分类器模块功能和技术 7
2.6本章小结 7
第 3 章 爬虫模块和页面处理模块 9
3.1爬虫模块详细设计 9
3.2页面处理模块详细设计 10
3.2.1页面内容价值分析 10
3.2.2页面处理方法 11
3.2.3一种线性时间的正文提取算法 12
3.2.4页面处理关键流程图 13
3.3本章小结 14
第 4 章 特征提取与文本特征表示模块 15
4.1特征提取技术介绍 15
4.1.1传统的卡方检验方法(CHI) 15
4.1.2传统的卡方检验方法的缺陷分析 17
4.1.3一种改进的卡方检验方法 18
4.2文本特征表示介绍 18
4.2.1体现词在文档中权重的关键因素分析 19
4.2.2TF*IDF 方法 19
4.3本章小结 20
第 5 章 KNN 分类器模块 22
5.1传统 KNN 算法介绍 22
5.2传统 KNN 算法的缺陷 22
5.3在运行速度上改进 KNN 算法 23
5.3.1传统 KNN 算法运行速度低下的原因分析 23
5.3.2用 Rocchio 算法进行预选候选类 24
5.3.3根据文本的特征集与每类特征交集再次筛选候选类 25
5.3.4建立倒排索引 25
5.3.5引入位置向量表示法来降低高维向量计算量 26
5.3.6快速 KNN 算法的系统流程 27
5.4属性熵介绍 29
5.4.1熵的定义 29
5.4.2属性熵值的意义 29
5.5在分类精度上改进 KNN 算法 29
5.5.1传统 KNN 算法分类精度低的原因分析 29
5.5.2引入共有特征个数改进相似度计算公式 30
5.5.3引入属性熵值再次改进相似度计算公式 30
5.5.4引入类别平均相似度改进在 K 邻居中各类权重公式 32
5.5.5引入类别贡献度再次改进在 K 邻居中各类权重公式 32
5.5.6高精度 KNN 算法的关键流程 33
5.6本章小结 33
第 6 章 实验测试与评价 34
6.1分类标准和训练数据 34
6.2测试结果 35
6.3本章小结 36
结 论 37
参考文献 38
致 谢 41
1.1.3基于特征熵值分析的网站分类系统的设计目标
设计目标简而言之就是:设计一个高分类速度且高分类精度的网站分类器, 分类速度目标分类速度是毫秒级,目标分类精度是大于 80%。
本设计以实用为出发点对KNN 算法的缺陷产生原因进行分析并进行对算法的改进:在特征提取上引入了基于改进的 CHI 方法使得特征提取更加合理;在 KNN 分类器运行速度的改进方面引入了 Rocchio 算法的思想和一些其他简单的思路对分类器进行速度的提升,使得新的分类器的分类速度得到大幅度提升;在 KNN 分类器分类精度的改进方面,通过在相似度计算上引入了基于属性熵值的相似度改进和基于 KNN 类别加权的改进,使得改进的 KNN 算法又在分类精度上得到了大幅度提高。
在基于上述这些改进后,搭建出了一个真正具备高效、实用的网站分类系统, 分类响应速度达到了毫秒级,分类精度在 3578 个真实测试数据中达到了 85.047%。
1.2论文的研究内容与组织结构
1.2.1论文的研究内容
本文主要研究内容为:对 KNN 算法用于网站分类的各个步骤进行缺陷分析,

引入属性熵值的概念、Rocchio 算法思想以及一些其他策略,对分类中每个步骤进行全面改进和优化,最终建立一个有实用价值的网站分类系统。
1.2.2论文的组织结构
本文内容按照下面的结构进行组织安排:
第一章绪论介绍了研究课题的背景,给出了网站分类技术的发展情况与面临的问题,阐述了现有解决方案的优点与不足,明确了研究的内容与目标。
第二章介绍了系统设计的整体架构和技术需求,以及各个模块的详细功能、涉及技术。
第三章详细介绍了系统的前两个模块的实现:爬虫模块和页面处理模块。对于页面处理模块,介绍了一种线性时间复杂度的正文提取方法,并将其应用于本设计的页面处理模块。
第四章详细介绍了特征提取与文本特征表示模块的技术实现,包括对现有特征提取办法的缺陷分析和改进,以及文本特征表示方法的介绍。
第五章详细介绍了 KNN 分类器模块的实现。从传统 KNN 算法的缺陷入手, 分别从运行速度的改进上提出 4 种办法和分类精度的改进上提出了 4 种办法,并将这些办法组合成最终的新型改进 KNN 分类器。
第六章介绍了最终的新型改进 KNN 分类器在真实网站数据集上的实验结果, 并与传统方法对比,得出本文提出的新型改进 KNN 分类器更加快速和更加准确的结论。

#!/usr/bin/env python
#-*- encoding=utf-8 -*-
import re
import os
import wx
from copy import deepcopy
import UI_Module.filedialog as filedialog
import UI_Module.cfgdialog as cfgdialog
import UI_Module.tipsdialog as tipsdialog
import CSVop_Module.CSVstream as CSVstream
from DB_Module.DBop import DBOP
from Util import Util as myutilclass ProjectFrame(wx.Frame):"""docstring for ProjectFrame"""mesghead=['[INFO]:','[ERROR]:','[WARNNING]:']color=['GREEN','RED','BLUE']pattern=re.compile('((https?://)?[^\/\.]+\.[^\/]+)\w*')def __init__(self):super(ProjectFrame, self).__init__(None,-1,'网站智能识别系统',size=(530,410))panel=wx.Panel(self,-1)#panel.SetBackgroundColour('#FFFFCC')rev=wx.StaticText(panel,-1,'网站智能识别系统v0.1',pos=(183,8),size=(100,30),style=wx.ALIGN_CENTER)font=wx.Font(18,wx.DECORATIVE,wx.ITALIC,wx.NORMAL)rev.SetFont(font)author=wx.StaticText(panel,-1,'By:李琛轩',pos=(350,12),size=(100,30),style=wx.ALIGN_CENTER)font=wx.Font(14,wx.DECORATIVE,wx.ITALIC,wx.NORMAL)author.SetFont(font)author.SetForegroundColour('GRAY')self.textarea=wx.TextCtrl(panel,-1,'输入网站URL,一行一个',pos=(143,45),size=(350,320),style=wx.TE_MULTILINE|wx.TE_DONTWRAP|wx.TE_RICH2)self.textarea.SetInsertionPoint(0)f = wx.Font(3, wx.DECORATIVE, wx.ITALIC, wx.BOLD)logo=wx.Image('logo.jpg',wx.BITMAP_TYPE_ANY)logo=logo.Scale(30,28)bm=wx.StaticBitmap(panel,-1,wx.BitmapFromImage(logo),pos=(143,8))self.importbtn=wx.Button(panel,-1,'导入CSV',pos=(20,35),size=(80,30))self.Bind(wx.EVT_BUTTON,self.OnImportClick,self.importbtn)self.startbtn=wx.Button(panel,-1,'开始分析',pos=(20,95),size=(80,30))self.Bind(wx.EVT_BUTTON,self.OnStartClick,self.startbtn)self.statisbtn=wx.Button(panel,-1,'参数配置',pos=(20,155),size=(80,30))self.Bind(wx.EVT_BUTTON,self.OnConfigClick,self.statisbtn)self.statisbtn=wx.Button(panel,-1,'清空栏目',pos=(20,215),size=(80,30))self.Bind(wx.EVT_BUTTON,self.OnClearClick,self.statisbtn)self.outbtn=wx.Button(panel,-1,'导出结果',pos=(20,275),size=(80,30))self.Bind(wx.EVT_BUTTON,self.OnOutClick,self.outbtn)self.helpbtn=wx.Button(panel,-1,'使用帮助',pos=(20,335),size=(80,30))self.Bind(wx.EVT_BUTTON,self.OnHelpClick,self.helpbtn)self.result_set=[]def loadclassifier(self,dialog):import Spider_Module.startspider as startspiderdialog.Update(1)import PageExtract_Module.startextractor as startextractordialog.Update(7)import Classifier_Module.Filter as cfilterdialog.Update(8)import Classifier_Module.DistributekNN as knnclassifierdialog.Update(14)self.classifier=knnclassifier.main()self.classifier.next()dialog.Update(21)def OnStartClick(self,event):linesize=self.textarea.GetNumberOfLines()urls=[]for i in xrange(linesize):url=self.textarea.GetLineText(i)urls.append(url)self.textarea.Clear()urls=myutil.remove_duplicate(urls)self.process_programmer(urls)def display_result(self):if not self.result_set:returnself.textarea.Clear()self.textarea.SetDefaultStyle(wx.TextAttr('BLACK'))for web,cateno in self.result_set:self.WritetoFront('%s:%s' % (web,myutil.code2catename(cateno)))self.statis_result()def process_programmer(self,urls):self.result_set=[];domainurls=[]for url in urls:match=self.pattern.match(url)if match:url=match.group()domainurls.append(url)self.WritetoFront('目标 %d url : %s .' % (len(domainurls),url))else:self.WritetoFront(\'忽略%s,因为不是url...' % url,level=2)if not len(domainurls):self.WritetoFront('没有有效URL输入!',True,1)returnself.WritetoFront('开始下载网页...')#check if has existeddbapi=Nonetry:dbapi=DBOP()except:self.WritetoFront('无法连接数据库,请检查数据库设置!',True,1)returnunknown_urls,urls_known_cate=dbapi.domain(domainurls)noconnet_web=[]if unknown_urls:import Spider_Module.startspider as startspiderif not startspider.check_linked():self.WritetoFront('无法连接网络,请检查网络库设置!',True,1)returnimport PageExtract_Module.startextractor as startextractorimport Classifier_Module.Filter as cfilterimport Classifier_Module.DistributekNN as knnclassifieros.chdir('Spider_Module')(download_path,noconnet_web)=startspider.main(unknown_urls)self.WritetoFront('下载成功!')os.chdir('../')parser_results=startextractor.main(download_path)self.WritetoFront('页面处理成功!')classifier_inputs,unaccess_entity=cfilter.main(parser_results)self.WritetoFront('页面过滤成功!')#startspider.clear_download()for test_entry in classifier_inputs:result=self.classifier.send(test_entry)self.result_set.append(result)self.classifier.send(None)self.WritetoFront('分类结束!')inserts=deepcopy(self.result_set)self.result_set.extend(urls_known_cate)self.display_result()for web in noconnet_web:self.WritetoFront('%s无法连接!' % web)dbapi.insertres(inserts)dbapi.byebye()def OnConfigClick(self,evnet):cfgdialog.displaycfg()  def OnClearClick(self,event):self.textarea.SetDefaultStyle(wx.TextAttr('BLACK'))self.textarea.Clear()def OnOutClick(self,event):filepath=filedialog.display_filedialog()if not filepath:returnif filepath.endswith('.csv'):CSVstream.export2csv(filepath,self.result_set)self.WritetoFront('导出结果成功!')else:self.WritetoFront('not CSV file!')def OnImportClick(self,event):filepath=filedialog.display_filedialog()if not filepath:returnif not filepath.endswith('.csv'):tipsdialog.display_tips('注意导入的文件必须是CSV格式')returnsign,urls=CSVstream.importcsv(filepath)if sign:self.CSVtoBoard(urls)else:msg=urlsself.WritetoFront('%s' % msg,True,1)def WritetoFront(self,text,clear=False,level=0):self.textarea.SetDefaultStyle(wx.TextAttr(self.color[level]))if clear:self.textarea.Clear()self.textarea.AppendText('%s%s\n' % (self.mesghead[level],text))def CSVtoBoard(self,urls):self.textarea.SetDefaultStyle(wx.TextAttr('BLACK'))self.textarea.Clear()for url in urls:self.textarea.AppendText('%s\n' % url)def OnHelpClick(self,event):import ReadMe_Module.helppage as helppagehelppage.displayhelp()def statis_result(self):if not self.result_set:returnresults={};results_sum=len(self.result_set)for web,cateno in self.result_set:if cateno not in results:results[cateno]=0results[cateno]+=1splitline='*'*10self.textarea.AppendText('%s\n' % splitline)self.textarea.AppendText('共分析了%d个网址,其中:\n' % results_sum)for cateno in results:self.textarea.AppendText('%s:%d个\n' % (myutil.code2catename(cateno),results[cateno]))
def main():app=wx.PySimpleApp()frame=ProjectFrame()progressMax=21dialog=wx.ProgressDialog('网站智能识别系统', '加载配置...', progressMax,style=wx.PD_ELAPSED_TIME | wx.PD_REMAINING_TIME)frame.loadclassifier(dialog)dialog.Destroy()frame.Show()app.MainLoop()if __name__ == '__main__':main()




















基于Python Scrapy爬虫改进KNN算法的网站分类系统相关推荐

  1. Python编程实现用KNN算法对红酒分类功能

    一.任务要求 导入红酒数据集(load_wine),编写Python代码,完成以下任务: 1.实现计算平均酒精含量的功能: 2.实现对数据的标准化: 3.使用kNN算法实现红酒分类功能 二.代码实现 ...

  2. 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

    (一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...

  3. 基于Python+Open CV的手势识别算法设计

    素材资料下载: 基于Python+OpenCV的手势识别算法设计源代码材料-机器学习文档类资源-CSDN下载采用Python的集成开发环境Pycharm进行本次课程设计,在Pycharm中进行需要库( ...

  4. python多叉树遍历_基于Python的多叉树遍历算法

    [ 综直厘翹 S 赛理 ) 信息记录材料 2019 年 5 月第 20 卷第 5 期 基于 Python 的多叉树遍历算法 钱雨波 , 王金祥 ( 指导老师 ) ( 延边大学 吉林 延边 1 3300 ...

  5. windows下安装python scrapy爬虫环境

    windows下安装python scrapy爬虫环境 安装python 根据你的需求下载python安装包,安装python(本文基于python27)https://www.python.org/ ...

  6. Python Scrapy爬虫框架实战应用

    通过上一节<Python Scrapy爬虫框架详解>的学习,您已经对 Scrapy 框架有了一个初步的认识,比如它的组件构成,配置文件,以及工作流程.本节将通过一个的简单爬虫项目对 Scr ...

  7. Python Scrapy 爬虫 - 爬取多级别的页面

    Python Scrapy 爬虫 - 爬取多级别的页面 互联网中众多的 scrapy 教程模板,都是爬取 下一页 → \rightarrow →下一页形式的,很少有 父级 → \rightarrow ...

  8. Python Scrapy爬虫框架爬取51job职位信息并保存至数据库

    Python Scrapy爬虫框架爬取51job职位信息并保存至数据库 -------------------------------- 版权声明:本文为CSDN博主「杠精运动员」的原创文章,遵循CC ...

  9. Python Scrapy 爬虫框架爬取推特信息及数据持久化!整理了我三天!

    最近要做一个国内外新冠疫情的热点信息的收集系统,所以,需要爬取推特上的一些数据,然后做数据分类及情绪分析.作为一名合格的程序员,我们要有「拿来主义精神」,借助别人的轮子来实现自己的项目,而不是从头搭建 ...

最新文章

  1. PHP Memcached应用实现代码
  2. 求助:我有一辆机器人小车,怎么让它跑起来,还会避障、目标跟踪、路径规划?...
  3. IOS开发调用系统相机和打开闪光灯
  4. 带你从源码了解SpringBoot启动流程
  5. SAP UI5 DatePicker setDateValue(tempString)
  6. 使用Anaconda3安装pytorch、paddle环境并在pycharm里面进行环境测试
  7. Mellanox能给英伟达带来什么?
  8. java邮箱格式校验
  9. linux火狐插件目录,Firefox的插件目录在哪里?
  10. 人工智能基础-数学方法-数理统计
  11. 关于word不能存档解决办法
  12. 获取股票数据【使用JQData查询行情数据、财务指标、估值指标】
  13. 网站识别Windows AD 域账号,并自动登录
  14. 个人支付宝/微信/云闪付/商户聚合码/银行卡等到账通知常用技术方案总结
  15. python 删除excel空行_Java 删除 Excel 中的空白行和列
  16. JavaWeb-06 (项目案例3)
  17. AtCoder Grand Contest 004 A - Divide a Cuboid 题解
  18. 未激活的Windows11的壁纸更改方法(亲测有用)
  19. 2022软考高项十大管理知识领域论文骨架
  20. C++ 输出各种图形

热门文章

  1. 郎平卸任后首次接受采访,说出执教8年的最大感受
  2. android查ip地址,Android 查看IP地址
  3. 中图分类号——计算机软件类
  4. mysql修改初始密码....
  5. JAVA练习257-三维形体投影面积
  6. kube-proxy ipvs模式
  7. pandas数据分析读书笔记(三)
  8. 避坑,在Jetson nano安装编辑openpose
  9. 「Python条件结构」将两个数从小到大输出
  10. redis删除单个key和多个key