相關搜索 --- 搜索中的推薦

0. 前面的瞎扯淡

互聯網從開始出現,若是就信息獲取方面的話,到如今經歷了三個大的時期,最開始是人工信息的分類時期,做爲一個上了歲數的人,是經歷過那個時期的,那個時期如何來找信息呢?咱們來看看幾張圖,下面這張圖是1999年1月的搜狐主頁,中間那一片就是人工整理出來的分類。python

圖片描述

若是咱們點擊其中的科學與技術,將看到下面這張圖,這張裏面就有跟多的細分類了算法

圖片描述
若是咱們繼續點擊計算機科學,能夠看到下面這個網頁,這裏就是一個一個的網站了,你看,一共才22個,可見那時候的信息量多麼缺少。數組

圖片描述
這些都是人工整理出來的,這也是上個世紀和本世紀初最初的互聯網了,你們都是在這種人工整理的網站中經過分類找到本身想要的信息。微信

後來,搜索引擎出現了,出現了第二個時期,那就是經過關鍵字在全網檢索信息時期了,這種分類的檢索方式天然就淘汰了,我想全部人都經歷着這個時期吧,典型的就是谷歌和百度了。cookie

再到如今,已是一個信息過載的時代了,搜索已經不能很好的找到信息了,更多的是須要機器幫咱們發現咱們感興趣的信息了,因而出現了搜索將死,推薦上位的論調,這個時期就是信息發現時期了,主要靠推薦引擎來幫助咱們發現信息了,特別和移動端一結合,以前雙手啪啪啪的打擊鍵盤檢索信息,變成了大拇指唰唰唰的刷新手機屏幕了。架構

好了,上面扯了這麼多,今天咱們要說的主角---相關搜索,就是一個在搜索系統下的推薦系統技術了。app

1. 什麼是相關搜索

仍是老路子,什麼是相關搜索,很簡單,下圖這個是相關搜索,我搜索分形的時候給個人推薦詞機器學習

圖片描述

2. 相關搜索有什麼做用

相關搜索的做用也很明顯,能夠提升用戶的搜索體驗,當你經過一個關鍵詞沒法找到你想要的東西的時候,相關搜索極可能能幫到你,和搜索提示不一樣,搜索提示主要用的前綴匹配的模式,關注的是你尚未點擊搜索鍵的時候猜想你想搜什麼,而相關搜索是你點擊搜索鍵之後猜想你可能還想搜什麼,因此相關搜索更加相似於一個推薦系統。oop

相關搜索的點擊率仍是比較可觀的,若是相關搜索作得好,經過相關搜索的一些引導,能夠幫用戶更準確的找到想要的東西。學習

3. 如何來考慮相關搜索

若是我直接告訴你相關搜索的技術棧和算法,而後告訴你都用什麼架構來實現,那沒什麼意思,特別是與算法有點關係的系統,爲何要用這些東西,經過一種什麼思路來考慮能獲得這個算法和架構,這纔是設計一個系統所必須的,咱們一步一步來看看如何設計一個相關搜索的系統。

3.1 系統的輸入輸出

很簡答,相關搜索系統的輸入爲用戶的搜索詞,而輸出是一堆與這個詞相關的其餘詞。

3.2 輸入和輸出之間的關係

從咱們上面圖看到的狀況和你們本身腦子想的狀況,最基本的狀況是,輸出的詞最好是輸入詞的近義詞,這是你們都能考慮到的,但這遠遠不夠,首先要想一想相關搜索的做用,是讓用戶更多的點擊推薦出來的詞,若是僅僅是近義詞點擊率確定上不去,再擴展一點,就是要經過用戶輸入的詞爲基準,幫用戶發現更多的和他的意圖相關的詞

3.3 如何來找到輸入輸出的關係

要找到輸出的詞和輸入的關係,咱們先要看看咱們有什麼數據,沒有數據啥都幹不了,首先,若是是近義詞的匹配,咱們有詞典,可是這東西然並卵,沒有什麼用戶輸入的詞正好在你的詞典中,即使有,詞典中的近義詞也少得可憐。咱們還有什麼呢?還有的就是用戶行爲了,包括用戶的搜索記錄和點擊記錄,瀏覽記錄,OK,在這上面大有文章可作。

