使用Python实现简单的搜索引擎,完整源码

这是博主我大学期间写的课程设计,希望能对看这篇博客的你有所帮助。

课程设计主要要求如下:

利用网络爬虫技术编写程序实现从互联网中动态爬去网页数据;

利用分词工具(如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交互,我们基本实现了搜索引擎的核心功能,建立了具有中文分词和关键词高亮显示功能的中文搜索引擎系统。总体来讲,该中文搜索引擎具有很好的可维护性和可扩展性,可以在此基础上开发适应不同业务需求的搜索引擎。

THE END
1.网页设计实例解析与实用技巧分享助你提升设计能力设计师交互设计我们将深入探讨网页设计的实例解析与实用技巧,帮助你提升设计能力。无论你是一个刚入门的设计师,还是希望进一步提升技能的老手,这里都有你所需要的知识。我们将从多个维度切入,分析成功网页设计的核心要素,并分享一些实用的技巧,帮助你在实际工作中更好地应用这些知识。 https://www.163.com/dy/article/JK3971R205569BV4.html
2.《数学之美》吴军读书笔记闵文斌在这样的系统设计之下,即使是一条非常短的句子,也需要一个长长的语法分析树来对句子进行分析。而对于不同的句子,需要有不同的语法分析方式,早期的语法分析规则全是由人工录入的。书中列出了对于文法分析规则中面对到的两个突出问题: 1.首先,要想通过文法规则覆盖哪怕20%的真实语句,文法规则的晒单至少也是几万条。https://www.cnblogs.com/maxmin26/p/5412936.html
3.海底世界教学反思针对刚升入三年级的学生形象感知强的特点,我设计的提问是让学生来找找海底有哪些声音,画出句子,读一读。在进行重要句式“有的……有的……”训练的时候,我引导学生联系生活,拓展练说,为连起来说积累说话素材,降低难度,同时也补充了省略号的空白。并从不同方面评价学生的说话,给予肯定和鼓励。https://www.qunzou.com/jiaoxue/fansi/1834194.html
4.《莫高窟》教学设计(通用20篇)教学设计是根据课程标准的要求和教学对象的特点,将教学诸要素有序安排,确定合适的教学方案的设想和计划。以下是小编帮大家整理的《莫高窟》教学设计,希望对大家有所帮助。 《莫高窟》教学设计 篇1 教学背景: 《莫高窟》一文结构清晰,叙述具体。课前调查发现,课文中所介绍的敦煌艺术与学生现有的知识基础差距比较大,因此https://www.ruiwen.com/jiaoxuesheji/4084799.html
5.《语文活动》教学设计15篇作为一名教师,往往需要进行教学设计编写工作,教学设计要遵循教学过程的基本规律,选择教学目标,以解决教什么的问题。那么大家知道规范的教学设计是怎么写的吗?下面是小编帮大家整理的《语文活动》教学设计,希望对大家有所帮助。 《语文活动》教学设计1 一、教学要求 https://www.yuwenmi.com/jiaoxuesheji/3860362.html
6.ChatGPT提示语(工作学习科技运营音乐)chatgpt提示词我想让你充当剽窃检查员。我会给你写句子,你只会用给定句子的语言在抄袭检查中未被发现的情况下回复,别无其他。不要在回复上写解释。我的第一句话是“为了让计算机像人类一样行动,语音识别系统必须能够处理非语言信息,例如说话者的情绪状态。” 作为求职信 https://blog.csdn.net/qq_26402269/article/details/137586396
7.关系抽取调研——工业界腾讯云开发者社区Sent-Track:从句子级别上根据给定句子预测给定人物实体对的关系 Bag-Track:从包级别上根据给定句子集合预测给定人物实体对的关系 数据来源 主要来源于互联网网页文本,其中验证集和测试集是通过人工进行标注的,而训练集是通过远程监督(Distant Supervision)自动生成的。 https://cloud.tencent.com/developer/article/1899623
8.基于javascript实现句子翻牌网页版小游戏javascript技巧这篇文章主要介绍了基于javascript实现句子翻牌网页版小游戏的相关资料,需要的朋友可以参考下GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!【 如果你想靠AI翻身,你先需要一个靠谱的工具!】 本文实例为大家分享了js实现句子翻牌网页版小游戏,供大家参考,具体内容如下 效果图: 实现思路: 考察打字能力和记忆能力https://www.jb51.net/article/81390.htm
9.99个互联网常用词汇,建议收藏“食用”Intellectual Property,各种创造发明、外观设计、文学和艺术作品,以及在商业中使用的标志、名称、图像,都https://developer.huawei.com/consumer/cn/forum/topic/41597829