毕设分享 基于python的搜索引擎设计与实现

文章目录

  • 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文本里面。我们要做的下一步工作就是从这些文本里提取我们想要的一些信息(比如一段话,一个手机号,一个文字这类的),这就是我们提取的一个过程。提取出来之后呢我们就把提取出来的信息存到数据库啊文本啊这类的。这就是完成了一个数据采集的过程。

我们写完程序之后呢就让它一直运行着,它就能代替我们浏览器来向服务器发送请求,然后一直不停的循环的运行进行批量的大量的获取数据了,这就是爬虫的一个基本的流程。

一个通用的网络爬虫的框架如图所示:

在这里插入图片描述
这里给出一段爬虫,爬取自己感兴趣的网站和内容,并按照固定格式保存起来:


# encoding=utf-8
# 导入爬虫包
from selenium import webdriver
# 睡眠时间
import time
import re
import os
import requests
# 打开编码方式utf-8打开# 睡眠时间 传入int为休息时间,页面加载和网速的原因 需要给网页加载页面元素的时间
def s(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复制到谷歌浏览器的文件夹内chromedriver = r"C:\\Users\\zhaofahu\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe"# 设置浏览器os.environ["webdriver.chrome.driver"] = chromedriverbrowser = webdriver.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 = []writefile = open("docs.txt", 'w', encoding='UTF-8')url = 'http://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.用正则表达式来删选数据reg = r'href="(//travel.yunnan.cn/system.*?)"'# 从数据里爬取data。。。# 。travel_urls 旅游信息网址for i in range(len(response)):travel_urls = re.findall(reg, response[i])# 打印出来放在一个列表里for i in range(len(travel_urls)):url1 = 'http:' + travel_urls[i]urls.append(url1)browser.get(url1)content = browser.find_element_by_xpath('/html/body/div[7]/div[1]/div[3]').text# 获取标题作为文件名b = browser.page_sourcetravel_name = browser.find_element_by_xpath('//*[@id="layer213"]').texttitles.append(travel_name)print(titles)print(urls)for j in range(len(titles)):writefile.write(str(j) + '\t\t' + titles[j] + '\t\t' + str(urls[j])+'\n')s(1)browser.close()

3.3 中文分词

中文分词使用jieba库即可

jieba 是一个基于Python的中文分词工具对于一长段文字,其分词原理大体可分为三步:

1.首先用正则表达式将中文段落粗略的分成一个个句子。

2.将每个句子构造成有向无环图,之后寻找最佳切分方案。

3.最后对于连续的单字,采用HMM模型将其再次划分。

jieba分词分为“默认模式”(cut_all=False),“全模式”(cut_all=True)以及搜索引擎模式。对于“默认模式”,又可以选择是否使用 HMM 模型(HMM=True,HMM=False)。

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...)]def locationscore(self,rows):locations=dict([(row[0],1000000) for row in rows])for row in rows:loc=sum(row[1:]) #计算每个链接的单词位置总和,越小说明越靠前if loc<locations[row[0]]:  #记录每个链接最小的一种位置组合locations[row[0]]=locreturn self.normalizescores(locations,smallIsBetter=1)
第2个排名算法:根据单词频度进行评价的函数

我们可以认为对用户输入的多个关键词,在文档中,这些关键词出现的次数越多越好。比如我们在指定主题的文章中会反复提到这个主题。

 # 根据单词频度进行评价的函数# rows是[(urlid1,wordlocation1_1,wordlocation1_2,wordlocation1_3...),(urlid2,wordlocation2_1,wordlocation2_2,wordlocation2_3...)]def frequencyscore(self,rows):counts=dict([(row[0],0) for row in rows])for row in rows: counts[row[0]]+=1   #统计每个链接出现的组合数目。 每个链接只要有一种位置组合就会保存一个元组。所以链接所拥有的组合数,能一定程度上表示单词出现的多少。return self.normalizescores(counts)
第3个排名算法:根据单词距离进行评价的函数

我们可以认为对用户输入的多个关键词,在文档中,这些关键词出现的越紧凑越好。这是因为我们更希望所有单词出现在一句话中,而不是不同的关键词出现在不同段落或语句中。

