1. 程式人生 > 其它 >搜尋引擎初識

搜尋引擎初識

搜尋引擎

1.背景

目前正在進行搜尋引擎的學習,決定寫個部落格來記錄學習的過程。

2.搜尋領域

當前搜尋推薦都涉及網際網路的各個領域,可以簡單的粗分成這2類

  • 綜合領域:像百度、google、搜狗、360等,搜尋全網內容,一般叫大搜。一般搜尋的內容是網際網路上的網頁,多數是通過爬蟲獲取到,通過網頁的標題和正文來搜尋。
  • 垂直領域:像視訊、音樂、電商、小說等,只搜尋特定領域的內容,一般叫垂搜或小搜。垂域搜尋的資料,往往是非常結構化的,比如淘寶裡的商品,優酷裡的影片資訊等,與網頁相比,文字偏短。例如像xunlei 是資源的垂直搜尋引擎,flickr 是photo/images,youtube 應該是視訊,
    digg
    是社會化新聞,ctrip/qunar應該是酒店、旅行相關,大眾點評是餐館,豆瓣是 book/movie/music。

3.幾個基本概念

首先介紹幾個縮寫基本概念:

  • 縮寫
    • query:搜尋關鍵字,也叫keyword
    • doc:被搜尋的內容,比如一個網頁,一部影響,一件商品,在索引裡是一條記錄,都叫一個doc
    • QU:query understanding,查詢理解,即對query進行分析,得到一些使用者意圖相關的資訊,輔助檢索
    • index:索引
    • term:query分詞後,每個詞,稱為一個term
  • 正排索引:以doc作為key,以這個doc包含的term或屬性資訊作為value,就是常規的資料庫儲存結構。便於通過docId,查詢這個doc的屬性資訊。想像一下,如果要檢索出所有包含“apple”的網頁,需要將索引裡所有doc遍歷一遍。
  • 倒排索引:與正排相反,以term作為key,以包含這個term的所有doc的ID作為value,構建出的KV結構。如果要檢索出包含“apple”的網頁,只需要以apple作為key,一把就能取出所有包含apple這個詞的網頁。
  • 分詞:又成為切詞,就是講句子或者段落進行切割,從中提取出包含固定予以的詞。
  • 停止詞:在英語中包含了 a、the、and這樣頻率很高的詞,如果這些詞都被建到索引中進行索引的話,搜尋引擎就沒有任何意義了,因為幾乎所有的文件都包含這些詞。
  • 排序,當輸入一個關鍵字進行搜尋時,可能會命中許多文件,搜尋引擎給使用者的價值就是快速找到需要的文件,因此需要將相關度更大的內容排到前面,以便使使用者能夠更快的篩選有價值的內容弄。

4.倒排索引

索引的儲存結構

單詞詞典是倒排索引中非常重要的組成部分,它用來維護文件集合中出現過的所有單詞的相關資訊,同時用來記載某個單詞對應的倒排列表在倒排檔案中的位置資訊。在支援搜尋時,根據使用者的查詢詞,去單詞詞典裡查詢,就能夠獲得相應的倒排列表,並以此作為後續排序的基礎。

1)Hash的儲存方式

在建立索引的過程中,詞典結構也會相應地被構建出來。比如在解析一個新文件的時候,對於某個在文件中出現的單詞T,首先利用雜湊函式獲得其雜湊值,之後根據雜湊值對應的雜湊表項讀取其中儲存的指標,就找到了對應的衝突連結串列。如果衝突連結串列裡已經存在這個單詞,說明單詞在之前解析的文件裡已經出現過。如果在衝突連結串列裡沒有發現這個單詞,說明該單詞是首次碰到,則將其加入衝突連結串列裡。這樣的儲存方式很類似於Java中HashMap解決hash衝突的方式。

2)樹形結構

B樹(或者B+樹的)儲存方式,這點很類似於Mysql的Inoodb的儲存引擎中採用B+樹的方式來儲存索引,由於採用了B樹的結構,即索引儲存在是一個平衡樹,避免了查詢極端的情況,由於有序,所以能根據字典項需要的大小順序來構建索引,這樣在檢索中可以快速通過字典項比較大小,最終確定葉子結點中詞彙的儲存地址資訊。(由於B樹的構建複雜,這裡就不過多的講解,向深入瞭解,可以翻翻上學那會兒的《資料結構》那本書喔)

