競賽選題 python的搜索引擎系統設計與實現

0 前言

🔥 優質競賽項目系列,今天要分享的是

🚩 python的搜索引擎系統設計與實現

🥇學長這里給一個題目綜合評分(每項滿分5分)

  • 難度系數:3分
  • 工作量:5分
  • 創新點:3分

該項目較為新穎,適合作為競賽課題方向,學長非常推薦!

🧿 更多資料, 項目分享:

https://gitee.com/dancheng-senior/postgraduate


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標簽,還有一

我們寫完程序之后呢就讓它一直運行著,它就能代替我們瀏覽器來向服務器發送請求,然后一直不停的循環的運行進行批量的大量的獲取數據了,這就是爬蟲的一個基本的流程。

一個通用的網絡爬蟲的框架如圖所示:

在這里插入圖片描述
這里給出一段爬蟲,爬取自己感興趣的網站和內容,并按照固定格式保存起來:

    
?    # 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.do
?     if __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]]=loc
?    return 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)

4 實現效果

熱門主題推薦實現

在這里插入圖片描述

搜索界面的實現

在這里插入圖片描述

查詢結果頁面顯示

在這里插入圖片描述

查詢結果分頁顯示

在這里插入圖片描述

查詢結果關鍵字高亮標記顯示

在這里插入圖片描述

4 最后

🧿 更多資料, 項目分享:

https://gitee.com/dancheng-senior/postgraduate

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38168.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38168.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38168.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

正則表達式在Java中的應用與實例

正則表達式在Java中的應用與實例 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 正則表達式是一種強大的工具&#xff0c;用于模式匹配和字符串處理。在Java中…

武漢星起航:成功掛牌上股交,引領跨境電商行業進入全新發展階段

2023年10月30日&#xff0c;武漢星起航電子商務有限公司在上海股權托管交易中心成功掛牌展示&#xff0c;這一里程碑式的事件標志著武漢星起航正式登陸資本市場&#xff0c;開啟了公司發展的新篇章。作為亞馬遜跨境電商領域的領軍企業之一&#xff0c;武漢星起航此次掛牌不僅是…

文件操作詳解(C語言)

1.為什么要用到文件&#xff1f;怎樣數據才能持久化&#xff1f; 保存在內存中的數不安全&#xff08;一次斷電&#xff0c;忘記保存&#xff0c;不用了還給系統&#xff09; 持久化&#xff1a;保存在硬盤上&#xff08;放在文件中&#xff09; 什么是文件&#xff1f;文件…

Hadoop-08-HDFS集群 基礎知識 命令行上機實操 hadoop fs 分布式文件系統 讀寫原理 讀流程與寫流程 基本語法上傳下載拷貝移動文件

章節內容 上一節完成&#xff1a; HDFS的簡介內容HDFS基礎原理HDFS讀文件流程HDFS寫文件流程 背景介紹 這里是三臺公網云服務器&#xff0c;每臺 2C4G&#xff0c;搭建一個Hadoop的學習環境&#xff0c;供我學習。 之前已經在 VM 虛擬機上搭建過一次&#xff0c;但是沒留下…

SpringSecurity的執行原理

SpringSecurity的執行原理&#xff1a;當我們服務端接收到請求后&#xff0c;首先通過DelegatingFilterProxy代理對象交互&#xff0c;轉發給springsecurity的執行鏈&#xff0c;由于他自帶的執行鏈有16條&#xff0c;我們將不用的過濾器進行了排除&#xff0c;同時加入了我們自…

如何保護應用?可快速部署的WAF服務器分享

Web應用攻擊是安全事件和數據泄露的主要原因。相關統計表明&#xff0c;超過四分之三的網絡犯罪直指應用及其漏洞。為保護數量日益增長的應用安全&#xff0c;Web應用防火墻(WAF)因此而生。本文則聚焦于WAF服務器&#xff0c;了解它的性能與具體的實踐應用。   新加坡網絡安全…

《單片機》期末考試復習-學習筆記總結

題型 問答題(15分)編程題(65分)編程題1(20分)編程題2(45分)設計題(20分)一、問答題 1.1.單片機概念和特點 1.2. 51單片機的中斷結構 1.3.主從式多機通訊的概念及其工作原理 多機通信是指兩臺以上計算機之間的數據傳輸,主從式多機通信是多機通信系統中最簡單的一種,…

PHP電商系統開發指南最佳實踐

電子商務系統開發的最佳實踐包括&#xff1a;數據庫設計&#xff1a;選擇適合關系型數據庫&#xff0c;優化數據結構&#xff0c;考慮表分區&#xff1b;安全&#xff1a;加密數據&#xff0c;防止 sql 注入&#xff0c;處理會話管理&#xff1b;用戶界面&#xff1a;遵循 ux 原…

vue3長列表優化,使用vue-virtual-scroller實現直播間彈幕列表虛擬滾動效果