經過用戶數據,咱們能夠作如下簡單的考慮。

  • 首先,從人的角度來考慮,若是你搜索一個詞,發現沒有你想要找的東西,你首先想到的就是換一個詞,這個詞多是近義詞,多是個更復雜的詞,好比你搜索蘋果電腦,你發現結果不怎麼好,你本身會把搜索詞改爲apple筆記本電腦,而後找到你須要的東西,這個apple筆記本電腦就是你此次搜索行爲中蘋果電腦後繼詞了,因此這種行爲是咱們可用的,這至關於讓用戶幫你找近義詞。

  • 還有,從搜索詞自己來考慮,若是某些詞搜索出來的結果有不少交集,那麼這些詞極可能也是有關係的。

  • 再有,從搜索結果集來考慮,若是某個搜索結果(好比一個網頁或者一個商品)出如今了不一樣的搜索詞的結果集中,那麼這些個搜索詞極可能是相關的,若是這個搜索結果在不一樣的搜索詞下都被點擊了,那麼這些個詞的相關性就更高了。

除了上述的幾個辦法,還有不少其餘的辦法找到相關搜索詞,這裏咱們就不深刻了,你們能夠本身想想還有什麼其餘辦法來找輸入和輸出的關係。

好了,上面咱們已經想到了幾種辦法來找到輸入和輸出之間的關係,下面咱們來一個一個來看看如何進行實現。

4. 肯定算法模型

既然已經肯定了找相關詞的思想,那麼咱們接下來看看若是來實現這些個算法吧,下面說的東西都是很基礎的,沒有涉及什麼數學原理,實際的工做中仍是有一些技巧的。

4.1 純後繼詞

後繼詞是一次用戶的搜索行爲產生的,那麼如何定義一次搜索行爲呢?很簡單的辦法就是咱們把用戶在5分鐘內輸入的搜索詞定義爲一次搜索行爲,這也很好理解,你搜索一個詞,發現沒找到你要的東西,你換詞通常也在一分鐘以內,你不太可能搜了一個詞,而後左思右想了半個小時,再換一個詞,那得多蠢的人才能幹出來啊。

有了搜索行爲的定義,那麼把搜索日誌拉出來,搜索日誌通常長成這樣子

key:搜索詞  time:搜索時間 cookie:用戶cookieid result:a,b,c,d,e(前5個搜索結果)

首先按照用戶進行分類,而後按照搜索的時間間隔(5分鐘)進行數據的清理,把搜索日誌整理成這樣子了,表示某個用戶的搜索後繼詞,三個數組表示屢次搜索行爲,每一個數組的第一個詞就是當次搜索行爲的第一個搜索詞。

cookie:用戶cookieid  keys:[A1,A2.....] [B1,B2.....] [C1,C2.....]

光有了這個還不夠,由於對於單個用戶來說,搜索後繼詞的準確性仍是不夠的,由於你有可能上一秒搜索的蒼老師,後一秒發現老闆站你後面了,馬上把搜索詞改爲了社會主義核心價值觀,你說這兩個詞能有相關性麼?因此咱們還須要把多個用戶的後繼詞合併起來,加入一點統計規則,去掉一些雜質,好比某個詞B只有出如今5個用戶的相同的搜索詞A的後繼詞中才算一個A的後繼詞,還有其餘的一些規則,這麼下來,日誌就變成了。

key:A   succeed:A1,A2,A3.....

好了,至此,就完成了原始日誌到後繼詞表的轉換了,很簡單把,就是幾個hadoop做業一跑就搞定了,若是日質量不大的話(20G之內),單機跑都沒問題,若是是python,代碼估計不超過100行,就是這有100行代碼,你已經完美的運用了大數據了,呵呵。

經過這種算法,比較容易找出這樣的後繼詞出來,由於用戶的後繼搜索詞基本上是前一個搜索詞對應的長尾詞

史記 : 史記中華書局 | 史記白話版中華書局 | 史記文言文白話對照 。。。。

4.2 加點用戶的料

你再仔細想一想,若是咱們的搜索日誌足夠多,那麼能夠把相同搜索記錄的用戶聚合起來,變成相似下面的數據格式