上面大致粗略的講解了一下倒排索引的概念,其實在實際中,倒排索引還會進行索引壓縮,排序的加工,也正因為這些加工,讓其成為目前許多搜尋引擎採用的索引方式。

5.流程和架構

搜尋引擎的線上檢索架構如圖1所示。主要包含以下幾個模組:查詢理解(QU),基礎檢索,精排(重排),摘要(高亮、飄紅)。除此之外,可能還會有運營幹預之類的模組。

垂搜與大搜的架構基本一致。相比大搜,垂搜在某些模組上會簡化。比如摘要,垂搜會比大搜簡單很多。

下面簡單介紹下每個模組的功能

5.1 檢索服務(編排)

圖1中的檢索服務,實際上是個編排模組,接受端側的搜尋請求,負責整個線上檢索的流程串通,本身沒有實質性的功能。所以,也是其中最簡單的一個模組。

編排模型會依次呼叫查詢理解、基礎檢索、精排、摘要這4個模組,每一個模組的輸出,作為下一個模組的輸入。

5.2 查詢理解(QU)

QU的功能,是對使用者輸入的query進行分析,以支撐後續的搜尋排序效果。

QU的主要功能包括:

  • 分詞:搜尋|是|什麼
  • 實體識別:人名、地名、影片名、機構名、歌曲名等等
  • 意圖/需求識別:常見的意圖型別包括:問答、新聞、軟體下載、視訊、小說等
  • 同義詞識別:
  • 查詢改寫:
  • 糾錯:搜尋陰晴 -> 搜尋引擎
  • 詞權重計算:計算query分詞後,每個term的權重是多少
  • 核心詞選擇:query分詞後,哪些詞是必須命中的,即核心詞只要沒命中這個內容就不會被搜尋出來
  • 緊密度分析:query中,相鄰兩個詞之間的緊密關係,是否需要連續命中

QU中很多模組的效果,依賴於NLP能力,例如分詞、實體識別、意圖識別等。像糾錯、改寫等,也強依賴於使用者的行為日誌。

5.3 基礎檢索

基礎檢索(粗排)是做第一輪檢索,從全量索引中召回網頁候選集(例如top1000),並做一個排序。整個搜尋的過程,就像是一個漏斗篩選的過程,基礎檢索是第一次篩選,如果沒有被篩選出來,就不會成為本次的搜尋結果。

由於基礎檢索涉及的網頁量非常大,對效能要求高,所以一般只用少量最重要的特徵,相對簡單的策略來做召回。不亦使用太多的特徵和太複雜的模型。

檢索的過程主要分2步,

  • 根據query的核心詞term,從倒排索引中取出倒排拉鍊。每個核心詞對應一個倒排拉鍊,多個核心詞的拉鍊取交,得到基礎檢索的一個候選集合。
  • 對候選集中的每個doc,計算它與query的匹配分數以及doc本身的質量得分,合併後得到一個總的分數並做降序排序。最終,再按一個閾值(例如1000)做截斷,作為基礎檢索的結果。

一個網頁是否能被基礎檢索召回,主要取決於幾個因素:1)doc是否滿足term倒排求交條件;2)doc與query的相關性得分;3)doc本身的質量(靜態特徵,與query無關)

5.4 精排

精排是對基礎檢索召回的結果,做一個更精準的排序。由於基礎檢索召回的數量有限(1000條以內),相比粗排,精排需要處理的doc數量少了很多,就可以用更豐富的特徵,更復雜的演算法模型(LTR),以得到更精準的排序效果。

除了使用排序模型,精排也可以使用一些人工策略來調權。

在精排之後,也會根據運營幹預的策略,對結果做進一步的調整干預。

最終,根據翻頁引數,只返回10或15條結果給上游。

5.5 摘要

精排返回的結果,還要補充些資訊,才能在終端介面上展示。例如淘寶搜尋結果,需要展示商品的圖片、標題、銷量等一系列資訊。

