Python—一個簡單搜索引擎索引庫


因為課業要求,搭建一個簡單的搜索引擎,找了一些相關資料並進行了部分優化(坑有點多)

 

一.數據

數據是網絡上爬取的旅游相關的攻略頁面

 

 

 

 

 

 這個是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多個小時以后,鏈表處理完了...數據庫鏈接失效報錯...因為連接之后太長時間沒有進行操作,數據庫會斷開連接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM