三级片网站

搜索推薦技術在電商導購領域的應用

  有一個問題需要解決:自動分類。做好個性化商品推薦,商品整理是第一站。類目,是最為基礎的整理。我們需要將每一個商品分到一個具體的類目上去,商品數量龐大,這個過程要自動化,這就是商品自動分類問題。

我們來熱熱身吧,做幾道分類題:

“Apple iPhone 6 (A1586) 16GB 金色 移動聯通電信4G手機”

【第一滴血】so easy,是一個“手機”

“snidel * S家新款王小俊日系蓬蓬裙雙層松緊高腰短裙裙褲現貨實拍”

【主宰分類】嗯……應該是“半身裙”,這個要分對就需要動一動腦子

“華為 HUAWEI 電源適配器+數據線 5V/2A快充 USB帶線充電頭”

【分類如麻】這個是“充電器”,來個有點難度的

“福建特產 正宗金冠黑糖話梅糖200g 含上等梅肉 酸甜好滋味”

【無人能擋】這個……是糖果,有沒有更變態的

“美利達勇士公爵500 550 600 650 700挑戰者350可載人行李架后貨架”

【變態分類】 靠關鍵詞聯想已經不夠了,查資料后知這是一個“自行車配件”,哈哈,還有誰?!

“比iphone還好用的諾基亞手機的手機套”

【已經超神】這……

你看,解決這個問題并沒有看上去那么簡單,每個商品標題中不會100%包含類目相關信息,怎么破?

分類1.0

我們研發的一代分類技術是比較樸素的,通過對應表+特征庫來解決。

對應表是一個簡單的配置文件,保存(關鍵詞,分類)的對應關系:

“手機”     ——>     手機

“牛仔褲”     ——>     牛仔褲

…….

特征詞庫是對應表的升級版(對應表plus?),維護的是(關鍵詞組合,分類)的對應關系:

“Apple iPhone 6”     ——>     手機

“棉麻 小腳 長褲 收腰 鉛筆褲”     ——>     休閑長褲

“美利達 勇士 公爵 行李架 貨架”     ——>     自行車配件

…….

這一整套樣本數據完全由人工整理,分類1.0的程序也很簡單,運行起來嘛……,“看上去”很可靠。首先,分類1.0一切的一切都建立在人工數據基礎上,只要樣本整理的好,分的結果就好,整理的不好就……。其次,人的精力是有限的,如果要大規模標注,就需要維持大規模的運營團隊。最后,人沒有整理過的商品特征,就沒辦法分好,bug數量處于失控狀態。

隨著數據指標的要求提升,數據集的增長,這套系統已經不堪重負。

分類2.0

因此,我們研發了新系統——分類2.0。分類2.0結合商品信息的特征,避免了由于特征庫對分類帶來的干擾,同時可以保證以較高的效率完成在線分類任務。(分類2.0由我司一枚殿堂級工程師所創作,哎呀,現在回想起來,那一段時光真是令人懷念……)

分類2.0的技術要點

1. 使用分詞技術對商品標題信息分詞處理,使用分詞結果作為商品的特征tag,用tag來描述該商品

2. 過濾沒有意義的tag,保留能夠有效描述該商品的tag

3. 利用互信息計算訓練集數據中,各個分類和該分類中商品所有tag的相關度

4. 預測一個新商品的類別時,計算該商品中的所有tag在每個分類中相關度值,使用分類中所有tag相關度值的和作為商品在該分類中的得分

5. 得分最高的類別即為該商品的分類

以一個具體的商品處理來說清楚這個流程,:

1. 基于商品庫對商品進行分詞處理&過濾無意義詞

如:黑色iphone蘋果手機新上市,分詞&過濾結果為:iphone,手機,黑色

2. 利用互信息計算各分類與其中tag的相關度:

互信息計算公式:

I(x,y) = log(p(x|y))-log(p(x))

其中:

p(x) 代表 x在所有商品中出現的概率

p(x|y) 代表x在類別y中出現的條件概率

下表為10個商品的類別及分詞結果

電商搜索引擎 電商搜索優化 搜索推薦技術 搜索技術

計算示例商品在上面的商品集中,手機類的互信息

a)概率計算

p(iphone) = 0.1

p(黑色) = 0.4

p(手機)  = 0.2

p(iphone |手機) = 0.25

p(手機|手機) = 0.5

p(黑色|手機) = 0.25

b)互信息計算

I(iphone,手機) = log(p(iphone |手機))-log(p(iphone)) =  -1.3863 + 2.3026 = 0.9163

I(手機,手機) = log(p(手機|手機))-log(p(手機)) = -0.6931 + 1.6094 = 0.9163

I(黑色,手機) = log(p(黑色|手機))-log(p(黑色)) = -1.3863 + 0.9163 = -0.47

c) 以此類推,可以算出iphone,手機,黑色三個關鍵詞在3個類別中分別的條件概率以及互信息

下表為關鍵詞在各個類別中的互信息

電商搜索引擎 電商搜索優化 搜索推薦技術 搜索技術

3.計算1中示例商品在各個分類中的相關度

Class(手機)= 0.9163+0.9163-0.6932=1.1394

Class(電腦)=0.0+0.0+0.2231=0.2231

Class(服裝)= 0.0+0.0+0.2231=0.2231

4.由3可以看出示例商品分類為“手機”類別

我們用這套分類2.0系統,重新處理所有商品,隨著訓練集的不斷擴展,準確率和召回率都在90%以上;同時也解放了運營團隊,他們不需要再每天標記什么對應表了。

這,就是算法的力量!一個好的算法可以極大的提高生產力。通過算法提升產品流程,需要很強的功力,否則就像篇頭漫畫所表達的,不好的算法上線后,效果還可能退步。總之,算法研究就像基礎科學,需長期投入,一旦開花,提升是極大的。什么是爬蟲?

 

爬蟲只是一種形象的比喻,不是樹上爬來爬去的那種……爬蟲是一種自動獲取網頁內容的程序,是搜索引擎的重要組成部分,是數據處理的第一個環節。大體上,可以有傳統和垂直兩種類型,傳統的就是google、baidu大搜索爬蟲,本篇介紹是的電商垂直爬蟲。

做一個簡單的爬蟲很容易,你只要寫下面這行代碼:

wget    http://www.meituan.com/

完了……

看,很簡單吧,大家都覺得寫一個爬蟲很簡單,也預示著爬蟲攻城濕苦逼日子的開始……

上面這行代碼給學生講講課是夠用的,但實戰還需要解決很多問題,爬蟲的基本工作有抓取、抽取、存儲,我們分別說一說。

(一)抓取

1. 編碼識別&翻頁

互聯網上的網頁大多是http協議的,但編碼每家都不一樣,有utf-8,gbk,gb2312等等。如果無視編碼問題,會使部分網頁下載后是亂碼,導致無法使用。

通常網頁head標簽內會標記編碼,例如搜索引擎爬蟲 電商搜索優化 電商搜索引擎 搜索技術,但總有不靠譜的網站維護者不遵守標準,實際編碼并不一定是utf8的。我們研發了一種通用技術解決方案:編碼智能識別。我們內置了每個編碼的常用字符集二進制碼,然后將網頁內容二進制化,找出匹配度最大的,作為這個網頁的真正編碼。這個方法很有效,99%+的準確率,就是稍微耗費點CPU,我們基本都用這個方法來識別網頁編碼,無視charset標簽。

另外,很多電商商品頁面,部分區域是ajax異步加載的,用POST的也比較多,直接使用wget、curl有諸多不便,需要支持。我們對其進行了整體封裝,內部稱這個類庫為httpfetcher。

2. 智能的調度、更新

電商網頁變化比較頻繁,特別是商品價格字段,有時候幾乎幾分鐘一變。上億的商品庫做到每個商品都能及時更新是很困難的,如何用有限資源,抓取最應該更新的商品,是一個難題。以商品更新為例,我們采用基于賣場場景的調度方式,不同的賣場場景更新頻率不同,每一個爬蟲負責特定場景的抓取任務,稱作一個環。發現環負責粗粒度發現,更新環負責粗粒度更新,秒殺環負責限時搶購類的細粒度更新,如下圖

搜索引擎爬蟲 電商搜索優化 電商搜索引擎 搜索技術

3. 重復抓取規避

帶寬,恩,帶寬……一談到帶寬,爬蟲濕都雙眉緊鎖。創業小公司,不是BAT那種不差錢的主,在北京這種地方帶寬是很貴滴,如果能省下一點點帶寬,那年終獎都出來了滴。gzip壓縮這種優化標準套餐后,我們還需要解決重復網頁抓取,節約帶寬。

我們管理的網址是億級別的,普通hashmap在內存中存不下,需要使用Bloom Filter了。

Bloom Filter是一種空間效率很高的隨機數據結構,它利用位數組很簡潔地表示一個集合,并能判斷一個元素是否屬于這個集合。

下面我們具體來看Bloom Filter是如何用位數組表示集合的。初始狀態時,Bloom Filter是一個包含m位的位數組,每一位都置為0。

搜索引擎爬蟲 電商搜索優化 電商搜索引擎 搜索技術

為了表達S={x1, x2,…,xn}這樣一個n個元素的集合,Bloom Filter使用k個相互獨立的哈希函數(Hash Function),它們分別將集合中的每個元素映射到{1,…,m}的范圍中。對任意一個元素x,第i個哈希函數映射的位置hi(x)就會被置為1(1≤i≤k)。注意,如果一個位置多次被置為1,那么只有第一次會起作用,后面幾次將沒有任何效果。在下圖中,k=3,且有兩個哈希函數選中同一個位置(從左邊數第五位)。   

搜索引擎爬蟲 電商搜索優化 電商搜索引擎 搜索技術

在判斷y是否屬于這個集合時,我們對y應用k次哈希函數,如果所有hi(y)的位置都是1(1≤i≤k),那么我們就認為y是集合中的元素,否則就認為y不是集合中的元素。下圖中y1就不是集合中的元素。y2或者屬于這個集合,或者剛好是一個false positive。

搜索引擎爬蟲 電商搜索優化 電商搜索引擎 搜索技術

Bloom Filter的這種高效是有一定代價:

1. 在判斷一個元素是否屬于某個集合時,有可能會把不屬于這個集合的元素誤認為屬于這個集合(false positive)。不過對于爬蟲場景,來判斷一個網址是否被抓取過來說,這種誤判率是可以接受的。

2. 無法unset。如果一個網頁較早前被抓取過,因為某種原因想再抓一次,Bloom Filter下無法重新清狀態再抓取。我們在實踐中,采用的是定期清空Bloom Filter,在帶寬浪費和unset之間做了一個平衡。

此外,抓取還要解決防封禁等。

(二)抽取

垂直爬蟲所涉及的網頁空間相對比較集中,對數據結構化要求較高,需要通過模板來解決。我們定義并使用了四種模板:URL模板,列表模板,商品模板和點評模板,這里簡單說說前三種。

URL模板

1. URL歸一化

商品URL可以標識一個唯一商品,在網站上同一個商品可能有不同的url,原因可能多方面的,一是入口不一樣,列表頁,搜索頁點擊過去的頁面是不一樣的,二是URL后面經常帶有統計信息。這樣會導致庫里大量的商品重復以及Bloom Filter失效,所以需要采用某種規則,將這些URL轉化為同一類型的URL,被我們成為URL歸一化。

2. URL特征

制定不同的規則來判定是列表url還是商品url,方便采取不同的抓取策略。列舉一些URL模板例子:

商品URL模板

    www.jd.com|^/product/[0-9]+\.html.*$

    book.jd.com|^/[0-9]+\.html.*$

列表模板

表明當前的為一個列表模板,需要通過模板獲取的信息為商品總頁數

一個列表鏈接意味著這個鏈接上面都是一個跳出的鏈接,通過獲取所有的鏈接,然后與當前網站商品的URL特征匹配,可以獲得純凈的商品URL鏈接,從而控制了發現的鏈接的準確性。

當一個頁面可以翻頁的時候,種子URL模板如下

http://www.jd.com/products/652-828-1107-0-0-0-0-0-0-0-1-5-[xx].html

爬蟲收到這種類型的鏈接,按照初始默認起始頁,步長爬起第一個頁面。

http://www.jd.com/products/652-828-1107-0-0-0-0-0-0-0-1-5-1.html。爬取完畢以后,通過列表模板獲得商品總頁數,寫入到鏈接對象持久化。然后將這個鏈接新發現的商品鏈接和自身寫入URLDB。當爬蟲在次從URLDB取到這個鏈接時,發現這個鏈接是可以翻頁的連接,于是按照當前的pageIndex,pageStep計算出下一個頁面。然后爬取下一個頁面。

商品模板

早期商品模板主要使用Xpath正則、JS子模板及自定義的表達式來完成商品信息的解析。Xpath正則很常見,自行百度。JS子模板主要用來解決一些技術的問題

    1,實現在解析某個頁面時調用其子頁面(ajax),因為有時某些商品信息(如點評量),在商品頁的html代碼中是不存在的,需要調用該商品頁的子頁面(如點評頁)才能獲取;

    2,實現從頁面中抽取內容傳遞給某個中間變量(虛擬的模板項),因為有時某個最終結果需要同時對兩個中間結果做處理才能得到,需要支持創建多個中間變量。

JS子模板這個名字不好,最初未來解決javascript帶來的問題,后面也就懶得改了。隨著技術的迭代優化,逐漸使用一種自研的腳本語言(內部代號,behemoth)來簡化模板抽取工作。鑒于腳本語言的靈活性,behemoth幾乎能做到任何程度的處理,可用來抽取商品SKU,點評等。目前我們正逐漸替換成behemoth。

behemoth極大簡化了模板編寫工作,隱藏諸多技術信息(例如常用的xpath、正則封裝),讓模板編寫者只關注業務邏輯。此外,大多數電商網頁,都存在著盤根交錯的ajax調用,behemoth先執行整個網頁的dom渲染后再進行抽取工作,每個抽取模板是一個code unit,極大降低了模板編寫復雜度。

behemoth也是有代價的,由于大量的渲染工作,抽取一個網頁的時間是之前的幾倍。總體上,好處還是大于壞處。

搜索引擎爬蟲 電商搜索優化 電商搜索引擎 搜索技術

搜索引擎爬蟲 電商搜索優化 電商搜索引擎 搜索技術

這是我們早期一些模板的示例。

搜索引擎爬蟲 電商搜索優化 電商搜索引擎 搜索技術

這是目前模板的演化現狀。

對了,還有一個問題,模板這么多,如果模板失效了怎么檢測呢?我們為此研發了一個自動檢查機器人,將有問題的模板定期挑出來,讓人工修改更新。這種架構,維護幾千家網站不成問題。

此外,我們正在研發第三代抽取技術,模板工作將會進一步再減少50%+。

(三)存儲

需要管理的網址鏈接是百億級,商品是10億級,為了方便分析和讀取,需要支持隨機寫和順序寫的存儲系統,關系型數據無法滿足我們的需求,需要no-sql型。早期我們自研了一套文件系統——ministore,隨著數據量的增長,維護的成本比較高,中期我們且換到了Cassandra,到現在我們使用改造后的Hadoop+redis。有關Cassandra、Redis、Hadoop文章很多,兩個系統各有特點,這里不展開說。

小結

搜索引擎爬蟲 電商搜索優化 電商搜索引擎 搜索技術

要寫好一個爬蟲要干這么多活,絕對是一個臟活累活有木有,堪稱技術界的活雷鋒有木有。

一個優秀的爬蟲對搜索引擎發揮著極其重要的作用,它是核心數據的源頭,處理的越好,對后續的處理幫助越大。
在電商領域浸淫多年,近期有空對這些年的實踐經歷做些整理,嘮叨嘮叨我們遇到的問題和用到的技術解決方案,歡迎同行交流。

PS:封面圖跟本文沒有任何卵關系,純粹個人喜歡……

導購領域的發展

隨著經濟不斷發展,人們對消費品質要求也水漲船高,也更加個性化。線下實體的陳列空間是有限的,網上陳列空間是無限的,所以這十多年來,電子商務一直處于蓬勃發展之中。

海量商品,雖然極大豐富了的選擇,但也讓你挑花了眼,經常會被坑爹……所以,這就有了導購的生存土壤。導購,故名思議,引導購物,本質上是一個信息過濾器,針對個人的需求和喜好,將海量商品過濾成有限選擇,減輕挑選成本。

如果把網上商品庫比喻成一個西瓜,導購就是切西瓜的刀,一個特定的角度切入,就是一個導購方向。舉個栗子:

早期的購物搜索、購物推薦是最早的導購形態,讓用戶自助尋找想買的商品;

折800,聚劃算,9塊9包郵,什么值得買等,是以價格角度切入;

美麗說、蘑菇街是以女性時尚角度切入;

chiphell,knewone是以男性原創曬單角度切入……

只要網上的商品信息保持持續增長,信息過濾、商品挑選的用戶痛點也會日益增加,導購需求就會永遠存在。

個性精準導購,對技術要求較高,需要用到搜索,推薦,機器學習等多個領域技術。

導購離錢近,可很快有現金流,屬于“自我造血型”業務,在這個資本寒冬里,是一個不錯的選擇。

做好導購,未來可演化成垂直電商平臺,發展前景廣闊,美麗說、蘑菇街是成功案例。

說那么多廢話,我就是想簡單講一下分詞

為了有效的給用戶推薦商品,首先要理解用戶需求和商品,這兩者的精準刻畫都離不開分詞。

我們這里說的分詞是指中文分詞,指的是將一個漢字序列切分成一個一個單獨的詞。這是中文特有的問題(英文有空格可以天然分隔),需要進行一些技術處理。

通用的分詞算法可分三大類:基于字符串匹配的分詞方法、基于理解的分詞方法和基于統計的分詞方法。這里不展開詳述,大家可以自行百度,這三個分詞流派我們都用上了。

在實踐過程會發現,無論哪種方法,都保證不了100%的召回率和準確率,技術同學通常面臨這樣一個難題:召回率83%,準確率91%,想進一步提高準確率,就很難保持召回率不降低,怎么破?!

這時候,你需要詞典了。

購物分詞優化到后期,基本就是詞典的優化過程。

詞典是一個擴展集合,用于保存預先分好的詞,每一個詞要標注詞性。詞性,就是詞的性質,是對一個詞的進一步解釋,比如“D100”在詞性是“系列”,“尼康”的詞性是“品牌”。(詞條,詞性)組合,可以保存對應的領域知識。

再列舉一些我們用到的詞性

核心詞:如品牌,型號,系列,商品名等

修飾詞:如顏色,材質,風格等

Stopword:無意義的詞,如包郵,淘寶熱賣等

我們詞典的最大特點是基于分類的,也就是說,詞典中每一個詞的詞性并不是唯一性確定的,在不同類目下有不同的詞性含義。目前我們維護的電商分類是數千個節點,深度為4的樹形結構,常見的分類有手機,連衣裙,膨化食品……

4ADDD192-D469-4836-8DE1-A6DE5DAD2FF5.png

這是我們一個詞條的印象,大家感覺一下。

下面是我們設計的詞條數據結構。

699ABB51-565F-49AD-92BF-D66E66D99F4B.png

我們詞條的詞性是基于分類的。

426B25A9-B67C-45BA-914E-0165DA7CF996.png

詞條的組織形式是分形的,可遞歸,父詞條結構和詞條是一樣的。

4D6AA619-34C3-4FBE-9AD5-94523B13EC0A.png

這是詞性維度的數據結構,也是基于分類的。

FEB8A616-0BC0-49DF-AF6B-82BCB2371C25.png

最終,我們通過詞條關系的構建,搭建成如上類目屬性庫,在各種商品文本處理場景中使用。

那么問題來了,那么多品牌詞,類目詞,修飾詞都是從哪里來的呢?

答:從大數據里面來。

通過海量商品文本數據,我們對文本中,相鄰的keyword建立起概率鏈模型,如果兩個keyword經常一起出現,同時詞條庫里面還沒有,那很可能是一個新詞。這時候,人工介入標注,更新詞條庫。日積月累,詞條庫會越來越強大!

最后,我們的購物分詞系統,就演化成介個醬紫的。