这是博主我大学期间写的课程设计,希望能对看这篇博客的你有所帮助。
课程设计主要要求如下:
利用网络爬虫技术编写程序实现从互联网中动态爬去网页数据;
利用分词工具(如ICTCLAS、结巴分词等)实现对爬取的文本进行分词,并建立倒排索引;
利用向量空间模型对分词后的文本及查询文本进行向量化表示,并计算查询向量和文档向量之间的相似性;
目录
一、系统概述
1.1搜索引擎概述
1.2本搜索引擎概述
二、系统需求分析
2.1云南旅游业分析
2.2系统可行性分析
三、算法原理及程序实现
3.1系统架构设计
3.2网络爬虫
3.2.1网络爬虫简介
3.2.2网页分析
3.3结巴分词并建立索引
3.3.1结巴分词简介
3.3.2倒排索引原理
3.3.3程序实现
3.4向量空间模型
3.4.1向量空间模型原理
3.4.2代码实现原理
3.5BM25算法
3.5.1BM25算法原理
3.5.2代码实现
3.6网页实现框架:Flask及后台处理
3.6.1Flask简介
3.6.2代码实现
3.7web界面设计
3.7.1HTML简介
3.7.2网页界面
四、程序展示
五、总结与体会
六、参考文献
七、附录
摘要
关键词:搜索引擎;信息检索;网络爬虫;向量空间模型;网页排序
2.1旅游业分析
搜索引擎能自动从英特网搜集信息,经过一定整理以后,提供给用户进行查询的系统。英特网上的信息浩瀚万千,而且毫无秩序,所有的信息象汪洋上的一个个小岛,网页链接是这些小岛之间纵横交错的桥梁,而搜索引擎,则为你绘制一幅一目了然的信息地图,供你随时查阅。
随着我国经济的发展,旅游成了人们新的消费需求。在旅游业快速发展的同时,人们对旅游的附加产品的需求也越来越大。
查阅资料我们能知道这些数据,云南省2018年上半年累计接待海外游客362.83万人次,比去年同期增长8.23%;接待国内游客33596.97万人次,比去年同期增长27.18%;实现旅游业总收入4201.35亿元,比去年同期增长26.78%。
各州市紧紧围绕旅游强省目标任务进行旅游市场及产业建设,实现旅游接待量和旅游收入双增长。在目前公开的数据中,客接待量全省前三位的州市分别为红河(3116.47万人次)、大理(2448.56万人次)、楚雄(2354.72万人次);旅游收入全省前三位的州市分别为大理(377.19亿元)、红河(332.67亿元)、保山(332亿元)。
2.1对现有系统的分析
2.2对建议技术的可行性分析
2.2.1技术上的可行性
此次系统开发使用Python语言,该语言简单易学,又增强了可视化、数据库及Internet编程功能,很容易就可以进行系统开发。因此系统开发工具可以采用Python进行开发。而对IDE,采用JetBrainsPyCharm。该软件简单易懂,应用广泛,比较适合新手上路使用。
2.2.2管理上的可行性
因为系统主要应用于出门来云南旅游的人士,后期爬虫数据处理量增多搜索结果更多更准确后,可以考虑部署到服务器上,让更多人使用。
2.3社会因素的分析
随着科学技术的不断提高,计算机科学日渐成熟,大数据时代,信息需求越来越大。爬取公共数据,该软件的开发不会侵犯国家、集体和他人的利益。
网络爬虫是捜索引擎抓取系统的重要组成部分。爬虫的主要目的是将互联网上的网页下载到本地形成一个或联网内容的镜像备份。
一个通用的网络爬虫的框架如图所示:
网络爬虫的基本工作流程如下:
1.首先选取一部分精心挑选的种子URL;
2.将这些URL放入待抓取URL队列;
3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。
4.分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。
(1)分析要爬取的网页的代码,确定我们所需要的内容并用XPATH表达式定位其内容,用正则表达式筛选我们需要的内容,将编号,title,url,写入本地,存入docs.txt中。
3.3结巴分词并建立索引
jieba是一个基于Python的中文分词工具对于一长段文字,其分词原理大体可分为三步:
1.首先用正则表达式将中文段落粗略的分成一个个句子。
2.将每个句子构造成有向无环图,之后寻找最佳切分方案。
3.最后对于连续的单字,采用HMM模型将其再次划分。
jieba分词分为“默认模式”(cut_all=False),“全模式”(cut_all=True)以及搜索引擎模式。对于“默认模式”,又可以选择是否使用HMM模型(HMM=True,HMM=False)。
倒排索引(英语:Invertedindex),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。
倒排索引有两种不同的反向索引形式:
一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表。
一个单词的水平反向索引(完全反向索引)又包含每个单词在一个文档中的位置。
2.建立索引库关键代码
3.4向量空间模型
向量空间模型(vectorspacemodel)概念简单,把对文本内容的处理简化为向量空间中的向量运算,并且它以空间上的相似度表达语义的相似度,直观易懂。当文档被表示为文档空间的向量,就可以通过计算向量之间的相似性来度量文档间的相似性。文本处理中最常用的相似性度量方式是余弦距离。
搜索引擎需要计算“用户查询”和爬下来的众多”网页“之间的相似度,从而把最相似的排在最前返回给用户。
代码主要使用的算法是tf-idf
tf:termfrequency词频
idf:inversedocumentfrequency倒文档频率
第一步:把每个网页文本分词,成为词包(bagofwords)。
第三步:统计网页(文档)总数M。
第三步:统计第一个网页词数N,计算第一个网页第一个词在该网页中出现的次数n,再找出该词在所有文档中出现的次数m。则该词的tf-idf为:n/N*1/(m/M)(还有其它的归一化公式,这里是最基本最直观的公式)
第四步:重复第三步,计算出一个网页所有词的tf-idf值。
第五步:重复第四步,计算出所有网页每个词的tf-idf值。
3.5BM25算法
这个算法不关心词语是名词还是动词,也不关心词语的意义。它唯一关心的是哪些是常用词,那些是稀有词。如果一个搜索语句中包括常用词和稀有词,最好让包含稀有词的文档的评分高一些,同时降低常用词的权重。
(1)对搜索词进行结巴分词;
term_list=[]query=query.split()forentryinquery:#分词term_list.extend(jieba.cut_for_search(entry))
#TFIDF=tfidftf_idf={}forterminterm_list:ifterminself.index.inverted:fordoc_id,freinself.index.inverted[term].items():ifdoc_idintf_idf:tf_idf[doc_id]+=(1+math.log10(fre))*self.index.idf[term]else:tf_idf[doc_id]=(1+math.log10(fre))*self.index.idf[term]
(4)计算搜索词与爬取文档的匹配度,然后将文档排序:
3.6网页实现框架:Flask及后台处理
3.7web界面设计
超文本标记语言(标准通用标记语言下的一个应用,外语缩写HTML),是迄今为止网络上应用最为广泛的语言,也是构成网页文档的主要语言。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字、图形、动画、声音、表格、链接等。HTML的结构包括头部(Head)、主体(Body)两大部分,其中头部描述浏览器所需的信息,而主体则包含所要说明的具体内容。
(1)主页显示输入框和搜索按钮,提交搜索内容。调用百度的界面css,能保存搜索历史记录。
关键代码:
index.html
(2)副页查询:search.html
四、程序展示
4.1搜索页主界面:index.html
4.2搜索结果页,搜索词能在结果中高亮显示:
4.3页面跳转:
4.4无结果
五、总结与体会(开始了万年不变的套路模式。。。)
我们身处在一个信息时代,可以通过很多途径接触到关于生活、学习等各方面的知识,但是如何在浩渺的信息海洋里快速而准确地找到我们所需要的东西呢,这成为很多人面临的重要的问题,所以学习信息检索和搜索引擎技术就显得尤为重要了。
没学习网络信息检索之前,我们总觉得只要有搜索引擎就可以搜到我们需要的东西,但是面对庞杂的信息,我们往往会不知所措,因为当我们输入想要查询的内容后,网络上会出现成百上千个结果,然而这些结果可能没有一个是我们需要的,因此学习使用搜索引擎的原理和实现方法及查询技巧是非常必要的。
通过建立索引库,搜索查询服务器,以及Web交互,我们基本实现了搜索引擎的核心功能,建立了具有中文分词和关键词高亮显示功能的中文搜索引擎系统。总体来讲,该中文搜索引擎具有很好的可维护性和可扩展性,可以在此基础上开发适应不同业务需求的搜索引擎。