某些用戶:三國志 後繼詞:資治通鑑 | 三國志 白話版 | 二十四史
某些用戶:史記 後繼詞:資質通鑑 | 史記 白話版
某些用戶: 二十四史 後繼詞:資治通鑑 | 中國曆代政治得失

若是出現了上面的狀況,就變成了一個用戶的協同過濾算法了,那麼能夠給史記推薦中國曆代政治得失了,具體協同過濾算法看文章最後的連接。

4.3 從搜索詞來考慮

上面是從用戶的行爲來考慮問題,若是咱們從搜索詞來考慮問題的話,若是某些搜索詞有着相同的搜索結果,那麼咱們認爲這些搜索也是相關的,如何來肯定相關性呢?咱們仍是從搜索日誌來入手。

key:搜索詞  time:搜索時間 cookie:用戶cookieid result:a,b,c,d,e(前5個搜索結果)

此次,咱們只用key和result兩項,稍微處理下來之後就變成了

key:搜索詞A result:a,b,c,d,e(前5個搜索結果)
key:搜索詞B result:a,f,c,g,m(前5個搜索結果)

若是咱們把每一行數據的result想象成一篇文檔,result裏面的每一個結果集想象成一個詞語,那麼這其實就是求兩個文檔之間的類似性了,從頭至尾過一遍就能夠找到每一行數據和它最類似的數據了,而每一行能夠用當行的搜索詞表示,這麼一算下來數據就變成這樣子了,後面的括號裏面是兩個詞的類似度,若是想知道文本的類似性如何計算,能夠參考我以前的文章,本文最後有連接。

key:搜索詞A   succeed:搜索詞B(0.8)  搜索詞C(0.6).....
key:搜索詞B   succeed:搜索詞A(0.8)  搜索詞E(0.7).....

有了上面這個數據,拍一個閾值(好比0.7)卡一下,就獲得最後的相關搜索的結果了。

這個計算類似性的方法的計算量比較大,並且閾值沒有卡好的話容易出現不相關的結果,在實際工程應用中使用得很少,下面這個方法使用得更多點,至關於這個的增強版。

4.3 從結果集考慮

若是某個搜索結果(好比一個網頁或者一個商品)出如今了不一樣的搜索詞的結果集中,那麼這些個搜索詞極可能是相關的,若是這個搜索結果在不一樣的搜索詞下都被點擊了,那麼這些個詞的相關性就更高了。

點擊的加成是很強大的,並且在數據量巨大的狀況下,咱們能夠只考慮點擊的狀況,仍是拉出搜索日誌,不過此次是搜索點擊日誌了,拉出來處理一下就變成下面這個樣子,每行就是某個搜索詞下點擊的商品

key:搜索詞A  click:結果A 結果B 結果C

這個樣子和上面第二種方法最後出來的樣子基本同樣,不過此次是點擊數據,相關性可比直接的搜索結果要好不少了,由於搜索結果取決於你的搜索算法,而這種點擊數據是來自用戶的,人的可靠性可高了很多,因此說這個是上一個的增強版。

咱們能夠按照上一個的方法按文本類似性的方法進行處理,可是計算量也比較大,若是再仔細看看這個數據的樣子,若是咱們把相關搜索系統想象成豆瓣,搜索詞當作豆瓣的用戶,搜索結果集當作是豆瓣的電影,那麼相關搜索就變成了一個豆瓣的猜你感興趣的人,也變成了一個協同過濾的推薦系統了(協同過濾算法能夠參考文章最後的連接),上一節的協同過濾算法的數據是詞和後繼詞,這裏是詞和點擊結果,雖然數據集不一樣,可是能夠用同樣的算法,因此,搜索和推薦技術實際上是密不可分的,既然這樣,徹底能夠用協同過濾算法進行推薦了。

協同過濾的算法,簡單版本總體不會超過200行,很容易實現的。

經過這樣的方式,容易推出意思相近的詞,一樣也容易推出看似徹底不相關但仔細想一想仍是靠譜的詞,就像下面這樣,他們雖然不見得近義詞,可是極可能會點擊到同一個結果上。

分形 : 分形理論 | 分形圖像 | 分形數學
機器學習 :吳恩達 | 數據挖掘 | 機器學習 周志華
林心如 :霍建華 | 任重 | 何潤東 .......

4.4 機器學習

既然上面提到了一下機器學習,其實還有更高端一點的算法,就是用機器學習了,呵呵。咱們若是把上面的結果key:搜索詞A click:結果A 結果B 結果C 處理一下,變成下面的樣子,表示每一個結果集對應的搜索詞。

結果A  : 搜索詞A  搜索詞B 搜索詞C....
結果B  : 搜索詞B  搜索詞A 搜索詞D.....

變成上面這個樣子難度不大吧,就是作個倒排就好了,好了,咱們把一行當作一篇文檔,每一個搜索詞當作一個詞,不就是求各個詞的類似性嘛,祭出神器Word2Vec,直接計算每一個搜索詞的詞向量,而後計算各個詞向量之間的類似性,就能夠算出每一個詞應該推薦的詞了。

在這裏,咱們使用了當前最火的機器學習哦,若是用word2vec的庫來實現的話,代碼一樣不超過20行,呵呵,word2vec我以前的文章也有說過,能夠看看底部的連接

4.5 還有其餘嗎

上面說了4個方法進行相關搜索的推薦,還有其餘的嗎?只要你肯想,那必然還有啊,好比有些搜索詞很長尾,像龍門書局高中物理習題黃岡小狀元這種詞估計沒什麼人搜吧,給他作推薦就比較難了,那麼若是給他作相關推薦呢?能夠找出中心詞來,這裏的中心詞應該算是高中物理習題吧,至關於把這種長尾詞按中心詞去推薦,若是找中心詞呢?這又是一個話題了。

因此別看一個小小的相關搜索系統,要考慮的東西仍是不少不少的。

5. 模型MIX

上面說了四種模型,若是使用呢?呵呵,相關搜索不是有不少詞嘛,很簡單拉,每一個模型分幾個詞,看看哪一個模型效果好,哪一個模型出來的詞用戶點得多再調整唄,咱們看看京東,搜索資治通鑑的時候他們的相關搜索以下。

圖片描述

我估計啊資治通鑑 中華書局資治通鑑 柏楊這種就是第一種模型推出來的,就是後繼詞部分推薦出來的,而史記二十四史這類應該就是經過協同過濾推薦出來的,至因而哪一種協同過濾就很差推測了。

6. 總結

總的來講,相關搜索

  • 一類結果是爲了更準確的找結果

  • 一類是爲了擴展搜索,找到更多的東西。

既然這樣,就會出現兩類相關的技術,當第一類需求,爲了更準確的找結果,能夠用到搜索系統的query分析上,也能夠用來影響搜索結果的排序,爲了更好出搜索結果,讓搜索系統不斷進化。

二第二類屬於query的擴展,能夠用在搜索廣告系統中,廣告的結果集通常是沒有搜索那麼大量級的,因此一樣的搜索詞,極可能有搜索結果可是沒有廣告結果,這怎麼能忍,若是咱們能把搜索詞多擴展一點,一樣能夠推出相關的廣告,雖然相關性沒有那麼強,但至少出來了,出來了就有人點,有人點就有收入啊。

一個小小的相關搜索,用到了很多推薦技術,而進一步把相關搜索作好,能夠反饋給搜索系統自己,也能夠用來提高廣告系統的效果,因此說搜索,推薦,廣告永遠是分不開的,無論是底層的技術,仍是底層的數學模型,仍是上層的技術產出,都是能夠共用的。

本篇就到這裏,後面還會繼續相關搜索,主要就是聊聊相關搜索的技術架構和實現方式了,本篇所說的算法模型都是最最基礎的,而且在實現的過程當中並無我上面說的那麼容易,好像幾百行代碼就能搞定似的:)實際上相關搜索要是作仍是能夠作得很深刻的。


若是你以爲不錯,歡迎轉發給更多人看到,也歡迎關注個人公衆號,主要聊聊搜索,推薦,廣告技術,還有瞎扯。。文章會在這裏首先發出來:)掃描或者搜索微信號XJJ267或者搜索西加加語言就行

圖片描述

相關連接:
基於用戶的協同過濾
文本類似性計算

相關文章
相關標籤/搜索