有一個(gè)朋友問,一個(gè)用戶搜索一個(gè)query是“百度”,怎么知道用戶真正是想找什么呢。
我回答說,分析之前搜索這個(gè)query的用戶點(diǎn)了些什么結(jié)果啊。
朋友繼續(xù)問,如果沒有用戶點(diǎn)擊呢。
呃,如果沒有點(diǎn)擊,這個(gè)問題就比較復(fù)雜了。整理了下思路,于是寫成了本文。主要描述了關(guān)于如何預(yù)測(cè)用戶query意圖。希望會(huì)有所幫助。
首先我們的明確一個(gè)標(biāo)準(zhǔn),如何判斷我們對(duì)用戶意圖的猜測(cè)是正確的?
用戶的思維是很發(fā)散的,也許今天搜索“葛優(yōu)”,是想找“讓子彈飛”,明天搜索相同的query,就是想找“非誠勿擾”。 我們確定了要在某個(gè)方面的query預(yù)測(cè)上做一個(gè)改進(jìn),那么我們首先的把標(biāo)準(zhǔn)定下來,依照這個(gè)標(biāo)準(zhǔn)來進(jìn)行改進(jìn)。
現(xiàn)在有很多對(duì)搜索系統(tǒng)的評(píng)價(jià)指標(biāo),如pv,ipv,ctr,搜索引導(dǎo)的后續(xù)轉(zhuǎn)化率等可以量化的指標(biāo),這些指標(biāo)是對(duì)搜索系統(tǒng)總體的評(píng)價(jià)。具體到用戶意圖預(yù)測(cè)上,標(biāo)準(zhǔn)很難確定,對(duì)于排序比較直觀的就是進(jìn)行side by side的評(píng)測(cè),比較原有的效果和改進(jìn)的效果,看是否會(huì)排序更優(yōu);對(duì)于導(dǎo)航,那我們可以看我們預(yù)測(cè)的類目和用戶實(shí)際點(diǎn)的類目的占比,是否能有效降低用戶點(diǎn)擊非推薦類目的比率。
接下來,我們從2種情況下來回答這個(gè)問題,
如果我們已經(jīng)有了一套完整的系統(tǒng),有大量的用戶訪問
先從簡單的說起,假設(shè)我們已經(jīng)有了一個(gè)完整的搜索系統(tǒng),有大量的用戶訪問,我們希望通過對(duì)用戶query的預(yù)測(cè)來提高搜索體驗(yàn)。這樣的系統(tǒng)的大概架構(gòu)如下。
包括圖所示的幾個(gè)部分,
1 前端(f2e)
前端負(fù)責(zé)直接和用戶進(jìn)行交換,當(dāng)收到用戶搜索請(qǐng)求之后,往后端系統(tǒng)傳遞請(qǐng)求,并接收搜索引擎返回的結(jié)果,組織到網(wǎng)頁上,展示給用戶。
前端還肩負(fù)著一個(gè)重要的記錄日志的工作,這個(gè)日志的記錄,并不是apache的訪問日志,這樣的日志內(nèi)容過于簡單。如果要前端記錄過多的日志,又會(huì)給服務(wù)器帶來不小的壓力。所以目前主要的手段是通過用戶在頁面上進(jìn)行搜索或點(diǎn)擊等行為時(shí),調(diào)用javascript向指定的日志服務(wù)器,發(fā)送特征url來記錄,這種url不會(huì)返回內(nèi)容,僅僅為了給日志服務(wù)器添加記錄。發(fā)送的url會(huì)包括從cookie中解析出的用戶特有的數(shù)據(jù)。
2 Query處理
Query處理是線上服務(wù)系統(tǒng),它是對(duì)用戶意圖進(jìn)行預(yù)測(cè)后,對(duì)用戶的搜索結(jié)果進(jìn)行改進(jìn)。在接收到前端的請(qǐng)求之后,會(huì)利用線下對(duì)query分析得到的數(shù)據(jù),對(duì)用戶的query和上下文環(huán)境進(jìn)行分析,附加更多的條件到搜索引擎的請(qǐng)求命令之中。常見的Query處理,會(huì)有以下的一些類容,query改寫,query分類預(yù)測(cè),query的導(dǎo)航等。
Query處理這部分主要的意義在于,將用戶的搜索query,翻譯為對(duì)搜索引擎更適合查詢串。在大多數(shù)情況下,用戶使用搜索引擎是為了解決自己的問題,如果能直接獲得答案,用戶是不大愿意進(jìn)行搜索的。
用戶也許的問題是,“非誠勿擾2里面說的廖凡是誰”這樣的一個(gè)問題,這樣的問題直接搜索是不太會(huì)有會(huì)令用戶比較滿意的答案,(除非有向百度知道這樣的系統(tǒng)已經(jīng)存在了類似的問題)。有些用戶就會(huì)考慮換個(gè)關(guān)鍵詞試試,搜索下“廖凡”,看是否會(huì)有一些答案可以讓自己滿意。所以很大程度上是搜索引擎在教用戶如何使用自己。但是并非所有的用戶都對(duì)搜索系統(tǒng)如此的熟悉,那我們就需要考慮看看在我們搜索的結(jié)果里面效果不太好的query,分析它是怎么構(gòu)成的。我們也許無法準(zhǔn)確回答“非誠勿擾2里面說的廖凡是誰”,但是可以把其中最關(guān)鍵的信息抽取出來“非誠勿擾2”“廖凡”,并且,我們需要回答“是誰”這樣的疑問問題。把這些信息傳遞給引擎,才會(huì)有更好的結(jié)果。
再例如,用戶想找,“1000元左右的手機(jī)”,那么對(duì)于淘寶來說,可以把搜索的條件轉(zhuǎn)化為800-1200價(jià)格限制范圍的,手機(jī)類目下的寶貝,或者更進(jìn)一步,把各種型號(hào)的手機(jī),列在一起,進(jìn)行參數(shù)的比較。
再深入一步,用戶想找“舒淇在非誠勿擾2中用的手機(jī)”,如果我們可以把這個(gè)問題轉(zhuǎn)化為對(duì)“朵唯S920”的搜索,那就是非常非常好的效果了,至于這個(gè)query如何對(duì)應(yīng)到這個(gè)結(jié)果,也許后面的一些分析,能提供一些線索。
具體的實(shí)現(xiàn),可以參考下面幾點(diǎn),
對(duì)query的線上處理,如果是較為hot的query,可以以查表為主,可以用hash表,trie樹等進(jìn)行查表,把在線下計(jì)算好的數(shù)據(jù),通過查表的方式找到對(duì)應(yīng)的結(jié)果,附加到給引擎的搜索條件上,并返回。
另外,可以把線下訓(xùn)練好的模型,在線上進(jìn)行預(yù)測(cè),一般的分類算法預(yù)測(cè)速度都比較快??梢詫?duì)長尾的query,進(jìn)行及時(shí)的預(yù)測(cè)。
也可以做一些規(guī)則,如我們上面舉的例子,“1000元左右”,可以通過正則表達(dá)式進(jìn)行識(shí)別,將其轉(zhuǎn)為對(duì)應(yīng)的搜索條件。這些規(guī)則如何來定呢,這是比較麻煩的一點(diǎn),像這類的query,肯定是pv比較低的,屬于長尾的query,這些query效果提升可能比較明顯,但是對(duì)總體搜索系統(tǒng)效果影響會(huì)較小。這個(gè)問題比較尷尬,如果我們這類query處理的效果好的話,那用戶會(huì)使用的更多;用戶知道了這樣的query效果不好,所以就換成了效果好的query。如果要做好規(guī)則,那就把長尾的這些query都拿出來,多看看,分下類,再結(jié)合實(shí)際的問題分類,總結(jié)出一些通用的規(guī)則,來進(jìn)行優(yōu)化。
3 搜索引擎
搜索引擎主要負(fù)責(zé)檢索和排序,一般由一些倒排表和正排表組成。倒排表用于查找對(duì)應(yīng)的文檔id,能快速的檢索出命中query的文檔,在根據(jù)正排表來查對(duì)應(yīng)id的數(shù)據(jù)。
一般將需要字符串類型的文檔字段作為倒排表來進(jìn)行檢索,字符型的字段可以放在正排表中,在通過倒排表找到了滿足條件的文檔,再在正排表中進(jìn)行過濾。
找到滿足條件的文檔后,再進(jìn)行過濾,統(tǒng)計(jì),并根據(jù)排序參數(shù)進(jìn)行排序。
排序分為2個(gè)部分,一部分是文檔自身的靜態(tài)分,每個(gè)文檔會(huì)有類似pagerank這樣分?jǐn)?shù),另外一部分是還有和query相關(guān)的部分,會(huì)計(jì)算文檔和query的關(guān)系,例如,query中出現(xiàn)的詞的在文檔中是否距離較近,query是否為文檔的中心詞。
4 日志存儲(chǔ)
日志存儲(chǔ)系統(tǒng)收集前端記錄的日志,存儲(chǔ)在數(shù)據(jù)倉庫中,解析后用分布式文件系統(tǒng)來存放。有幾類日志比較重要,
A、 搜索日志,搜索日志一般會(huì)包括以下一些信息,用戶id,session id,用戶搜索query,用戶當(dāng)前搜索的分類,用戶搜索時(shí)間,
B、 點(diǎn)擊日志,用戶id,session id,用戶搜索query,用戶當(dāng)前搜索的分類,用戶點(diǎn)擊的item,用戶點(diǎn)擊時(shí)間
C、 當(dāng)然可能還有其他的如交易記錄等,
有了以上幾個(gè)部分之后,我們就可以通過以下2個(gè)部分來進(jìn)行用戶意圖的預(yù)測(cè),
5 統(tǒng)計(jì)分析
日志分析主要是一種統(tǒng)計(jì)分析,數(shù)據(jù)源來自于訪問日志。另外還可以分析數(shù)據(jù)庫中存儲(chǔ)的用戶的購買,收藏等行為。
可以從日志中分析出用戶搜索query,“nike”最想找的是運(yùn)動(dòng)鞋呢,還是運(yùn)動(dòng)服。
常用的應(yīng)用有下拉提示,相關(guān)搜索等,
下拉推薦是一種比較常用的用戶意圖分析的系統(tǒng),通常是統(tǒng)計(jì)日志中,表現(xiàn)比較好的query,將這些query按照pv和數(shù)據(jù)表現(xiàn)等指標(biāo)進(jìn)行排序,然后把query轉(zhuǎn)化為英文和中文對(duì)應(yīng)的前綴,把相同前綴的建成統(tǒng)一索引,在用戶輸入關(guān)鍵詞后,推薦相應(yīng)的query。
相關(guān)搜索是更為常用的用戶意圖分析,一般通過關(guān)聯(lián)規(guī)則(Apriori,F(xiàn)P-growth),統(tǒng)計(jì)同一sesion中,用戶經(jīng)常出現(xiàn)的相關(guān)的query,比如,可以發(fā)現(xiàn)同一個(gè)session里面搜索了nike的用戶,很多都搜索了“nike dunk”這樣的信息,我們就可以再搜索結(jié)果中進(jìn)行改進(jìn)。這一算法可以大量應(yīng)用于數(shù)據(jù)挖掘。推廣開去,我們要找某個(gè)類目下進(jìn)行了購買的用戶,還希望購買些什么類目的東西;看了一本書的用戶,還會(huì)看什么書;搜索了一個(gè)“長款”屬性,是否還希望“修身”這樣的屬性。
在往下深入,我們可以分析用戶歷史行為,進(jìn)行個(gè)性化的預(yù)測(cè)。比如分析用戶性別,喜好,來進(jìn)行分類,推薦。
6 機(jī)器學(xué)習(xí)
統(tǒng)計(jì)的算法也是機(jī)器學(xué)習(xí)的一種,如果用戶行為數(shù)據(jù)足夠多,那直接使用統(tǒng)計(jì)分析應(yīng)該是可以解決大部分問題。剩下的小部分問題是可以交給機(jī)器學(xué)習(xí)其他算法來完成。
舉一個(gè)簡單的例子來說明,用戶搜索“nike”和“羽絨服”比較多,有了足夠多的統(tǒng)計(jì)數(shù)據(jù),我們知道“nike”對(duì)應(yīng)的是運(yùn)動(dòng)鞋,運(yùn)動(dòng)服等?!坝鸾q服”對(duì)應(yīng)的是服裝。但是用戶搜索“紅色的nike羽絨服”次數(shù)很少,沒有足夠多的數(shù)據(jù),我們統(tǒng)計(jì)到的結(jié)果也許是不準(zhǔn)確的,偏差較大。
那我們可以將較好的數(shù)據(jù)進(jìn)行訓(xùn)練,并對(duì)長尾的query進(jìn)行分類預(yù)測(cè)。這里的訓(xùn)練數(shù)據(jù)的特征是用戶query中每個(gè)詞,詞出現(xiàn)對(duì)應(yīng)這一種分類。
訓(xùn)練數(shù)據(jù)的選擇是分類算法最重要的一步,一般對(duì)文本的分類預(yù)測(cè),可以使用信息增益,卡方,互信息等來作為訓(xùn)練特征。具體問題具體分析,例如使用loglinear算法進(jìn)行預(yù)測(cè),實(shí)驗(yàn)證明信息增益來作為特征選擇會(huì)更加有效,另外也得分析應(yīng)用的場(chǎng)景,根據(jù)需要來選擇算法,選擇特征,法無定法,對(duì)于淘寶的數(shù)據(jù)來說,用于搜索的限于寶貝的標(biāo)題,非常的短,直接使用用一般的網(wǎng)頁分類算法是不太可行的,所以,數(shù)據(jù)不一樣,方法就不一樣,重要的是了解數(shù)據(jù),了解方法的原理。機(jī)器學(xué)習(xí)不是萬能的,不能靠運(yùn)氣。By the way,建議讀下元函的Treelink算法介紹( http://www.searchtb.com/2010/12/an-introduction-to-treelink.html ),寫的挺好的。
分好類后,對(duì)每個(gè)類中的文檔的排序也可以通過機(jī)器學(xué)習(xí)來進(jìn)行,如果每個(gè)文檔有很多標(biāo)準(zhǔn)的特征,每個(gè)維度的特征有一定的分?jǐn)?shù)。這個(gè)也可以通過機(jī)器學(xué)習(xí)的方法來進(jìn)行好中壞分檔,或者找出線性加權(quán)的最優(yōu)化參數(shù)。
假設(shè)我們沒有用戶反饋數(shù)據(jù)
我們首先可以做的是把文檔的自身的相關(guān)性做好,回到最開始的那個(gè)問題,一個(gè)用戶搜索一個(gè)query是“百度”,怎么知道用戶真正是想找什么呢。
先我們至少可以把文檔按分詞后的結(jié)果和query進(jìn)行比較,文檔中如果是“眾里尋他千百度”這樣的就可以過濾掉了,因?yàn)椤扒О俣取焙汀鞍俣取边€是有一些區(qū)別的。這是從文檔自有的相關(guān)性上來進(jìn)行優(yōu)化。
接下來,我們看這個(gè)文檔是不是描述文檔的,比如文檔里面是講“非誠勿擾2”的,里面提到“廖凡,如果你不知道廖凡是誰,請(qǐng)百度一下”,那么這種文檔不是描述“百度”這個(gè)詞的,而是描述“非誠勿擾2的”,我們可以通過給文檔進(jìn)行分類或者加上tag,來表示他的主題詞,這樣,這類的文檔也可以過濾掉。
我們?cè)儆懻撓氯绻M(jìn)行分類,在有用戶數(shù)據(jù)的時(shí)候,我們可以用用戶的行為來作為文檔分類的結(jié)果;沒有的情況下,我們可以進(jìn)行人為的標(biāo)注,當(dāng)然這部分工作量巨大。另外可能可行的是,在結(jié)構(gòu)化比較好的數(shù)據(jù)里面,找到關(guān)鍵的字段進(jìn)行分類,例如,品牌+產(chǎn)品型號(hào),這樣的字段作為聚類的關(guān)鍵key,把文檔分為很多類。如果結(jié)構(gòu)化不是很好,可以考慮用crf算法來抽取其中的關(guān)鍵字段進(jìn)行聚類。同時(shí)把query對(duì)文檔的直接搜索轉(zhuǎn)化為對(duì)不同類文檔的搜索。那么這時(shí)候,我們已經(jīng)把搜索的所有文檔進(jìn)行了聚類,發(fā)現(xiàn)“朵唯S920”手機(jī)的描述中,常會(huì)出現(xiàn)“舒淇在非誠勿擾2中使用”這樣的描述,是否就可以考慮把兩者聯(lián)系在一起了呢。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
