
文章目录0 简介1 课题简介2 系统设计实现2.1 总体设计2.2 搜索关键流程2.3 推荐算法2.4 数据流的实现3 实现细节3.1 系统架构3.2 爬取大量网页数据3.3 中文分词3.4 相关度排序第1个排名算法根据单词位置进行评分的函数第2个排名算法根据单词频度进行评价的函数第3个排名算法根据单词距离进行评价的函数最后0 简介今天学长向大家分享一个毕业设计项目毕业设计 基于python的搜索引擎设计与实现项目运行效果毕业设计 基于python的搜索引擎项目分享见主页任意置顶文章1 课题简介随着互联网和宽带上网的普及 搜索引擎在中国异军突起 并日益渗透到人们的日常生活中 在互联网普及之前 人们查阅资料首先想到的是拥有大量书籍的资料的图书馆。 但是今天很多人都会选择一种更方便、 快捷、 全面、 准确的查阅方式–互联网。 而帮助我们在整个互联网上快速地查找到目标信息的就是越来越被重视的搜索引擎。今天学长来向大家介绍如何使用python写一个搜索引擎该项目常用于毕业设计2 系统设计实现2.1 总体设计学长设计的系统采用的是非关系型数据库Elasticsearch因此对于此数据库的查询等基本操作会加以图例的方式进行辅助阐述。在使用者开始进行査询时系统不可能把使用者输入的关键词与所有本地数据进行匹配这种检索方式即便建立索引查询效率仍然较低而且非常消耗服务器资源。因此Elasticsearch将获取到的数据分为两个阶段进行处理。第一阶段采用合适的分词器将获取到的数据按照分词器的标准进行分词第二阶段对每个关键词的频率以及出现的位置进行统计。经过以上两个阶段最后每个词语具体出现在哪些文章中出现的位置和频次如何都将会被保存到Elasticsearch数据库中此过程即为构建倒排索引需要花费的计算开销很大但大大提高了后续检索的效率。其中搜索引擎的索引过程流程图如图2.2 搜索关键流程如图所示每一位用户在搜索框中输入关键字后点击搜索发起搜索请求系统后台解析内容后将搜索结果返回到查询结果页用户可以直接点击查询结果的标题并跳转到详情页也可以点击下一页查看其他页面的搜索结果也可以选择重新在输入框中输入新的关键词再次发起搜索。跳转至不同结果页流程图浏览具体网页信息流程图搜索功能流程图2.3 推荐算法用户可在平台上了解到当下互联网领域中的热点内容点击文章链接后即可进入到对应的详情页面中浏览选中的信息的目标网页详细了解其中的内容。丰富了本搜索平台提供信息的实时性如图用户可在搜索引擎首页中浏览到系统推送的可能感兴趣的内容同时用户可点击推送的标题进入具体网页进行浏览详细内容。流程图如图2.4 数据流的实现学长设计的系统的数据来源主要是从发布互联网专业领域信息的开源社区上爬虫得到。再经过IK分词器对获取到的标题和摘要进行分词再由Elasticsearch建立索引并将数据持久化。用户通过输入关键词点击检索后台程序对获得的关键词再进行分词处理再到数据库中进行查找将满足条件的网页标题和摘要用超链接的方式在浏览器中显示出来。3 实现细节3.1 系统架构搜索引擎有基本的五大模块,分别是:信息采集模块信息处理模块建立索引模块查询和 web 交互模块学长设计的系统目的是在信息处理分析的基础上,建立一个完整的中文搜索引擎。所以该系统主要由以下几个详细部分组成:爬取数据中文分词相关度排序建立web交互。3.2 爬取大量网页数据爬取数据实际上用的就是爬虫。我们平时在浏览网页的时候在浏览器里输入一个网址然后敲击回车我们就会看到网站的一些页面那么这个过程实际上就是这个浏览器请求了一些服务器然后获取到了一些服务器的网页资源然后我们看到了这个网页。请求呢就是用程序来实现上面的过程就需要写代码来模拟这个浏览器向服务器发起请求然后获取这些网页资源。那么一般来说实际上获取的这些网页资源是一串HTML代码这里面包含HTML标签还有一些在浏览器里面看到的文字。那么我们要提取的一些数据就包含在这些HTML文本里面。我们要做的下一步工作就是从这些文本里提取我们想要的一些信息比如一段话一个手机号一个文字这类的这就是我们提取的一个过程。提取出来之后呢我们就把提取出来的信息存到数据库啊文本啊这类的。这就是完成了一个数据采集的过程。我们写完程序之后呢就让它一直运行着它就能代替我们浏览器来向服务器发送请求然后一直不停的循环的运行进行批量的大量的获取数据了这就是爬虫的一个基本的流程。一个通用的网络爬虫的框架如图所示这里给出一段爬虫爬取自己感兴趣的网站和内容并按照固定格式保存起来# encodingutf-8# 导入爬虫包fromseleniumimportwebdriver# 睡眠时间importtimeimportreimportosimportrequests# 打开编码方式utf-8打开# 睡眠时间 传入int为休息时间页面加载和网速的原因 需要给网页加载页面元素的时间defs(int):time.sleep(int)# html/body/div[1]/table/tbody/tr[2]/td[1]/input# http://dmfy.emindsoft.com.cn/common/toDoubleexamp.doif__name____main__:#查询的文件位置# fR open(D:\\test.txt,r,encoding utf-8)# 模拟浏览器使用谷歌浏览器将chromedriver.exe复制到谷歌浏览器的文件夹内chromedriverrC:\\Users\\zhaofahu\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe# 设置浏览器os.environ[webdriver.chrome.driver]chromedriver browserwebdriver.Chrome(chromedriver)# 最大化窗口 用不用都行browser.maximize_window()# header {user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36}# 要爬取的网页neirongs[]# 网页内容response[]# 网页数据travel_urls[]urls[]titles[]writefileopen(docs.txt,w,encodingUTF-8)urlhttp://travel.yunnan.cn/yjgl/index.shtml# 第一页browser.get(url)response.append(browser.page_source)# 休息时间s(3)# 第二页的网页数据#browser.find_element_by_xpath(// *[ id downpage]).click()#s(3)#response.append(browser.page_source)#s(3)# 第三页的网页数据#browser.find_element_by_xpath(// *[ id downpage]).click()#s(3)#response.append(browser.page_source)# 3.用正则表达式来删选数据regrhref(//travel.yunnan.cn/system.*?)# 从数据里爬取data。。。# 。travel_urls 旅游信息网址foriinrange(len(response)):travel_urlsre.findall(reg,response[i])# 打印出来放在一个列表里foriinrange(len(travel_urls)):url1http:travel_urls[i]urls.append(url1)browser.get(url1)contentbrowser.find_element_by_xpath(/html/body/div[7]/div[1]/div[3]).text# 获取标题作为文件名bbrowser.page_source travel_namebrowser.find_element_by_xpath(//*[idlayer213]).text titles.append(travel_name)print(titles)print(urls)forjinrange(len(titles)):writefile.write(str(j)\t\ttitles[j]\t\tstr(urls[j])\n)s(1)browser.close()3.3 中文分词中文分词使用jieba库即可jieba 是一个基于Python的中文分词工具对于一长段文字其分词原理大体可分为三步1.首先用正则表达式将中文段落粗略的分成一个个句子。2.将每个句子构造成有向无环图之后寻找最佳切分方案。3.最后对于连续的单字采用HMM模型将其再次划分。jieba分词分为“默认模式”cut_allFalse,“全模式”(cut_allTrue)以及搜索引擎模式。对于“默认模式”又可以选择是否使用 HMM 模型HMMTrueHMMFalse。3.4 相关度排序上面已经根据用户的输入获取到了相关的网址数据。获取到的数据中rows的形式如下[(urlid1,wordlocation1_1,wordlocation1_2,wordlocation1_3…),(urlid2,wordlocation2_1,wordlocation2_2,wordlocation2_3…)]列表的每个元素是一个元组每个元素的内容是urlid和每个关键词在该文档中的位置。wordids形式为[wordid1, wordid2, wordid3…]即每个关键词所对应的单词id我们将会介绍几种排名算法所谓排名也就是根据各自的规则为每个链接评分评分越好。并且最终我们会将几种排名算法综合利用起来给出最终的排名。既然要综合利用那么我们就要先实现每种算法。在综合利用时会遇到几个问题。1、每种排名算法评分机制不同给出的评分尺度和含义也不尽相同2、如何综合利用要考虑每种算法的效果。为效果好的给与较大的权重。我们先来考虑第一个问题如何消除每种评分算法所给出的评分尺度和含义不相同的问题。第2个问题等研究完所有的算法以后再来考虑。简单使用归一化将每个评分值缩放到0-1上1代表最高0代表最低。对爬去到的数据进行排序 有好几种排序算法第1个排名算法根据单词位置进行评分的函数我们可以认为对用户输入的多个关键词在文档中这些关键词出现的位置越靠前越好。比如我们往往习惯在文章的前面添加一些摘要性、概括性的描述。# 根据单词位置进行评分的函数.# rows是[(urlid1,wordlocation1_1,wordlocation1_2,wordlocation1_3...),(urlid2,wordlocation2_1,wordlocation2_2,wordlocation2_3...)]deflocationscore(self,rows):locationsdict([(row[0],1000000)forrowinrows])forrowinrows:locsum(row[1:])#计算每个链接的单词位置总和越小说明越靠前ifloclocations[row[0]]:#记录每个链接最小的一种位置组合locations[row[0]]locreturnself.normalizescores(locations,smallIsBetter1)第2个排名算法根据单词频度进行评价的函数我们可以认为对用户输入的多个关键词在文档中这些关键词出现的次数越多越好。比如我们在指定主题的文章中会反复提到这个主题。# 根据单词频度进行评价的函数# rows是[(urlid1,wordlocation1_1,wordlocation1_2,wordlocation1_3...),(urlid2,wordlocation2_1,wordlocation2_2,wordlocation2_3...)]deffrequencyscore(self,rows):countsdict([(row[0],0)forrowinrows])forrowinrows:counts[row[0]]1#统计每个链接出现的组合数目。 每个链接只要有一种位置组合就会保存一个元组。所以链接所拥有的组合数能一定程度上表示单词出现的多少。returnself.normalizescores(counts)第3个排名算法根据单词距离进行评价的函数我们可以认为对用户输入的多个关键词在文档中这些关键词出现的越紧凑越好。这是因为我们更希望所有单词出现在一句话中而不是不同的关键词出现在不同段落或语句中。# 根据单词距离进行评价的函数。# rows是[(urlid1,wordlocation1_1,wordlocation1_2,wordlocation1_3...),(urlid2,wordlocation2_1,wordlocation2_2,wordlocation2_3...)]defdistancescore(self,rows):# 如果仅查询了一个单词则得分都一样iflen(rows[0])2:returndict([(row[0],1.0)forrowinrows])# 初始化字典并填入一个很大的值mindistancedict([(row[0],1000000)forrowinrows])forrowinrows:distsum([abs(row[i]-row[i-1])foriinrange(2,len(row))])# 计算每种组合中每个单词之间的距离ifdistmindistance[row[0]]:# 计算每个链接所有组合的距离。并为每个链接记录最小的距离mindistance[row[0]]distreturnself.normalizescores(mindistance,smallIsBetter1)项目运行效果毕业设计 基于python的搜索引擎最后项目分享见主页任意置顶文章