互聯網從開始出現,若是就信息獲取方面的話,到如今經歷了三個大的時期,最開始是人工信息的分類時期
,做爲一個上了歲數的人,是經歷過那個時期的,那個時期如何來找信息呢?咱們來看看幾張圖,下面這張圖是1999年1月的搜狐主頁,中間那一片就是人工整理出來的分類。python
若是咱們點擊其中的科學與技術
,將看到下面這張圖,這張裏面就有跟多的細分類了算法
若是咱們繼續點擊計算機科學
,能夠看到下面這個網頁,這裏就是一個一個的網站了,你看,一共才22個,可見那時候的信息量多麼缺少。數組
這些都是人工整理出來的,這也是上個世紀和本世紀初最初的互聯網了,你們都是在這種人工整理的網站中經過分類找到本身想要的信息。微信
後來,搜索引擎出現了,出現了第二個時期,那就是經過關鍵字在全網檢索信息時期了
,這種分類的檢索方式天然就淘汰了,我想全部人都經歷着這個時期吧,典型的就是谷歌和百度了。cookie
再到如今,已是一個信息過載的時代了,搜索已經不能很好的找到信息了,更多的是須要機器幫咱們發現咱們感興趣的信息了,因而出現了搜索將死,推薦上位的論調,這個時期就是信息發現時期了
,主要靠推薦引擎來幫助咱們發現信息了,特別和移動端一結合,以前雙手啪啪啪
的打擊鍵盤檢索信息,變成了大拇指唰唰唰
的刷新手機屏幕了。架構
好了,上面扯了這麼多,今天咱們要說的主角---相關搜索
,就是一個在搜索系統下的推薦系統技術了。app
仍是老路子,什麼是相關搜索,很簡單,下圖這個是相關搜索,我搜索分形
的時候給個人推薦詞機器學習
相關搜索的做用也很明顯,能夠提升用戶的搜索體驗,當你經過一個關鍵詞沒法找到你想要的東西的時候,相關搜索極可能能幫到你,和搜索提示不一樣,搜索提示主要用的前綴匹配的模式,關注的是你尚未點擊搜索鍵的時候猜想你想搜什麼,而相關搜索是你點擊搜索鍵之後猜想你可能還想搜什麼,因此相關搜索更加相似於一個推薦系統。oop
相關搜索的點擊率仍是比較可觀的,若是相關搜索作得好,經過相關搜索的一些引導,能夠幫用戶更準確的找到想要的東西。學習
若是我直接告訴你相關搜索
的技術棧和算法,而後告訴你都用什麼架構來實現,那沒什麼意思,特別是與算法有點關係的系統,爲何要用這些東西,經過一種什麼思路來考慮能獲得這個算法和架構,這纔是設計一個系統所必須的,咱們一步一步來看看如何設計一個相關搜索
的系統。
很簡答,相關搜索系統的輸入爲用戶的搜索詞,而輸出是一堆與這個詞相關的其餘詞。
從咱們上面圖看到的狀況和你們本身腦子想的狀況,最基本的狀況是,輸出的詞最好是輸入詞的近義詞,這是你們都能考慮到的,但這遠遠不夠,首先要想一想相關搜索的做用,是讓用戶更多的點擊推薦出來的詞,若是僅僅是近義詞點擊率確定上不去,再擴展一點,就是要經過用戶輸入的詞爲基準,幫用戶發現更多的和他的意圖相關的詞
。
要找到輸出的詞和輸入的關係,咱們先要看看咱們有什麼數據,沒有數據啥都幹不了,首先,若是是近義詞的匹配,咱們有詞典,可是這東西然並卵,沒有什麼用戶輸入的詞正好在你的詞典中,即使有,詞典中的近義詞也少得可憐。咱們還有什麼呢?還有的就是用戶行爲了,包括用戶的搜索記錄和點擊記錄,瀏覽記錄,OK,在這上面大有文章可作。
經過用戶數據,咱們能夠作如下簡單的考慮。
首先,從人的角度來考慮,若是你搜索一個詞,發現沒有你想要找的東西,你首先想到的就是換一個詞,這個詞多是近義詞,多是個更復雜的詞,好比你搜索蘋果電腦
,你發現結果不怎麼好,你本身會把搜索詞改爲apple筆記本電腦
,而後找到你須要的東西,這個apple筆記本電腦
就是你此次搜索行爲中蘋果電腦
的後繼詞
了,因此這種行爲是咱們可用的,這至關於讓用戶幫你找近義詞。
還有,從搜索詞自己來考慮,若是某些詞搜索出來的結果有不少交集,那麼這些詞極可能也是有關係的。
再有,從搜索結果集來考慮,若是某個搜索結果(好比一個網頁或者一個商品)出如今了不一樣的搜索詞的結果集中,那麼這些個搜索詞極可能是相關的,若是這個搜索結果在不一樣的搜索詞下都被點擊了,那麼這些個詞的相關性就更高了。
除了上述的幾個辦法,還有不少其餘的辦法找到相關搜索詞,這裏咱們就不深刻了,你們能夠本身想想還有什麼其餘辦法來找輸入和輸出的關係。
好了,上面咱們已經想到了幾種辦法來找到輸入和輸出之間的關係,下面咱們來一個一個來看看如何進行實現。
既然已經肯定了找相關詞的思想,那麼咱們接下來看看若是來實現這些個算法吧,下面說的東西都是很基礎的,沒有涉及什麼數學原理,實際的工做中仍是有一些技巧的。
後繼詞是一次用戶的搜索行爲產生的,那麼如何定義一次搜索行爲
呢?很簡單的辦法就是咱們把用戶在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行代碼,你已經完美的運用了大數據
了,呵呵。
經過這種算法,比較容易找出這樣的後繼詞出來,由於用戶的後繼搜索詞基本上是前一個搜索詞對應的長尾詞
史記 : 史記中華書局 | 史記白話版中華書局 | 史記文言文白話對照 。。。。
你再仔細想一想,若是咱們的搜索日誌足夠多,那麼能夠把相同搜索記錄的用戶聚合起來,變成相似下面的數據格式
某些用戶:三國志 後繼詞:資治通鑑 | 三國志 白話版 | 二十四史
某些用戶:史記 後繼詞:資質通鑑 | 史記 白話版
某些用戶: 二十四史 後繼詞:資治通鑑 | 中國曆代政治得失
若是出現了上面的狀況,就變成了一個用戶的協同過濾算法了,那麼能夠給史記
推薦中國曆代政治得失
了,具體協同過濾算法看文章最後的連接。
上面是從用戶的行爲來考慮問題,若是咱們從搜索詞來考慮問題的話,若是某些搜索詞有着相同的搜索結果,那麼咱們認爲這些搜索也是相關的,如何來肯定相關性呢?咱們仍是從搜索日誌來入手。
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)卡一下,就獲得最後的相關搜索的結果了。
這個計算類似性的方法的計算量比較大,並且閾值沒有卡好的話容易出現不相關的結果,在實際工程應用中使用得很少,下面這個方法使用得更多點,至關於這個的增強版。
若是某個搜索結果(好比一個網頁或者一個商品)出如今了不一樣的搜索詞的結果集中,那麼這些個搜索詞極可能是相關的,若是這個搜索結果在不一樣的搜索詞下都被點擊了,那麼這些個詞的相關性就更高了。
點擊的加成是很強大的,並且在數據量巨大的狀況下,咱們能夠只考慮點擊的狀況,仍是拉出搜索日誌,不過此次是搜索點擊日誌了,拉出來處理一下就變成下面這個樣子,每行就是某個搜索詞下點擊的商品
key:搜索詞A click:結果A 結果B 結果C
這個樣子和上面第二種方法最後出來的樣子基本同樣,不過此次是點擊數據,相關性可比直接的搜索結果要好不少了,由於搜索結果取決於你的搜索算法,而這種點擊數據是來自用戶的,人的可靠性可高了很多,因此說這個是上一個的增強版。
咱們能夠按照上一個的方法按文本類似性的方法進行處理,可是計算量也比較大,若是再仔細看看這個數據的樣子,若是咱們把相關搜索系統想象成豆瓣
,搜索詞當作豆瓣的用戶
,搜索結果集當作是豆瓣的電影
,那麼相關搜索就變成了一個豆瓣的猜你感興趣的人
,也變成了一個協同過濾的推薦系統了(協同過濾算法能夠參考文章最後的連接),上一節的協同過濾算法的數據是詞和後繼詞
,這裏是詞和點擊結果
,雖然數據集不一樣,可是能夠用同樣的算法,因此,搜索和推薦技術實際上是密不可分的,既然這樣,徹底能夠用協同過濾算法進行推薦了。
協同過濾的算法,簡單版本總體不會超過200行,很容易實現的。
經過這樣的方式,容易推出意思相近的詞,一樣也容易推出看似徹底不相關但仔細想一想仍是靠譜的詞,就像下面這樣,他們雖然不見得近義詞,可是極可能會點擊到同一個結果上。
分形 : 分形理論 | 分形圖像 | 分形數學
機器學習 :吳恩達 | 數據挖掘 | 機器學習 周志華
林心如 :霍建華 | 任重 | 何潤東 .......
既然上面提到了一下機器學習,其實還有更高端一點的算法,就是用機器學習了,呵呵。咱們若是把上面的結果key:搜索詞A click:結果A 結果B 結果C
處理一下,變成下面的樣子,表示每一個結果集對應的搜索詞。
結果A : 搜索詞A 搜索詞B 搜索詞C.... 結果B : 搜索詞B 搜索詞A 搜索詞D.....
變成上面這個樣子難度不大吧,就是作個倒排就好了,好了,咱們把一行當作一篇文檔,每一個搜索詞當作一個詞,不就是求各個詞的類似性嘛,祭出神器Word2Vec
,直接計算每一個搜索詞的詞向量
,而後計算各個詞向量之間的類似性,就能夠算出每一個詞應該推薦的詞了。
在這裏,咱們使用了當前最火的機器學習
哦,若是用word2vec
的庫來實現的話,代碼一樣不超過20行,呵呵,word2vec
我以前的文章也有說過,能夠看看底部的連接
上面說了4個方法進行相關搜索的推薦,還有其餘的嗎?只要你肯想,那必然還有啊,好比有些搜索詞很長尾,像龍門書局高中物理習題黃岡小狀元
這種詞估計沒什麼人搜吧,給他作推薦就比較難了,那麼若是給他作相關推薦呢?能夠找出中心詞來,這裏的中心詞應該算是高中物理習題
吧,至關於把這種長尾詞按中心詞去推薦,若是找中心詞呢?這又是一個話題了。
因此別看一個小小的相關搜索系統,要考慮的東西仍是不少不少的。
上面說了四種模型,若是使用呢?呵呵,相關搜索不是有不少詞嘛,很簡單拉,每一個模型分幾個詞,看看哪一個模型效果好,哪一個模型出來的詞用戶點得多再調整唄,咱們看看京東,搜索資治通鑑
的時候他們的相關搜索以下。
我估計啊資治通鑑 中華書局
,資治通鑑 柏楊
這種就是第一種模型推出來的,就是後繼詞部分推薦出來的,而史記
,二十四史
這類應該就是經過協同過濾推薦出來的,至因而哪一種協同過濾就很差推測了。
總的來講,相關搜索
一類結果是爲了更準確的找結果
一類是爲了擴展搜索,找到更多的東西。
既然這樣,就會出現兩類相關的技術,當第一類需求,爲了更準確的找結果,能夠用到搜索系統的query分析上,也能夠用來影響搜索結果的排序,爲了更好出搜索結果,讓搜索系統不斷進化。
二第二類屬於query的擴展,能夠用在搜索廣告系統中,廣告的結果集通常是沒有搜索那麼大量級的,因此一樣的搜索詞,極可能有搜索結果可是沒有廣告結果,這怎麼能忍,若是咱們能把搜索詞多擴展一點,一樣能夠推出相關的廣告,雖然相關性沒有那麼強,但至少出來了,出來了就有人點,有人點就有收入啊。
一個小小的相關搜索,用到了很多推薦技術,而進一步把相關搜索作好,能夠反饋給搜索系統自己,也能夠用來提高廣告系統的效果,因此說搜索,推薦,廣告永遠是分不開的,無論是底層的技術,仍是底層的數學模型,仍是上層的技術產出,都是能夠共用的。
本篇就到這裏,後面還會繼續相關搜索,主要就是聊聊相關搜索的技術架構和實現方式了,本篇所說的算法模型都是最最基礎的,而且在實現的過程當中並無我上面說的那麼容易,好像幾百行代碼就能搞定似的:)實際上相關搜索要是作仍是能夠作得很深刻的。
若是你以爲不錯,歡迎轉發給更多人看到,也歡迎關注個人公衆號,主要聊聊搜索,推薦,廣告技術,還有瞎扯。。文章會在這裏首先發出來:)掃描或者搜索微信號XJJ267
或者搜索西加加語言
就行