【数据结构课程设计】简单搜索引擎系统

这篇具有很好参考价值的文章主要介绍了【数据结构课程设计】简单搜索引擎系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、需求分析

该程序使用python语言实现利用爬虫代码爬取网站链接信息,将网站中文词语通过结巴分词进行分割,并存储爬取的数据信息,利用结巴分词库处理输入框用户输入的词语,进行搜索,通过链接评价函数,优先显示评分较高的链接;设计简单的html页面,实现可视化搜索功能。

二、概要设计

1、模块设计

爬虫模块spyder.py——爬取给定网页的子链接,存储数据到.db文件中

搜索模块searchengine.py——定义搜索引擎类,需要根据用户搜索的字符串分割成多个关键词,再根据三种评判算法综合评价各个链接,查询相关链接,并实现网页的建立

搜索引擎主页面fflask.html——主页面的设计

搜索引擎副页面search.html——搜索结果页面的设计

2、各模块间的调用关系   

爬虫模块是给定需要爬取的链接后事先建立好的,该程序中实例爬取'https://leetcode.cn'网页的子网页,建立相关数据库。调用搜索引擎主页面,输入关键词后会调用搜索模块搜索相关链接,之后跳转到搜索引擎的显示页面,完成一次搜索。

【数据结构课程设计】简单搜索引擎系统,搜索引擎,数据结构,python

三、详细设计

1、搜索引擎类实现

定义searcher类设计搜索引擎的函数,包括以下功能:
(1)初始化操作,连接数据库,打开游标执行sql操作;析构函数,关闭游标和数据库连接。

def __init__(self,dbname):
        #self.con=sqlite3.connect(dbname) #连接数据库
        self.con = sqlite3.connect(dbname, timeout=10, check_same_thread=False)
        self.curs=self.con.cursor()#游标来执行 sql 命令
    def __del__(self):
        self.curs.close()
        self.con.close()

(2)根据数据库查询字符串,返回单词、链接、出现位置三者的对应信息;将字符串进行jieba分词,返回分词后的数组。

(3)三种评价函数:

1、根据单词频度进行评价,认为单词在链接中出现次数较多,则该链接与该单词相关度较高。

 def frequencyscore(self,rows):
        counts=dict([(row[0],0) for row in rows])  #键值对字典dict
        for row in rows:
           counts[row[0]]+=100        #统计每个链接中出现的组合数目
        maxrank = max( counts.values())
        for urlid in counts:
            counts[urlid] /= maxrank  # 归一化
            counts[urlid]*=100
        print(counts)
        return counts

2、根据单词出现位置进行评价,因为有时候单词出现次数并不能代表相关性就一定高,因为可能是无效、冗杂的信息,而单词位置出现越靠前,越具有概括性,视为相关度越高;

def locationscore(self,rows):
        locations=dict([(row[0],0) for row in rows])
        #位置评定权值初始化为0,找到最靠前位置,200/loc得到权值
        for row in rows:
            loc=sum(row[1:])
            if 200/loc>locations[row[0]]:
                locations[row[0]]=200/loc
        maxrank = max( locations.values())
        for urlid in locations:
            locations[urlid] /= maxrank  # 归一化
            locations[urlid]*=100
        print(locations)
        return locations

3、利用pagerank算法评价,利用指向该链接的链接数目进行评价(仅计算回指数目),每个链接的pagerank=指向此链接的网页的pagerank/网页中的链接总数*0.85+0.15,其中0.85表示阻尼因子,表示网页是否点击该网页中的链接。pagerank算法是离线迭代计算,形成每个链接的稳定pagerank值。iterations为迭代计算的次数。

def pagerankscore(self, rows):
        pageranks = dict(
            [(row[0], self.curs.execute('select score from pagerank where urlid=%d' % row[0]).fetchall()[0][0]) for row
             in rows])
        maxrank = max(pageranks.values())  # 求最大的pagerank值
        for urlid in pageranks:
            pageranks[urlid] /= maxrank  # 归一化
            pageranks[urlid]*=100
        print(pageranks)
        return pageranks  # 返回归一化的url的pagerank

综合利用三个评价函数,得出最终算出的权值。

2、页面设计

(1)创建一个网页,添加具体功能:

#创建一个网页
app=Flask(__name__)
#装饰器 给函数新增功能 ‘/’路由
@app.route('/')
def index():
    return render_template('fflask.html')
