數據處理之搜索如何命中?

7 評論 10471 瀏覽 72 收藏 17 分鐘

本文主要講解了用戶在搜索的時候,是怎么命中的,enjoy~

通過本文你可以了解到:

  1. 了解搜索過程的基本原理:如何根據關鍵字匹配內容,如何返回搜索結果,如何將結果展示給用戶;
  2. 在搜索場景下更合理的劃定搜索范圍(輸入內容命中哪些字段),提高用戶搜索效率,提高數據搜索基線;
  3. 提高日常工作中搜索的效率,更快更準地搜到自己想要的東西。

用戶搜索的過程:用戶輸入關鍵詞,系統根據用戶輸入的內容篩選出系統認為用戶感興趣的信息,然后按照系統所設定的規則進行排序。整個過程可拆解為三步:分詞、篩選、排序。

在了解分詞前先看下搜索的存儲原理:在系統詞庫和索引庫之間建立關聯,通過用戶輸入的關鍵詞去匹配詞庫,然后拉取索引庫內容展示給用戶。

以在美食網站搜索“北京最大的火鍋店”為例,索引庫中內容為系統內所有店鋪,每個店鋪包含的字段有店名、位置、月銷量、評論量、評分等等;詞庫中內容為系統內的詞條,只要用戶輸入的內容能夠匹配到詞條,就可以快速找到詞條對應的索引內容,無法匹配到詞條時就沒有返回結果。每個系統都有自己的詞庫,搜索的很多優化都是集中在詞庫的優化上。

數據處理之搜索如何命中

一、分詞

分詞是對用戶輸入的信息進行解讀,是自然語言處理的重要步驟。同機器學習原理一樣,分詞將非結構化的數據轉化為結構化數據,結構化的數據就可以轉化為數學問題了,解決數學問題正是計算機之所長。

1.1 分詞的原因

搜索系統的詞庫無論如何優化、完善都是有限的,但用戶的輸入是沒有限制的。那么如何把用戶無限制的輸入對應到有限的詞庫并返回結果呢?

這就需要引入一個新的概念——分詞。簡單說就是:系統在對用戶輸入的內容無法精確匹配時,會將內容進行切分,使切分后的詞能夠匹配到系統的詞庫。仍以上圖為例,如果用戶輸入“北京最大的火鍋店”,系統中并沒有這個詞,精確匹配的情況下沒有任何結果,此時會將輸入內容進行切分,于是

“北京最大的火鍋店”——> “北京”、“最大”、“的”、“火鍋店”。

拆解后每個詞就匹配到了相應的內容,排序后就會返回結果。并不是所有的詞都會返回有價值的結果,比如案例中的“的”,幾乎所有的信息里面都會含有這個字,因此在系統分詞時會被直接忽略掉。

1.2 分詞的種類、區別

分詞有兩種,中文分詞和英文分詞,二者有著本質的區別。

區別1:分詞方式不同,中文分詞更難更復雜

英文有天然的空格作為分隔符,但中文沒有,如何將一段中文進行拆分是一個難點,切分時斷點不同,造成的結果也不同(即歧義識別),如“我們三人一組”就可以有兩種分詞方式:“我們三人/一組”和“我們/三人一組”。還有一個難點是新詞識別,即識別未在詞典中收錄的詞。

區別2:英文單詞有多種形態

英文單詞存在著豐富的變形和變換,如復數形式,過去式、正在進行式等,為了應對這些復雜的變換,在處理英文時會進行詞形還原和詞干提取。

詞形還原:does、did、done、doing會通過詞形還原轉化為do;

詞干提取:cities、children、trees會通過詞干提取轉化為city、child、tree。

區別3:中文分詞需要考慮分詞粒度的問題

分詞粒度不同,返回的結果也不同,如“北京科學技術研究院”就有多種分法:“北京科學技術研究院”、“北京/科學技術/研究院”、“北京/科學/技術/研究院”。粒度越大,表達的意思就越準確,但是返回的結果也就越少,因此在分詞是要根據不同的場景和要求選擇不同的分詞粒度。

1.3 分詞的方法

① 基于詞典分詞

基于詞典匹配是最早的分詞方法,比較典型的有:正向最大匹配法、逆向最大匹配法、雙向最大匹配法。

(1)正向最大匹配法