# 根据单词距离进行评价的函数。# rows是[(urlid1,wordlocation1_1,wordlocation1_2,wordlocation1_3...),(urlid2,wordlocation2_1,wordlocation2_2,wordlocation2_3...)]def distancescore(self,rows):# 如果仅查询了一个单词,则得分都一样if len(rows[0])<=2: return dict([(row[0],1.0) for row in rows])# 初始化字典,并填入一个很大的值mindistance=dict([(row[0],1000000) for row in rows])for row in rows:dist=sum([abs(row[i]-row[i-1]) for i in range(2,len(row))]) # 计算每种组合中每个单词之间的距离if dist<mindistance[row[0]]:  # 计算每个链接所有组合的距离。并为每个链接记录最小的距离mindistance[row[0]]=distreturn self.normalizescores(mindistance,smallIsBetter=1)

在这里插入图片描述
项目运行效果:

毕业设计 基于python的搜索引擎

最后

🧿 项目分享:见文末!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1558015.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

国内知名人工智能AI大模型专家培训讲师唐兴通讲授AI办公应用人工智能在营销与销售过程中如何应用数字化赋能

AI如火如荼&#xff0c;对商业与社会影响很大。 目前企业广泛应用主要是在营销、销售方向&#xff0c;提升办公效率等方向。 从喧嚣的AI导入营销与销售初步阶段&#xff0c;那么当下&#xff0c;领先的组织与个人现在正在做什么呢&#xff1f; 如何让人性注入冷冰冰的AI&…

Android Studio New里面没有New Flutter Project

跟着Flutter中文网的配置教程&#xff0c;安装好了flutter,在Android studio里面也安装了dart和flutter的插件。重启后还是在FIle->New里面没有显示New Flutter Project。 反复卸载重装dart和flutter插件好几次&#xff0c;依然没有效果。 原来是没有把Android APK Suppor…

Keil 5 在编译代码时出现CPU占用过高、伴随出现keil卡顿未响应的问题解决办法

问题背景&#xff1a; 在使用keil 5编译程序的时候&#xff0c;经常出现CPU占用100%&#xff0c;并且伴随出现keil卡顿未响应情况。 如下图所示&#xff1a; 解决方法1&#xff1a; 修改keil的多线程编译设置&#xff0c;减少编译的线程数或者不使用多线程编译&#xff08;编译…