使用的組件庫是&#xff1a;https://github.com/Akryum/vue-virtual-scroller 官方文檔&#xff1a;vue-virtual-scroller 安裝依賴 npm install --save vue-virtual-scrollernextpnpm install --save vue-virtual-scrollernextyarn add vue-virtual-scrollernext 組件導入…

如何用文章改寫ai軟件進行改寫?5個軟件教你快速進行修改文章

如何用文章改寫ai軟件進行改寫&#xff1f;5個軟件教你快速進行修改文章 使用AI改寫軟件可以幫助你快速重寫文章&#xff0c;使其更加流暢、符合要求或避免重復。以下是五款優質的AI改寫軟件&#xff0c;它們能夠幫助你快速進行文章修改&#xff1a; 聰明靈犀 這是一款非常簡…

數據結構_1.0

一、數據結構概述 1.1 概念 在計算機科學中&#xff0c;數據結構是一種數據組織、管理和存儲的格式 。它是相互之間存在一種或多種特定關系的數據元素的集合。通常情況下&#xff0c;精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索算法和索引技…

【開源合規】開源許可證基礎知識與風險場景引入

文章目錄 什么是開源許可證(License)?開源許可證有什么用?開源許可證分類開源許可證分類及描述公共代碼 (Public Domain)CC0無License寬松型許可證 (Permissive)MITApache 2.0BSD弱互惠型許可證 (Weak Copyleft)LGPLMPLEPL互惠型許可證 (Reciprocal)GPLEUPL強互惠許可證 (Str…

讀-改-寫操作

1 什么是讀-改-寫操作 “讀-改-寫”&#xff08;Read-Modify-Write&#xff0c;簡稱RMW&#xff09;是一種常見的操作模式&#xff0c;它通常用于需要更新數據的場景。 這個模式包含三個基本步驟&#xff1a; 1.讀&#xff08;Read&#xff09;&#xff1a;首先讀取當前的數據…

從0開始學習pyspark--pyspark的數據分析方式[第2節]

PySpark是Apache Spark的Python API&#xff0c;能夠在分布式計算環境中處理大規模數據。本文將詳細介紹PySpark中不同的數據分析方式&#xff0c;包括它們的使用場景、操作解釋以及示例代碼。 1. RDD&#xff08;Resilient Distributed Dataset&#xff09;API 概述 RDD是Sp…

Linux——查找文件-find(詳細)

查找文件-find 作用 - 按照文件名、大小、時間、權限、類型、所屬者、所屬組來搜索文件 格式 find 查找路徑 查找條件 具體條件 操作 注意 - find命令默認的操作是print輸出 - find是檢索文件的&#xff0c;grep是過濾文件中字符串 參數 參數 …

簡述Vue中的數據雙向綁定原理

Vue中的數據雙向綁定原理是Vue框架的核心特性之一&#xff0c;它通過數據劫持結合發布者-訂閱者模式來實現。下面將詳細闡述Vue中數據雙向綁定的原理&#xff0c;并盡量按照清晰的結構進行歸納&#xff1a; 一、數據劫持 使用Object.defineProperty()&#xff1a; Vue在組件…

Mojo模板引擎:釋放Web開發的無限潛能

&#x1f680; Mojo模板引擎&#xff1a;釋放Web開發的無限潛能 Mojolicious是一個基于Perl的現代化、高性能的Web開發框架&#xff0c;它內置了一個功能強大的模板引擎&#xff0c;專門用于快速構建Web應用程序。Mojo的模板引擎不僅簡潔易用&#xff0c;而且具備多種高級特性…

《每天5分鐘用Flask搭建一個管理系統》第11章:測試與部署

第11章&#xff1a;測試與部署 11.1 測試的重要性 測試是確保應用質量和可靠性的關鍵步驟。它幫助開發者發現和修復錯誤&#xff0c;驗證功能按預期工作。 11.2 Flask測試客戶端的使用 Flask提供了一個測試客戶端&#xff0c;可以在開發過程中模擬請求并測試應用的響應。 …

Unity海面效果——4、法線貼圖和高光

Unity引擎制作海面效果 大家好&#xff0c;我是阿趙。 繼續做海面效果&#xff0c;上次做完了漫反射顏色和水波動畫&#xff0c;這次來做法線和高光效果。 一、 高光的計算 之前介紹過高光的光照模型做法&#xff0c;比較常用的是Blinn-Phong 所以我這里也稍微連線實現了一下 …

在線醫療診斷平臺開發教程大綱 (Java 后端,Vue 前端)—實踐篇-01

項目分析 第一部分:項目概述及技術選型 項目背景: 在線醫療診斷平臺的市場需求與發展趨勢本平臺的目標用戶和核心功能,突出解決的痛點競品分析,差異化優勢技術選型: 后端: 核心框架: Spring Boot (簡化開發流程)持久層框架: MyBatis (靈活,易于上手)數據庫: MySQL (成熟穩…