搜索引擎排序
時(shí)間:2023-03-20 07:28:01 | 來源:電子商務(wù)
時(shí)間:2023-03-20 07:28:01 來源:電子商務(wù)
今天說說搜索引擎的排序吧。
一個(gè)標(biāo)準(zhǔn)的搜索引擎有三個(gè)最重要的部分,爬蟲,檢索,排序。
- 爬蟲水太深了,各種黑科技層出不窮,光代理的選擇就有各種黑科技,而且只有百度這種全網(wǎng)搜索引擎或者某些靠爬數(shù)據(jù)的細(xì)分領(lǐng)域的垂直搜索引擎才需要爬蟲,重要的是我也不是很了解這一塊,所以就說不了了,我么默認(rèn)數(shù)據(jù)都是自有的數(shù)據(jù),類似電商的搜索引擎。
- 檢索的話,我之前的文章主要介紹的就是這一塊的東西。
- 排序是直接影響用戶體驗(yàn)的部分,這也是搜索引擎和數(shù)據(jù)庫(kù)效果上差別比較大的部分了,排序完全可以寫一本書出來,這里我就用一篇文章來說說我所理解和了解的排序吧。
我沒見過大廠的搜索,所以可能說得不對(duì)啊
首先,我們還是定個(gè)標(biāo)準(zhǔn),因?yàn)樗阉饕娴呐判蚋鶕?jù)場(chǎng)景的不同使用的技術(shù)也不太一樣,比如通用搜索引擎,像谷歌和百度這種,PageRank是主要技術(shù)了,對(duì)于一個(gè)不需要爬蟲的搜索引擎,一般也不會(huì)用到PageRank技術(shù)了,我們說說特定領(lǐng)域的搜索引擎的排序,最經(jīng)典的場(chǎng)景就是電商類搜索引擎怎么排序。我并不是這方面的專家,所以有些東西說的不夠準(zhǔn)確也別噴啊,而且排序也是各種新技術(shù)層出不窮,一篇文章要說明白也是不太可能的,更深入的大家可以自己去找資料哈,下面我們以一個(gè)電商的搜索引擎為例說說排序。
對(duì)于搜索一個(gè)關(guān)鍵詞,直觀的感覺應(yīng)該有哪些因素影響到它的結(jié)果集排序呢?一般人很明顯能想到的有關(guān)鍵詞和商品的匹配程度,商品銷量,商品好評(píng)度,是否有貨等,再深入一點(diǎn)可能能想到商品被收藏的次數(shù),被點(diǎn)擊的次數(shù)這一類的東西。
OK,我們一步一步來說說吧,順著說的時(shí)候我們先建立一個(gè)規(guī)則,就是無論多少個(gè)因素,最終每個(gè)商品都會(huì)得到一個(gè)分?jǐn)?shù),排序的時(shí)候就按這個(gè)分?jǐn)?shù)來進(jìn)行排序,我們這里以最簡(jiǎn)單的辦法,這是一個(gè)32位的整數(shù),我們使用其中的21位,最后就按這個(gè)21位的整數(shù)的大小來進(jìn)行排序。
關(guān)鍵詞和商品的匹配程度
首先,我們認(rèn)為最重要的因素就是關(guān)鍵詞和商品的匹配程度,也就是前面幾篇所說的TF*IDF的值,這個(gè)我們認(rèn)為是排序最重要的因素,因?yàn)槟愣己完P(guān)鍵詞不太匹配,怎么說也不好意思排到前面吧。那么我們把最高的3位留給TF*IDF,3位能表示0到7共8個(gè)等級(jí),那么計(jì)算的時(shí)候,我們把結(jié)果集每個(gè)文檔的TF*IDF算出來以后,歸一化成0到7這八個(gè)數(shù),那么對(duì)相關(guān)性的打分就打好了,如果你希望區(qū)分度更高,可以使用4位或者5位,但是其實(shí)意義不大,8個(gè)等級(jí)都多了,5個(gè)等級(jí)差不多就行了,因?yàn)楹竺孢€有其他因素,這里區(qū)分度太大了,后面就沒什么影響了。
這一步的計(jì)算量比較大,可以在構(gòu)建索引的時(shí)候就把每個(gè)文檔在每個(gè)關(guān)鍵詞下的TF-IDF算好直接存起來,檢索的時(shí)候只需要求交集的時(shí)候把這些值加起來然后歸一化就行了。
TF-IDF怎么算,可以看我前面的這篇文章【用Golang寫一個(gè)搜索引擎(0x05)】,這里就不說了。
關(guān)鍵詞匹配程度除了TF-IDF以為還有個(gè)比較重要的因素,就是詞距和詞序,這個(gè)也很好理解,比如你搜索小米手機(jī),結(jié)果集中有兩個(gè)商品,一個(gè)名字叫小米手機(jī)Note2,全國(guó)包郵,一個(gè)名字叫優(yōu)質(zhì)小米,可手機(jī)追溯來源,有可能這兩個(gè)商品的TF-IDF都是一樣的值,但是很明顯你更愿意看到第一個(gè)排在前面,這就是詞距和詞序的影響,那么,我們把接下來的2位給詞距和詞序,也是歸一化成4個(gè)等級(jí),怎么歸一這個(gè)比較自由,能區(qū)分就行。
OK,匹配程度上有5位了,通過這5位我們基本能給出一個(gè)初步的排序結(jié)果出來了,這個(gè)結(jié)果不會(huì)太差,至少基本上會(huì)是你要找的東西,而我實(shí)現(xiàn)的這個(gè)搜索引擎基本也就做到這一步了,因?yàn)楹竺娴呐判蛞蛩睾蛨?chǎng)景就太相關(guān)了,但是這32位我都留著了,后面的可以自由發(fā)揮。
當(dāng)然,影響相關(guān)性的可不止這兩個(gè)因素,像分詞程序的好壞,關(guān)鍵詞糾錯(cuò)能力都直接影響這一部分的排序結(jié)果,這里我們就說主要的,給大家一個(gè)排序的概念。
商品本身的屬性
除了上面的匹配程度以為,商品本身的屬性也是很重要的排序因素,這些屬性包括銷量,收藏次數(shù),點(diǎn)擊次數(shù),評(píng)論次數(shù),好評(píng)次數(shù),差評(píng)次數(shù),是否有貨等等等等,你能想到的和商品本身有關(guān)的東西(也叫feature)都可以算進(jìn)來,甚至可以包括像有幾張圖片啊,圖片是否漂亮啊,評(píng)論中是否有人曬圖啊,對(duì)于某個(gè)屬性,比如銷量,還可以細(xì)分成日銷量,周銷量,月銷量,這些都可以算成商品本身的屬性用來影響排序。
那么我們把接下來的8位留給商品的屬性吧,現(xiàn)在的關(guān)鍵問題是怎么來算這個(gè)數(shù),最簡(jiǎn)單的辦法是我們只考慮月銷量,收藏次數(shù),點(diǎn)擊次數(shù),并且我們?nèi)藶榈慕o拍一個(gè)權(quán)重就是月銷量 > 收藏 > 點(diǎn)擊,他們分別占用8位中的3位,3位,2位,歸一化一下,齊活,排好了,夠簡(jiǎn)單吧,而且效果也不會(huì)太差。
但是作為一個(gè)高端的排序,這么做明顯比較挫了,因?yàn)檫@一部分的打分比較穩(wěn)定,它只和商品本身相關(guān),也不需要實(shí)時(shí)計(jì)算,所以一般都是離線算好了就行了,所以這里都是用了機(jī)器學(xué)習(xí)模型或者更高端的用了深度學(xué)習(xí)模型來計(jì)算。
機(jī)器學(xué)習(xí)算什么呢?算權(quán)重,我們這里有一堆的屬性(專業(yè)點(diǎn)叫feature)X1,X2,X3...Xn,每個(gè)都有權(quán)重分別是a1,a2,a3...aN,那么最后的分?jǐn)?shù)就是a1*X1+a2*X2+a3*X3+...aN*Xn,這個(gè)分?jǐn)?shù)最高的就排前面。機(jī)器學(xué)習(xí)就是把這些個(gè)a1,a2..aN系數(shù)給算出來,然后在計(jì)算每個(gè)商品的分?jǐn)?shù)。
這里的方法有非常多,一般用得比較多的是邏輯回歸,如果感興趣的話可以自行去學(xué)習(xí)一下邏輯回歸,不過沒有數(shù)學(xué)基礎(chǔ)就算了,我這里就不展開了,展開了就是一堆數(shù)學(xué)公式。
我用最最樸實(shí)的話描述一下這個(gè)算法啊,希望你能有個(gè)直觀概念,因?yàn)槲覍?shí)在沒法更直觀的描述了,想要了解個(gè)中原理的自己去看邏輯回歸吧,下面的文字有一定誤導(dǎo)性,請(qǐng)謹(jǐn)慎閱讀。
簡(jiǎn)單起見,設(shè)某個(gè)商品我們有兩個(gè)屬性(銷量,收藏),并且我們知道這個(gè)商品最后有沒有被點(diǎn)擊,然后我們不知道他們的權(quán)重(a1,a2)需要求出來,然后用a1*銷量+a2*收藏來得到這個(gè)商品的最后打分。
首先,我們定義一個(gè)表達(dá)式(a1*銷量+a2*收藏)*S=Y,Y是什么呢,我們定Y=1表示被點(diǎn)擊了,Y=0表示沒有被點(diǎn)擊,S是什么呢?你把S當(dāng)成一個(gè)牛逼的函數(shù)就行了,什么東西乘上他以后就變成不是0就是1了,現(xiàn)在我們把銷量,收藏,是否被點(diǎn)擊聯(lián)系起來了,可以開始求這個(gè)a1和a2了。
我們有的是最近三個(gè)月每個(gè)商品的銷量,收藏和點(diǎn)擊數(shù)據(jù),那么每個(gè)商品我們都可以寫成下面的樣子,其中的20,10,30表示銷量和收藏的具體數(shù)
商品1在某時(shí)刻 : (a1*20+a2*10)*S=1
商品2在某時(shí)刻: (a1*30+a2*30)*S=0
…...
有了這一堆表達(dá)式,那么我們就一個(gè)一個(gè)去試這些系數(shù)唄,計(jì)算機(jī)不是最喜歡干這事情么,一直試到某一組系數(shù)能滿足大部分表達(dá)式了,那么OK,就是它了,于是我們得到了一組能滿足大部分表達(dá)式的系數(shù),就用這組系數(shù)配合屬性來計(jì)算分?jǐn)?shù)了。
這就是邏輯回歸的機(jī)器學(xué)習(xí)算法了,注意啊,這里不是解方程,是試
于是我們把S丟掉,就用a1*X1+a2*X2+a3*X3+...aN*Xn給每個(gè)商品算上一個(gè)分?jǐn)?shù),再歸一化一下,就是這一部分的分?jǐn)?shù)了,然后填寫到這8位上。
一般在這一部分,由于計(jì)算量巨大,都是用的Hadoop來算了,算出來的這一組系數(shù)一般也比較穩(wěn)定,能用很久,不用每天更新,只有當(dāng)數(shù)據(jù)積累到一定程度以后,再重新算一次系數(shù)就行了。這樣,我們有了這組牛逼的系數(shù),那么每天我們把所有商品的分?jǐn)?shù)重新算一遍,然后更新到這8位中就行了。
然后更牛逼的是,當(dāng)你發(fā)現(xiàn)一個(gè)新的屬性(比如某個(gè)商品是不是在搞活動(dòng)),你覺得應(yīng)該會(huì)影響排序效果,那簡(jiǎn)單,把這個(gè)屬性放進(jìn)去,重新計(jì)算一下系數(shù),以后就按新系數(shù)來計(jì)算分?jǐn)?shù)了。好,黑模式開啟,其實(shí)吧,算法工程師每天做的就是不停的找屬性(他們管這個(gè)叫featrue,就是為了顯得你們看不懂),然后讓機(jī)器去算新系數(shù),沒啥難度嘛,嘿嘿。
這一切看起來都很美好,但是如何來評(píng)估也是問題。
- 首先,這個(gè)Y怎么定,上面我們把是否點(diǎn)擊定成Y,是不是合理,如果不合理應(yīng)該怎么定,如果你有大批閑散人員,那么可以人來給每個(gè)商品打個(gè)標(biāo)簽【好,或者不好】來代替是否點(diǎn)擊了,但是即便這樣也有主觀因素,所以這一塊也是個(gè)可以深挖的東西。
- 第二,機(jī)器這么算出來的就是對(duì)的么?我前面拍的月銷量 > 收藏 > 點(diǎn)擊難道就不好么?
- 第三,除了邏輯回歸,還有其他的機(jī)器學(xué)習(xí)的模型,用其他模型算出來的肯定和這個(gè)系數(shù)不一樣,那哪個(gè)好呢?
所以說,算法工程師還是很忙的,還需要解決至少上面幾個(gè)問題,還有一些問題,比如你找到一個(gè)屬性,就是圖片漂亮不漂亮應(yīng)該也會(huì)影響排序,臥槽,那圖片多漂亮,怎么變成一個(gè)X放到那個(gè)表達(dá)式中去啊,這也是算法工程師要解決的。
系數(shù)好不好,最簡(jiǎn)單直觀的辦法就是用了這一組系數(shù)以后,搜索引擎的點(diǎn)擊提高了沒,如果是電商的話,那么搜索引擎帶來的收入提高了沒,提高了那就行,降低了的話,對(duì)不起,把系數(shù)回滾吧。
好了,說了這么多了,其實(shí)也只是說了排序的皮毛,里面的東西實(shí)在是太多太多了,不然也不會(huì)有那么多算法工程師前仆后繼的來弄這個(gè)了。
這一段寫得比較多,我用了盡量能理解的話來說,如果對(duì)機(jī)器學(xué)習(xí)感興趣的話自己去找資料吧,最好先看看線性代數(shù)和概率論,如果你不準(zhǔn)備深入學(xué)習(xí)線性代數(shù)和概率論,只是想復(fù)習(xí)一下,那么推薦兩本書,小日本寫的《程序員的數(shù)學(xué)-線性代數(shù)》,《程序員的數(shù)學(xué)-概率論》。
用戶本身的屬性和行為
除了上面兩個(gè)部分以為,用戶本身的屬性行為也可以作為搜索引擎排序的選項(xiàng),比如我們把最后8位留給用戶行為吧,何為用戶本身的屬性和行為呢?
比如天貓吧,在登錄的情況下,搜索上衣,男的和女的看到的結(jié)果是不一樣的,男的看到的基本都是男上衣,女的反之。這就是用戶屬性的利用。又比如你在天貓上一年買的東西好幾十萬,而且都是高端貨,那么你搜索某些關(guān)鍵詞的時(shí)候,可能貴的東西會(huì)排前面,但我搜的時(shí)候就不會(huì)。這就是用戶行為數(shù)據(jù)的利用。
總之,這一塊的想象空間更加巨大,而且這一塊和上一塊究竟哪個(gè)的權(quán)重應(yīng)該更高,也不好說,所以搜索引擎的排序這一塊能做的工作實(shí)在是太多太多了,這部分也可以跟推薦系統(tǒng)和廣告系統(tǒng)結(jié)合起來對(duì)搜索結(jié)果產(chǎn)生影響,來達(dá)到最大化的收益。具體怎么做需要單開一篇甚至幾篇來寫了,最終也會(huì)得到一個(gè)分?jǐn)?shù),然后放到最后的8位上去。
總結(jié)
搜索引擎的排序,不外乎就是上面三個(gè)大的部分,但是每一部分都可以深挖出很多很多東西,而且排序是關(guān)乎到一個(gè)搜索引擎好壞的重要指標(biāo),大家都是投入巨大人力做這個(gè),一個(gè)人要全弄明白也不太可能,我文章中所說的21位整數(shù)作為打分的最終表達(dá)方式也只是其中的一種方法,只是為了讓大家更直觀的理解排序模型,所以排序的可操作程度實(shí)在是太高了,想怎么玩都行,只要最后有效果就是好的排序。
最后說說我個(gè)人的想法啊,就說電商排序這一塊,某寶的排序目前已經(jīng)是很流弊了,一般能想到的東西他們都做了,而且各種新技術(shù)新理論也用得很多,我覺得相對(duì)于其他電商已經(jīng)是一個(gè)炫技的程度了,但真的都有效么?上面說的男的女的搜索出來的東西不一樣,你搜的時(shí)候會(huì)覺得:"臥槽,好流弊?。。?#34;,但仔細(xì)想想你搜東西的時(shí)候真的會(huì)因?yàn)槟闶悄械乃训臇|西都是男裝,你就會(huì)多下單嗎?搜索是一個(gè)意圖非常明確的操作,你明明是要買女裝給老婆的,不會(huì)因?yàn)樗殉鰜硎悄醒b你就會(huì)多買個(gè)男裝。當(dāng)然,阿里肯定是做了AB測(cè)試了,不然這個(gè)功能都上了一年多了,要是真沒效果估計(jì)也下線了。
最后,道高一尺,魔高一丈,排序做得這么流弊,老子照樣可以刷單刷排名,民間的高人根本不明白搜索排序的理論,一樣可以分分鐘秒了你的搜索排序,呵呵。
如果想在微信上看,可以微信搜索
XJJ267或者
西加加語言,那里還有其他類型的文章。