一般的垂直領域,只要把doc的幾個屬性展示出來即可。網頁搜尋比較特殊,一般網頁正文很長,但是最終展示的只有簡短的三兩行文字片段。這個片段,就是網頁的摘要資訊。摘要模組的主要目標,主要就是從網頁正文中,抽取出匹配最好的那一兩個片段,並把與query匹配的那些詞標紅,讓使用者直觀的看到這個網頁與query的匹配關係。

6.分詞

1. 分詞粒度

例如北京疫情防控

  1. 最細粒度分詞:【北京,疫情,防控】
  2. 正常粒度分詞:【北京,疫情防控】
  3. 最粗粒度分詞:【北京疫情防控】
  4. 混合粒度分詞:【北京,北京疫情,北京疫情防控,疫情,疫情防控,防控】

2.構建索引

在構建索引時,為了擴大召回,一般要求粗細粒度都要有。

3.線上查詢

  • 線上檢索時,分詞的粗細粒度各有優劣。
    • 粗粒度分詞:
      • 召回的數量少。例如,線上查詢時,分成了【北京疫情防控】,那就搜尋不到《北京疫情防治》之類的內容了。
      • 搜尋準確率高,只搜尋出完整包含《北京疫情防控》,不會搜尋出《廣州疫情防控》之類的內容
      • 效能快,只用一個粗粒度term搜尋,倒排相對較短。只需要取一個倒排拉鍊,沒有其它term參與打分計算。
    • 細粒度分詞:(與粗粒度分詞的優劣正好相反)
      • 召回數量多,可以搜尋《北京疫情處理》《廣州疫情防控》之類(如果多個term之間是或查詢,不要求所有term都命中)。
      • 準確率會下降,搜尋出部分相關的內容。
      • 處理邏輯更復雜。分詞後,多個term之間的關係如何處理,是取交集還是並集?

如果是約定俗成的內容,例如成語、人名、地名等,不建議再做進一步細分詞。否則,搜尋出的結果會有明顯偏差。

如果是可粗可細的,可以考慮一個折中辦法:先用粗粒度分詞去做搜尋,如果搜尋結果夠多、質量夠好,就不再用細粒度分詞去做檢索。否則,如果搜尋結果數量偏少,或質量不佳,則再細分詞,去做進一步的查詢。

舉個例子:人名“周杰倫”,建索引時,儘可能的各種粒度都有,例如分成【周,周杰,周杰倫,杰倫】。

  • 使用者搜尋“周杰倫”,只用粗粒度分詞【周杰倫】,搜尋出準確的內容。如果再細分出【周杰】,搜尋出“周杰”相關的內容,明確主違背了使用者的意圖。
  • 使用者搜尋“周”或“周杰”,也可以搜尋出“周杰倫”的相關內容。因為使用者有可能是想搜尋周杰倫,未輸入全就點選了搜尋按鈕。輸入不全,在搜尋中是一種常見的問題。
詞形還原&詞幹提取

在涉及英語等語言時,會涉及時態、單複數等變化問題,中文裡沒有這個問題。分詞時如果不考慮詞形還原&幹提取問題中,會導致漏召回。

  • 詞形還原(Lemmatization)

詞形還原,是將詞還原成最原始的狀態。例如過去式、過去分詞,變成原樣(running -> run)。複數變成單數等(dogs -> dog)。

也就是使用者在搜尋dog時,也要能搜尋出dogs的內容。同樣,搜尋dogs,也要能搜尋出dog的內容。所以分詞時,需要將dogs識別出原形是dog。

詞形還原一般是通過詞典實現,準確率高。也可以基於規則做,但是我們知道英語裡不規則的單複數、時態例子太多了,用規則解決不了。

  • 詞幹提取(temming)

詞幹提取是去除詞的字尾,得到詞根。與詞形還原一個很明顯的區別是,詞形還原後的仍然是一個有意義的詞,但是詞幹提取出來的詞根,可能不是一個單詞,只是單詞的一部分。例如electricity的詞根是electr。

相比詞形還原,用了詞幹提取後,召回更多,準確率同時也會下降。

在搜尋中,如果要使用詞形還原與詞幹提取,使用者輸入的原詞,與還原後的詞或詞根,這2者之間的權重可能要做些區分。否則,會搜尋出一些有偏差的結果。

7.不可省詞

倒排求交

解決求交選詞

https://www.cnblogs.com/grindge/p/12241855.html

8.Query改寫