因為課業要求,搭建一個簡單的搜索引擎,找了一些相關資料並進行了部分優化(坑有點多)
一.數據
數據是網絡上爬取的旅游相關的攻略頁面
這個是travels表,在索引中主要用到id和url兩個字段。
頁面中文文章內容的爬取用了newspaper3k這個包(如果頁面里面文章字數過多,需要設置一下超時時間,不然會報錯)
def article(url): try: a=Article(url,language="zh") a.download() a.parse() return a.text except: pass return -1
如果報錯不退出程序,返回-1
二.分詞
文章爬取下來之后的分詞有兩種模式,全文分詞,分詞后提取關鍵詞
全文分詞
def cutworf(url): text=article(url) seg_list=jieba.cut_for_search(text) return seg_list
如果有很多的頁面需要爬取,全文分詞的速度會很慢,所以我用了關鍵詞分詞
jieba有提供兩個關鍵詞分詞的方式 TF-IDF以及TextRank算法,在這里我不多詳細的說明兩個算法的區別。在經過分詞結果的比較后,我選擇了TF-IDF。
textrank = analyse.textrank tfidf = analyse.extract_tags def keyword(url): text =article(url) if text==-1: return -1 else: # 基於TF-IDF算法進行關鍵詞抽取 keywords = tfidf(text) #print ("keywords by tfidf:") # 輸出抽取出的關鍵詞 #for keyword in keywords: #print (keyword + "/") return keywords
三.建立索引
建立索引的數據結構,我參考了https://blog.csdn.net/qq_27483535/article/details/53149021這位博主的文章
創建3個鏈表類型,3個節點類型(括號中表示)。
Linklist(Node):對每一個網頁分詞后,將詞加入此鏈表。
Weblist(Web):把網頁按照所擁有的詞加入詞鏈表,接在詞的后面。
Resultlist(Result):搜索結果加入此鏈表。
設定停用詞
ignorewords=set(['的','但是','然而','能','在','以及','可以','使','我','我們','大家','高興','啊','哦'])
停用詞可以根據文章進行添加
把分詞加入鏈表
def index(url,count): #words=cutworf(url) keys=keyword(url) if keys==-1: return -1 dickey=list(keys) #dicn=list(words) # for i in range(len(dicn)): # word = dicn[i] # if word in ignorewords: continue # if ll.getlength() == 0: # wl = linklist.WebList() # wl.initlist(count) # ll.initlist(word, wl) # # if ll.getlength() > 0: # i = ll.index(word) # if i == -1: # wl = linklist.WebList() # wl.initlist(count) # ll.append(word, wl) # # print(word) # if i != -1: # j = ll.getwh(i).index(count) # if j == -1: # ll.getwh(i).append(count) for i in range(len(dickey)): word = dickey[i] if word in ignorewords: continue if kl.getlength() == 0: wl = linklist.WebList() wl.initlist(count) kl.initlist(word, wl) if kl.getlength() > 0: i = kl.index(word) if i == -1: wl = linklist.WebList() wl.initlist(count) kl.append(word, wl) # print(word) if i != -1: j = kl.getwh(i).index(count) if j == -1: kl.getwh(i).append(count) return 1
注釋掉的部分是全文分詞
最后就是遍歷鏈表,加入索引庫
對14000多條url進行處理大概花費25個小時
建議放到服務器上運行,用nohup命令,可以在關閉遠程連接后讓程序繼續運行。會自動生成nohup.out文件,報錯輸出結果什么的可以在里面看到。
四.源代碼
https://github.com/zucc31701019/SearchIndex
五.一些坑
這些運行時間很長的程序一定要加異常處理!!!不然運行一半報錯了又要重頭開始...
連接數據庫不要在還沒用到的時候連,在用之前再連接。我在分詞之前連了數據庫,然后運行 20多個小時以后,鏈表處理完了...數據庫鏈接失效報錯...因為連接之后太長時間沒有進行操作,數據庫會斷開連接。