@app.route('/s')
def search():
    keyword=request.args.get('wd')
    print(keyword)
    docs =mysearcher.query(keyword)
    terms = list(jieba.cut_for_search(keyword))
    print(terms)
    print(docs)
    result = docs
return render_template('search.html', docs=result, value=keyword, length=len(docs))

(2)设计搜索主页面

添加html中的输入框、标题、按钮、图片背景、路由等功能,主要实现供用户输入关键词并提交关键词的功能。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>我的搜索引擎</title>
    <style>
     #all{
    margin:10px auto;
    width:500px; /* 必须制定宽度 */
    height:200px;
}
    	#box{
	    width:5000px;
	    height:3000px;
	    background-repeat:no-repeat;
	#background-image:url('https://tse3-mm.cn.bing.net/th/id/OIP-C.4JF-gbky8ahr5GoSx-YaTgHaEK?w=329&h=185&c=7&r=0&o=5&dpr=1.3&pid=1.7');
	    }
	</style>
</head>
<body style="background-image: url('https://tse2-mm.cn.bing.net/th/id/OIP-C.4LCXZorbgMemLxN-jA0gxQHaPj?w=115&h=180&c=7&r=0&o=5&dpr=1.3&pid=1.7'); background-size: 100%; background-attachment: fixed;background-repeat:no-repeat;">
  <div id="all">
          <form action="/s" method="get">
               <img src="https://www.iconninja.com/files/624/1019/808/2-traffic-icon.png"><h1 style="color:green"> Search Engine</h1>
               <br><input type="text" name="wd">
               <input type="submit" value="提交">
          </form>
  </div>
</body>
</html>

(3)结果显示页面

主要实现根据搜索结果显示链接信息的功能。

<!doctype html>
<html ng-app="app">
<head>
    <meta charset="UTF-8">
    <title>搜索</title>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
</head>
<body ng-controller="ctrl" style="background-image: url('https://tse2-mm.cn.bing.net/th/id/OIP-C.4LCXZorbgMemLxN-jA0gxQHaPj?w=115&h=180&c=7&r=0&o=5&dpr=1.3&pid=1.7'); background-size: 100%; background-attachment: fixed;background-repeat:no-repeat;">
<div class="container">
    <br>
    <br>
    <form class="form-inline" method="get" action="/s">
        <div class="form-group">
            <input type="text" style="height: 40px; width: 360px;" class="form-control" ng-model="query"
                   value="{{ value }}" name="wd" id="query"/>
        </div>
        <input class="btn btn-small btn-success" role="button" type="submit" value="搜一下" id="btn">
    </form>
    <br>
    <br>共有{{ length }}条结果
    <br>
    <div id="box">
    {% for doc in docs %}
    <p><a href="{{ doc[0] }}" target="_blank">{{ doc[1]|safe }}</a></p>
    <p>来源:{{ doc[0] }}</p>
    <br>
    {% endfor %}
</div>
</div>
</body>
</html>

3、主函数

给定需要爬取的服务器,建立数据库,如果该数据库已经存在则跳过爬取的过程,搜索引擎类的spyder读取数据库,运行搜索引擎页面。以下示例爬取力扣页面。

if __name__ == '__main__':
    # 爬取服务器建立数据库 爬取下面网页
    url = 'https://leetcode.cn'
       if os.path.exists('leetcode.db'):
      i=0
    else:
     spyder.crawlerhost(url, url, 'leetcode.db')
    # 读取数据库
     spyder.readdb('leetcode.db')
    mysearcher= searcher('leetcode.db') #搜索引擎
       #输入搜索词
    app.run()

四、测试结果

测试输入关键词“题库”,在站内搜索相关内容,页面及数据显示如下:

【数据结构课程设计】简单搜索引擎系统,搜索引擎,数据结构,python

【数据结构课程设计】简单搜索引擎系统,搜索引擎,数据结构,python

【数据结构课程设计】简单搜索引擎系统,搜索引擎,数据结构,python

五、学习参考

该课设部分设计参考学习于:

python数据挖掘案例系列教程——python实现搜索引擎_nn.searchnet是什么意思python中-CSDN博客使用Python实现简单的搜索引擎,完整源码_python搜索引擎代码csdn-CSDN博客

感谢观看!!!欢迎学习交流文章来源地址https://www.toymoban.com/news/detail-818361.html