step1:匹配時從前往后取詞,取前m個字(m為詞典里最長的詞的字數)開始掃描;

step2:若這m個詞掃描有結果,則匹配成功,將m個詞切分出來,語句中剩下的詞繼續進行切分;

step3:若這m個詞掃描無結果,則取前m-1個字繼續掃描,每次減一個字,直到詞典命中或剩下1個字;

step4:重復以上步驟,直至語句全部匹配完成。

數據處理之搜索如何命中

(2)逆向最大匹配法

匹配時從后往前取詞,其他邏輯和正向相同。

數據處理之搜索如何命中

(3)雙向最大匹配法

由于正向最大匹配法和逆向最大匹配法都有其局限性,因此產生了雙向最大匹配法。即按照正向和逆向分別進行切分,然后進行對比,選取其中一種分詞結果輸出。

對比原則:①如果正反向分詞結果詞數不同,則取分詞數量少的那個;② 如果詞數相同且結果也相同,返回任意一個,如果詞數相同但結果不同,取單字數量較少的那個(單字越少越準確)。

上面提到的幾種切分方法是從不同的角度來處理歧義問題,每種方法只能解決有限類別的歧義問題。隨著詞典的增大,詞與詞之間的交叉更加嚴重,歧義帶來的負面影響也更加嚴重。同時,上面提到的切分方法對于新詞的切分是完全無能為力的。

② 基于統計分詞

基于統計分詞有兩類,第一類是統計取詞法(或無詞典分詞法),把每個詞看做是由字組成的,如果相連的字在不同文本中出現的次數越多,就證明這段相連的字很有可能就是一個詞。

舉例:比如詞a出現的概率為P(a),詞b出現的概率為P(b),a+b這個詞組出現的概率為P(a+b),如果P(a+b)>P(a)*P(b),則能證明a+b不是一個隨機出現的組合,要么是一個新詞,要么是個詞組或者短語。

但這種方法也有一定的局限性,會經常抽出一些共現頻度高、但并不是詞的常用字組,例如“這一”、“之一”、“有的”、“我的”、“許多的”等,并且對常用詞的識別精度差,成本大。在實際應用中通常結合詞典分詞的方法使用,既發揮了詞典分詞切分速度快、效率高的特點,又利用了無詞典分詞結合上下文識別生詞、自動消除歧義的優點。

另一類是基于統計機器學習的方法,在給定大量已經分詞的文本的前提下,利用統計機器學習、模型學習詞語切分的規律(稱為訓練),從而實現對未知文本的切分。這種方法的缺點就是需要有大量預先分好詞的語料作支撐,而且訓練的成本也很高。比較經典的是N元文法模型(N-gram)。

N元模型(N-gram)切詞

基于N元模型的切詞策略是:一段文本存在多種可能的切分結果(切分路徑),將訓練好的N-gram模型進行路徑計算得到最優切分路徑并返回結果。

舉例:對“他說的確實在理”進行切詞。

在N-gram模型的算法中,每個路徑上的邊都是一個N-gram的概率,于是得到如下概率路徑有向圖:

數據處理之搜索如何命中

可能的切分路徑有:他說/的確/實在/理 、他說的/確實/在理、 他說的/確/實在/理、 他/說/的確/實在/理、 他/說的/確/實在/理……

假設隨機變量S為一個漢字序列,W是S上所有可能的切分路徑(如上圖所有從頭至尾的不同路徑)。對于分詞,實際上就是求解使條件概率P(W∣S)最大的切分路徑W*,P(W∣S)即為每條路徑的衡量標準。

數據處理之搜索如何命中

至此,分詞任務就轉變成了一個數學問題。

③ 基于序列標注分詞

基于序列標注分詞是把分詞過程視為字在字串中的標注問題(例如將字標注為“首字中間字尾字”或者其他標注方式),當這些標注完成的時候切詞也就自然完成了。這種策略能夠平衡地看待字典詞和新詞(未收錄到詞典的詞)的識別問題,大大簡化了使用門檻,并得到一個相當不錯的切詞結果。如條件隨機場(CRF)、隱馬爾科夫模型(HMM)、最大熵算法、神經網絡分詞模型等。

隱馬爾科夫模型(HMM)切詞

將文字序列按照詞首、詞中、詞尾、單字詞進行標注。

舉例:研究生說的確實在理