大模型从入门到应用——LangChain:模型(Models)-[大型语言模型(LLMs):基础知识!

LangChain系列文章&#xff1a; 基础知识快速入门 安装与环境配置链&#xff08;Chains&#xff09;、代理&#xff08;Agent:&#xff09;和记忆&#xff08;Memory&#xff09;快速开发聊天模型 模型&#xff08;Models&#xff09; 基础知识大型语言模型&#xff08;LLMs&a…

安装R和RStudio:开始你的数据分析之旅

数据分析是当今世界中一个非常热门的领域&#xff0c;而R语言是进行数据分析的强大工具之一。R是一种编程语言和软件环境&#xff0c;用于统计计算和图形表示。RStudio是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;它为R语言提供了一个更加友好和高效的工作环境。…

C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿&…

实验室信息系统(LIS)源码,.Net C#语言开发C/S架构,支持DB2,Oracle,MS SQLServer等主流数据库

实验室管理信息系统LIS从属于HIS系统&#xff0c;严格意义上讲&#xff0c;它是HIS系统的一个子系统。众所周知的是&#xff0c;LIS系统的主要功能是将检验仪器传出的检验数据经分析后&#xff0c;生成检验报告&#xff0c;通过网络存储在数据库中&#xff0c;使医生能够方便、…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-08

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07目录1. GraphRouter: A Graph-based Router for LLM Selections摘要创新点算法模型实验效果结论推荐阅读指数 2. DOTS: Learni…

VM虚拟机安装 CentOS 7.6 部署宝塔面板实操

一、centos下载 进入centos官网下载页面&#xff0c;选择7.6版本&#xff0c;依次点击 tree-》isos-》x86_64/-》CentOS-7-x86_64-DVD-1810.iso 进行下载。 centos官网下载页面&#xff1a; https://wiki.centos.org/Download.html1、打开下载页面 二、配置CentOS 7的网络 1、…

opencv学习:图像拼接及完整代码实现

概念 图像拼接是计算机视觉领域中的一项技术&#xff0c;它涉及将多个图像合并成一个连续的、无缝的全景图像。在OpenCV中&#xff0c;图像拼接通常包括以下几个关键步骤&#xff1a; 1. 编写代码 导入必要的库&#xff1a;导入sys、cv2和numpy库。定义显示图像的函数&#x…

算法灰度膨胀腐蚀算子优化方法

第1章 当前灰度膨胀腐蚀算子 图像最大值最小值滤波。效果如下: 1.1. 常规实现 1.1.1. 半径范围遍历 对于一个像素,其膨胀腐蚀结果,查看周围半径范围内的所有像素,取最大最小值。 uint8_t nMax = 0; for (int j = -nRY; j <= nRY; j++) {for (int i = -nRX; i <= …

《重生到现代之从零开始的C语言生活》—— 联合体和枚举

联合体 像结构体一样&#xff0c;联合体也是由一个或多个成员构成 但是只会给最大的成员分配内存&#xff0c;联合体的特点就是所有成员共用一块内存空间&#xff0c;所以也叫共同体 由于所有的成员共用一块内存空间&#xff0c;所以如果给其中的一个成员赋值的话&#xff0…

Ubuntu修改IP方法

方法一&#xff1a;通过图形化界面修改IP 打开网络设置&#xff1a; 点击桌面右上角的网络图标&#xff0c;然后选择“设置”或“网络设置”。 选择网络接口&#xff1a; 在网络设置窗口中&#xff0c;选择你正在使用的网络接口&#xff08;有线或无线网络&#xff09;。 进…

避雷!Google Adsense联盟营销七大投放误区

你是否在使用Google AdSense进行广告投放&#xff1f;你是否想进一步优化你的投放策略&#xff1f;那么这篇文章你不可错过啦&#xff01; Google AdSense为跨境商家提供了一个平台&#xff0c;我们可以通过展示相关广告来赚取收入。然而&#xff0c;即使是最有经验的商家也可…

ReentrantLock相关知识

加锁流程 公平锁加锁流程&#xff1a; public final void acquire(int arg) {if (!tryAcquire(arg) &&acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt(); } 加锁流程主要分三大步&#xff1a; tryAcquire尝试获取锁 protected final boolean tryAc…

C++nullptr

其实理解nullptr很简单&#xff0c;它其实就是将一个指针置为空 int* arrnullptr; 但是为什么C语言明明有NULL可以将指针置为空&#xff0c;C还要引入nullptr呢 其实简单理解C语言的NULL它其实是一个宏 #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NUL…

【Agent】Cognitive Architectures for Language Agents

arxiv: https://arxiv.org/abs/2309.02427 背景 现有的Agent框架&#xff0c;大部分是基于强化学习提出的框架。本文结合生产系统和认知科学&#xff0c;提出了一个结构化和模块化的Agent架构。 2、记忆 记忆可分为两类&#xff1a; 工作记忆&#xff08;短期记忆&#xf…

多线程股吧(东方财富)用户信息爬取

多线程东方财富&#xff08;股吧&#xff09;用户信息爬取 在上一篇博客股吧信息爬取的基础上加入了多线程&#xff0c;使得速度提升了十几倍&#xff0c;爬取内容如下&#xff1a; 最终爬取结果如下&#xff1a; 完整代码如下&#xff08;准备好环境&#xff0c;比如pytho…

近年来自动驾驶行业就业与企业需求情况

自动驾驶行业在近年来持续发展&#xff0c;就业情况和企业需求呈现出多样化和复杂化的趋势。 以下是基于我搜索到的资料对自动驾驶行业最新就业情况和企业需求的详细分析&#xff1a; 自动驾驶行业对高端技术人才的需求非常旺盛&#xff0c;尤其是架构工程师、算法工程师等岗…

Qt(10.8)

作业&#xff1a;完善登录界面 源文件 #include "widget.h" #include "ui_widget.h" #include<QDebug> #include<QLabel> #include<QMessageBox> Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setu…