到了这里,关于【数据结构课程设计】简单搜索引擎系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构课程设计1: 区块链

    1.任务: [问题描述] 使用链表设计一个保存信息的系统,该系统拥有类似区块链的设计以防止信息被轻易篡改。 该题目使用一个链表。信息保存在链表的每一个节点中,每个节点需要包含该节点的编号、信息和校验码。其中: + 每个节点的编号按照顺序递增,从0开始。 + 节

    2023年04月16日
    浏览(115)
  • 数据结构课程设计 ——考试报名系统

    数据结构课程设计 ——考试报名系统 一、项目功能要求 完成对考生信息的建立,查找,插入,修改,删除等功能。其中考生信息包括准考证号,姓名,性别,年龄和报考类别等信息。项目在设计时应首先确定系统的数据结构,定义类的成员变量和成员函数;然后实现各成员

    2024年02月04日
    浏览(56)
  • 数据结构课程设计 仓储管理系统

    【基本功能】 把货品信息表抽象成一个线性表,货品信息(包括ID、货品名、定价、数量等)作为线性表的一个元素,实现:按ID、货品名分别查找某货品信息(包括ID、货品名、定价、数量等);收录货品(如果货品在帐中已有,则只将总库存量增加。否则插入新增信息);

    2024年01月23日
    浏览(71)
  • 一、课程设计目的与任务《数据结构》课程设计是为训练学生的数据组织能力和提高程序设计能力而设置的增强实践能力的课程。目的:学习数据结构课程,旨在使学生学会分析研究数据对象的特性,学会数据的组织方法,以

    一、课程设计目的与任务 《数据结构》课程设计是为训练学生的数据组织能力和提高程序设计能力而设置的增强实践能力的课程。目的:学习数据结构课程,旨在使学生学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据的逻辑结构和存储结构以及相应

    2024年02月21日
    浏览(70)
  • 数据结构课程设计——项目2:校园导游咨询

    【问题描述】 设计一个校园导游程序,为来访的客人提供各种信息查询服务。 【基本要求】 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校 内各景点,存放景点名称、代号、简介 等信息;以边表示路径,存放路径长度等相关信息。 为来访客人提供图中任

    2024年02月02日
    浏览(69)
  • 数据结构课程设计:学生成绩管理系统

    目  录 第一章   需求分析 第二章 概要设计 第三章 详细设计 第四章 测试报告 第五章 安装及使用 第六章 项目总结 第七章 源码 一.需求分析        学生成绩管理是一个学校不可缺少的部分,它的内容对于学校的管理者和学生以及学生家长来说都至关重要,所以一个良好

    2024年02月02日
    浏览(70)
  • 《数据结构与算法分析》课程设计——迷宫问题

    中国矿业大学信控学院   补一下我之前在博客园发布的内容  懒得调了, 想复制完整代码直接复制最下面的 ,想复制分布代码去看我博客园链接吧 《数据结构与算法分析》课程设计——迷宫问题 - 刷子zz - 博客园 一、  问题描述 问题中迷宫可用方阵[m,n]表示,0表示能通过

    2024年02月10日
    浏览(51)
  • 数据结构课程设计——哈夫曼编/译码系统设计与实现(C++)

    对于生产实际的问题,本设计可以作为一个无损数据压缩工具,在需要传输海量数据时,利用哈夫曼编码可以将数据进行压缩,从而减小传输的数据量,提高数据传输效率。同时,哈夫曼编码也可以应用于数据加密和解密等领域。 本设计的主要目的是学习哈夫曼编码算法,并

    2024年02月04日
    浏览(50)
  • 数据结构课程设计-宿舍管理查询软件-(C/C++)

    目录 1. 系统需求分析      1.1 设计理由与意义      1.2 功能需求分析      1.3 数据需求分析 2. 系统设计       2.1 数据结构类型设计       2.2 整体功能结构设计      2.3 子模块详细设计       2.4 程序流程图设计 3.系统实现       3.1 系统源代码 4.运行效果截图(部分)

    2024年02月05日
    浏览(47)
  • 数据结构与算法课程设计---最小生成树的应用

    1.问题 假定有这么一个问题,有11个城市,城市之间有一些天然气管道,铺设天然气管道需要花费不同的金额,现在要你选择其中一些天然气管道,使得所有城市可以互相联通且花费最小。 2.分析 我们把这个问题抽象为一张图,每个城市是一个顶点,城市与城市之间的管道是

    2024年02月08日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包