數據處理之搜索如何命中

當每個字的標注都得出的時候,切詞也就順理成章得完成了。

二、篩選

將用戶輸入的信息進行切分后,對引庫中的內容進行匹配篩選。判定用戶想要的結果是否被篩選出來,一般會從精確率(Precision)、召回率(Recall)和F1(F1-Measure)值三個維度進行衡量,這也是搜索優化中是關鍵性指標,涉及到人工打分和更高級的優化。

精確率:所有搜到的內容里面,相關的內容的比例。

召回率:所有應該搜到的內容里面,真正被搜出來的比例。

舉例:假設此時有7個桔子和3個蘋果放在一起,我想篩選出所有的桔子,系統最終篩選出了6個,其中有4個桔子。那么精確率P=4/6,召回率R=4/7。

F1值:精確值和召回率的調和均值, 也就是:

數據處理之搜索如何命中

Q:為什么會有F1值的存在呢?有精確率和召回率不夠嗎?

A:答案是:不夠!正常情況下我們是期望精確率和召回率越高越好,但這兩者在某些情況下是相互矛盾的。仍以桔子蘋果為例,如果系統只篩選出了1個桔子,那么精確率就是100%,召回率是1/7就會很低;如果系統一次篩選出了10個,那么召回率就是100%,精確率就只有70%。

除此之外,還有一個比較容易混淆的概念:準確率(Accuracy),即判斷正確的數目與總數目的比值,其中判斷正確的數目包含篩選出的符合要求的和未篩選出的不符合要求的。

仍以桔子蘋果為例,準確率A=(4+1)/10=50%,即系統正確篩選出的水果(正確識別了4個桔子+正確識別了1個蘋果)與總數的比值。

準確率一般不用于搜索召回的衡量,原因是若上例中蘋果數量為100萬個,桔子7個時,那么不管怎么篩選,準確率都是99.99%+,顯然這是不符合要求的。

三、排序

排序影響著搜索的結果質量,越往前的結果越容易獲得用戶的點擊。好的搜索不僅僅是把應該搜索的內容盡可能的搜索出來,同時還要考慮把最容易吸引用戶的內容展示在前面,因此這里就涉及到兩個因素:文本數據和業務數據。

3.1 文本數據

文本數據即文本的相關性分數乘以權重。關于如何計算文本的相關性,市面上已經有成熟的開源解決方案,如Lucene算法。然后根據文本類型給出相應的權重,比如系統中有標題、描述和正文三種文本,根據重要性分別賦予不同權重:標題權重為10,導語權重為5,正文權重為1。

3.2 業務數據

業務數據即數據的分數乘以權重。關于數據的分數是數據具體的值。然后根據業務類型給出相應的權重,比如系統中有評論量、分享數、閱讀量三種數據,根據重要性分別賦予不同權重:評論數權重為10,分享數權重為20,閱讀量權重為1。

舉例:以基于Lucence的Solr系統為例,得分公式如下:

數據處理之搜索如何命中

其中Nx為文本分數權重,Mx為文本數據相關性分數,Ky為數據分數權重,Ly為數據分數。

由此可以看出,對文本數據和業務數據賦予的權重直接影響最終的排序結果,如何賦值、賦予何值需要基于對業務的理解和認知,這也是一個搜索系統設計最核心的部分。

 

作者:墨白,公眾號:UED_family

本文由 @墨白 原創發布于人人都是產品經理。未經許可,禁止轉載

題圖來自Unsplash,基于CC0協議

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 這篇文章的目標人群大部分是我們從業者,一般人可看不下去呢。

    回復
    1. 前輩 搜索的邏輯在需求文檔如何去描述呢,只需要說是完全匹配還是模糊匹配,返回相關度最高的結果嗎

      來自四川 回復
  2. 想問下 文中提到的文本相關性分數是匹配的時候框架計算好給的嗎

    回復
  3. 贊??雖然算法部分看不懂??

    回復
  4. 沒進來之前,以為是教大家如何命中搜索流量的… 看了前1/3發現原來是講搜索背后的原理的,但還挺有趣… 再往下看1/3,看到數學公式開始發出“臥槽,這是什么”的感慨… 最后1/3我沒看,直接劃到評論,和大佬問聲好

    來自四川 回復
    1. ? ?

      來自北京 回復
  5. 有用!

    回復