作者:Dimitris Apostolopoulos
編譯:ronghuaiyang
導讀
給大家介紹一下推薦系統中的產品聚類方法。
之前有一篇文章,推薦系統之路,介紹了推薦系統的一些基礎知識,並用矩陣分解的方法實現了一個基礎的推薦系統,今天接下來後面的內容。
在上一篇文章中,我把我的船駛向了"推薦系統"的島嶼,但是由於矩陣系統的效能問題,我的船受到了嚴重的傷害。
因此,現在,在接下來的文章中,我將一個接一個地找出每一個問題,並嘗試修復它們(劇透警告:最後一切都會得到修復)。
讓我們從中斷的地方快速瀏覽一下。
“疼痛定位”:找出問題所在
正如本系列文章的第一部分中所描述的,我們面臨的問題之一是:我們上一篇文章中的互動矩陣太大,無法 度量。這是由於我們收集了大量的資料,其中包含重複的資訊,因為相同的產品或類似的產品可以在不同的商店中找到。
換句話說,如果你銷售耳機,而你的三個競爭對手也在銷售同一品牌的耳機,那麼你的矩陣上就會有重複的產品,這就會毫無理由地減慢你的速度。
這就是為什麼本文的目的是 實現相同或非常相似的產品的跨店標識。
“仔細看看”:合併資訊
我們將使用資料集提供的產品資訊(即產品程式碼、產品標題、產品 URL 和產品價格)。
現在,每家商店都使用自己的內部系統來跟蹤產品。因此,每個商店的產品程式碼都是獨一無二的。
更糟糕的是,我們也不能依賴產品價格,因為不同的商店價格不同。
這給我們留下了兩個選項:產品標題和產品 URL。
如果一個人可以做一個從網站頁面上拉取資料的網頁採集器話,產品的 URL 可以是一個很好的資訊來源,但是,由於 HTML 是“無結構”的,我們不能有這樣一個網頁採集器可以對每個網站都適用。
這樣就只剩下一個選項,即整個聚類中只使用產品標題。
“做作業”:文字預處理
什麼是預處理?
文字預處理是指文字在輸入到演算法之前必須進行的所有調整。
遵循這些文字聚類預處理的步驟
我們對資料進行預處理的步驟如下:
- 首先,我們識別品牌並將它們從標題中移除,這樣我們只剩下產品名稱。
- 然後,我們刪除描述顏色的詞,以減少資料的噪音,因為,在這一點上,我們想要根據顏色來分類產品。例如,我們想建立一個類別“黑色匡威全明星鞋 10”和另一個類別“白色匡威全明星鞋 10.5”。
- 之後,我們從標題中刪除了數字和度量單位(如果有的話),因為我們想建立具有非常相似產品的組,比如“Cola 330ml”和“Cola 500ml”。
- 最後,我們對單詞進行詞幹處理,也就是說,去掉單詞的字尾以找到一個共同的詞根,同時去掉所有的停止詞。
- 為了將標題資料輸入到演算法中,我們將資料轉換為向量。為了實現這一點,我們使用了兩個不同的向量轉換器: CountVectorizer,它建立了只有{0,1}的二進位制向量,以及 tf-idf 向量轉換器,它根據單詞在所有向量中的頻率為所有單詞分配權重。在本例中,我們使用兩個向量轉換器來找到對我們更有效的那個。
繼續:文字聚類
什麼是文字聚類?
文字聚類是在未標記的資料中生成組的過程。在大多數聚類技術中,組的數量是由使用者預定義的,但是在這種情況下,聚類組的數量必須動態變化。
我們可以有包含單個產品的聚類,也可以有包含 10 個或更多產品的聚類,這個數字取決於我們能找到多少類似的產品。
我們的需求減少了我們的選擇。DBSCAN 是一種基於密度的演算法,它依賴於向量之間的距離,從而建立組。
DBSCAN 生成的組:
為什麼 DBSCAN 不能正確地對資料聚類?
產品的標題是一個很短的句子(1-5 個單詞)。然而,我們建立的向量非常大,因為來自資料集中的所有唯一的單片語成了詞彙表。詞彙表的長度就是向量的長度,因此我們失去了所有的資訊。
降維技術,諸如 PCA 和 SVD 之類的不能幫助解決這個問題,因為轉換矩陣的每一列都代表一個單詞。
因此,當你刪除一些列時,你將刪除許多產品。
由於現有的解決方案不能正常工作,我們決定構建一個自定義的聚類流程,旨在找到問題的解決方案。
訓練向量生成器
當你 訓練一個向量生成器時,它將學習到給定句子包含的單詞。
例如,當被給予““Nike Capri Shoes”時,向量生成器只學習這三個詞。這意味著當你對其他產品進行變換時,除了那些包含一個或所有單詞的向量,其他變換出來的向量都是 0。
為了找出兩個向量有多相似,我們測量它們基於 歐氏距離的相似度。要把兩個單詞歸到同一組裡,這兩個單詞之間的相似度必須高於我們的閾值。我們生成的組稱為 categories。
把我們的資料想象成一大桶產品。categories 是有用的,因為它們建立了包含我們可以處理的相關資料的小桶。
現在,我們透過使用更高的閾值再次執行相同的程式來為 每個 bucket 建立子類別,並建立子類別。子類別是我們將使用的最終的組。
換檔:提高速度的小竅門
整個過程有點耗時。為了節省時間,我們會進行所有的文字預處理步驟,但是除了向量化。
之後,我們根據標題中包含的單詞數對資料進行排序,因此只有一個單詞的標題將位於列表的頂部,而單詞最多的標題位於列表的底部。
這樣,一個詞的標題將構成我們的大多數類別,減少我們處理的資料量。
英文原文: