专转本校园资讯网站(BM25相似性匹配算法)

2023-11-01 13:40

本文主要是介绍专转本校园资讯网站(BM25相似性匹配算法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       专升本是提升自己专科学历到达本科阶段的一个方法和手段,考试成功之后就读两年就是本科的学历了,对于大多数的学生来说还是很有必要和帮助的。对于有决心考上专升本的学生以及愿意在这期间努力付出的学生而言,成功考上专升本以后就读两年是非常有必要也是非常值得的。一方面是因为专升本以后的学历是本科学历,相比之前的专科学历,本科学历无论是在就业找工作过程中,还是在工作中的升职加薪,甚至是职称的评定过程中都是有辅助作用的。另一方面,专升本就读的两年以及毕业以后接触到的人物和事物,你会发现和你专科阶段所处的环境有很大的不同,专升本不仅是对自己学历的提升,也是对自己能力在一定程度的提高。

一、设计理念

  • 设计原因
    专转本考试将要来临,作为一个参加专转本考试的考生,我深知其中的压力,因此这里选泽“我在城院准备专转本的主题”来进行网站的设计与开发,通过改网站来展示一些我对专转本的看法。
  • 设计理念
    本网站主要是针对于专转本考试的相关内容来进行制作的。通过该网站来对参加专转本考试的学生进行相应的参考,同时也有一定的激励作用,希望参加专转本考试的考生都能够考上自己理想的大学。

二、功能模块

功能模块说明:
1、本网站是通过前端网页模板与Flask前端Web框架进行联合开发。
2、网站主要分为9个网页,每个网页的背景、header和footer都是相同的。
3、网站主要分为六个板块,分别是首页、我的城院、转本资讯、砥砺前行、转本答疑和联系我们。
4、网站整体搭建流程分为三个部分:数据的获取与存储、服务器的搭建和页面的渲染。
在这里插入图片描述
功能流程说明:
在这里插入图片描述

二、项目特点

  • 实时数据及动态变换
    1. 网站中所涉及到的名人名言以及激励美句都是通过爬虫技术爬取相应网站来获得的数据并将爬取的数据存储到数据库中,保证了数据的实时性。
    2. 网站中使用了随机处理策略,保证了网页在显示数据时的多样性,每次刷新网页所呈现的内容都是不相同的。
  • 在线提问和申请加入
    1. 本网站采用在线提问的方式,用户可以在线提问,用户提出问题后,系统会根据用户提问的内容去数据库中匹配最相似的问题并呈现出问题所对应的回答,在问题匹配过程中我采用了传统的BM25算法来计算文本相似度。
    2. 访问者可通过输入相关个人信息加入我们,我们会将浏览者的信息会存储至数据库中。

三、代码展示

  • 爬虫代码

    import requests
    from lxml import html
    import pymysql
    import re
    class CrawlTask(object):def __init__(self):self.url_temp = "https://www.diyifanwen.com/tool/mrmydq/{}.html"self.headers = {"Host": "www.diyifanwen.com","Cookie": "SetCookieTF=1; testcookie=yes; DYFWUID=16194263885649fmldrc6ia0w4ia; Hm_lvt_3a5e11b41af918022c823a8041a34e78=1638774720; Hm_lpvt_3a5e11b41af918022c823a8041a34e78=1638775048","User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"}def get_url_list(self):pages = ["651259","651327","650197","651325","651264","651267"]return [self.url_temp.format(i) for i in pages]def parse(self,url):rest = requests.get(url,headers=self.headers)rest.encoding = rest.apparent_encodingreturn rest.textdef get_content(self,rest):html_rest = html.etree.HTML(rest)p_list = html_rest.xpath("//div[@id='ArtContent']/p[position()<=100]")item_list = []for p in p_list:item = {}content = p.xpath("./text()")[0] if len(p.xpath("./text()"))>0 else Noneif content and len(content)<50 and len(re.findall("――",content))>0 and not len(re.findall("佚名",content))>0:author = re.findall(r"――(.*)",content)[0]content = re.findall("、(.*。).*――",content)if len(author)>0 and len(content)>0:item["author"] = authoritem["content"] = content[0]print(item)item_list.append(item)return item_listdef save(self,content_list):data = [[i["author"],i["content"]] for i in content_list]conn = pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='my_college',charset='utf8')with conn.cursor() as cursor:try:sql = "insert into db_saying(author,content) values(%s,%s)"cursor.executemany(sql,data)conn.commit()except Exception as e:conn.rollback()print(e)finally:conn.close()def run(self):url_list = self.get_url_list()for url in url_list:rest = self.parse(url)content_list = self.get_content(rest)self.save(content_list)if __name__ == '__main__':ct = CrawlTask()ct.run()
    
  • 相似度匹配代码

    import numpy as np
    from collections import Counter
    import jiebaclass BM25_Model(object):def __init__(self, documents_list, k1=2, k2=1, b=0.5):self.documents_list = documents_listself.documents_number = len(documents_list)self.avg_documents_len = sum([len(document) for document in documents_list]) / self.documents_numberself.f = []self.idf = {}self.k1 = k1self.k2 = k2self.b = bself.init()def init(self):df = {}for document in self.documents_list:temp = {}for word in document:temp[word] = temp.get(word, 0) + 1self.f.append(temp)for key in temp.keys():df[key] = df.get(key, 0) + 1for key, value in df.items():self.idf[key] = np.log((self.documents_number - value + 0.5) / (value + 0.5))def get_score(self, index, query):score = 0.0document_len = len(self.f[index])qf = Counter(query)for q in query:if q not in self.f[index]:continuescore += self.idf[q] * (self.f[index][q] * (self.k1 + 1) / (self.f[index][q] + self.k1 * (1 - self.b + self.b * document_len / self.avg_documents_len))) * (qf[q] * (self.k2 + 1) / (qf[q] + self.k2))return scoredef get_documents_score(self, query):score_list = []for i in range(self.documents_number):score_list.append(self.get_score(i, query))return score_listif __name__ == '__main__':# document_list = ["行政机关强行解除行政协议造成损失,如何索取赔偿?",#                  "借钱给朋友到期不还得什么时候可以起诉?怎么起诉?",#                  "我在微信上被骗了,请问被骗多少钱才可以立案?",#                  "公民对于选举委员会对选民的资格申诉的处理决定不服,能不能去法院起诉吗?",#                  "有人走私两万元,怎么处置他?",#                  "法律上餐具、饮具集中消毒服务单位的责任是不是对消毒餐具、饮具进行检验?"]# document_list_split = [list(jieba.cut(doc)) for doc in document_list]# bm25_model = BM25_Model(document_list)# query = "走私了两万元,在法律上应该怎么量刑?"# query = list(jieba.cut(query))# scores = bm25_model.get_documents_score(query)# print(document_list[scores.index(max(scores))])test = [["a","b"],["c","d"]]test.remove(["c","d"])print(test)
    
  • 视图函数代码

import jieba
from flask import request,jsonify,session,redirect,render_template
from . import api
from my_college.models import db,Saying,Questions,User,Sentence,Answer_Questions
import json
from my_college.utils.common import BM25_Model
import random
# 首页
@api.route('/init_index')
def init_index():return render_template('index.html')# 我的城院页面
@api.route('/about')
def about():return render_template('about.html')# 转本资讯视图函数
@api.route('/activities')
def activities():return render_template('activities.html')# 转本资讯视图函数
@api.route('/application')
def application():return render_template('application.html')# 砥砺前行视图函数
@api.route('/blog')
def blog():sentence_list = [i.sentence for i in Sentence.query.all()]sentence_number = []while True:if len(set(sentence_number))==8:breaksentence_number.append(random.randint(0, len(sentence_list) - 1))random_sentence_list = [sentence_list[i] for i in set(sentence_number)]saying_list = [[i.author, i.content] for i in Saying.query.all()]saying_number = []while True:if len(set(saying_number))==4:breaksaying_number.append(random.randint(0, len(saying_list) - 1))random_saying_list = [saying_list[i] for i in set(saying_number)]return render_template('blog.html',saying_list=random_saying_list,sentence_list=random_sentence_list)# 转本资讯视图函数
@api.route('/competition')
def competition():return render_template('competition.html')# 联系我们视图函数
@api.route('/contact')
def contact():return render_template('contact.html')# 查看详情视图函数
@api.route('/events')
def events():return render_template('events.html')# 转本资讯视图函数
@api.route('/programs')
def programs():return render_template('programs.html')# 转本答疑视图函数
@api.route('/staff')
def staff():question_answer_list = [[i.question, i.answer] for i in Answer_Questions.query.all()]try:q_content = session["question"]sign = Truequestion_list = [i[0] for i in question_answer_list]question_list_split = [list(jieba.cut(doc)) for doc in question_list]bm25_model = BM25_Model(question_list_split)query = list(jieba.cut(q_content))scores = bm25_model.get_documents_score(query)find_question = question_list[scores.index(max(scores))]find_answer = ""remove_item = []for i in question_answer_list:if i[0] == find_question:find_answer = i[1]remove_item = i# 随机获取提问问题和解答# 将匹配到的问题从列表中移出question_answer_list.remove(remove_item)question_answer_number = []while True:if len(set(question_answer_number)) == 5:breakquestion_answer_number.append(random.randint(0, len(question_answer_list) - 1))random_question_answer_list = [question_answer_list[i] for i in set(question_answer_number)]print("访问者提出问题")print(q_content)print("匹配到的问题")print(find_question)print("问题所对应的回答")print(find_answer)return render_template("staff.html", question=find_question, answer=find_answer,question_answer_list=random_question_answer_list, sign=sign)except:q_content = Nonesign = Falsequestion_answer_number = []while True:if len(set(question_answer_number)) == 5:breakquestion_answer_number.append(random.randint(0, len(question_answer_list) - 1))random_question_answer_list = [question_answer_list[i] for i in set(question_answer_number)]print(random_question_answer_list)return render_template("staff.html",question_answer_list=random_question_answer_list, sign=sign)# 问题资讯视图函数
@api.route('/questions')
def questions():q_content = request.args.get("q_content")# question = Questions(question=q_content)# 将提问的问题存储到session中session["question"] = q_contenttry:# 将提问问题插入到数据库中# db.session.add(question)# db.session.commit()return jsonify(errno="200")except Exception as e:return jsonify(errno="500")# 联系我们视图函数
@api.route('/user')
def user():name = request.args.get("name")email = request.args.get("email")subject = request.args.get("subject")message = request.args.get("message")user = User(name=name,email=email,major_class=subject,reason=message)try:db.session.add(user)db.session.commit()return jsonify(errno="200")except Exception as e:return jsonify(errno="500")

四、页面展示

页面展示说明:
1、每个页面的头部和尾部是相同的

  • 头部和尾部
    在这里插入图片描述
    在这里插入图片描述
  • 首页页面
    在这里插入图片描述
    在这里插入图片描述
  • 我的城院页面
    在这里插入图片描述
    在这里插入图片描述
  • 转本资讯页面
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 砥砺前行页面
    在这里插入图片描述
    在这里插入图片描述
  • 转本答疑页面
    在这里插入图片描述
  • 联系我们页面
    在这里插入图片描述
    以上是本项目的核心内容,静态页面没有展示,希望能够帮助你们,如需源代码,私信博主

这篇关于专转本校园资讯网站(BM25相似性匹配算法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/323370

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。