推薦系統之路 (2):產品聚類

機器之心發表於2019-05-05

在上一篇文章中,我大致介紹了推薦系統,但卡在了矩陣系統的效能這一塊。所以本文將繼續上一篇,一個個找出每個沒有執行的變數,並嘗試修復它們。

現在,我們繼續從上次中斷的地方開始吧!

「疼痛識別」:發現問題

正如上一篇文章中所提到的,我們要面對的問題之一是:互動矩陣太大,很難衡量或計算。這是因為不同商店中會有相同或者相似的產品,所以我們收集的大量資料中包含重複的資訊。

推薦系統之路 (2):產品聚類

也就是說,如果你賣耳機,而你的三個競爭對手也賣相同品牌的耳機,那你的矩陣中會有很多重複的資訊,而這無疑會拖慢你的工作速度。

所以本文的目的是:實現相同或相似產品的跨商店識別。

「走個過場」:融合資訊

我們將會使用資料集提供的產品資訊(即產品編碼、產品名稱、產品 URL 和產品價格)來確定產品的相似度。然而,現在每個商店都會用內部系統來追蹤產品。因此,對每個商店來說,產品編碼都是獨一無二的。

更鬱悶的是,產品價格我們也用不上,因為每個商店的產品價格也不同。產品 URL 倒是個不錯的資訊來源,如果我們可以構建 Web Scraper 來從網頁上獲取資料的話。但是,由於網頁的「非結構化」,我們沒辦法構建適用於每個網頁的 Web Scraper。

因此,我們能用的選項只剩一個了:產品名。

「做好準備」:文字預處理

文字預處理是指文字在饋送至演算法前必須經歷的所有調整。因為文字本身會有很多不需要的符號,或者一些特殊的結構,所以預處理需要做的就是整理文字,並用數值編碼文字內容。

文字聚類預處理步驟

我們要對資料進行以下預處理過程:

  • 首先,我們確認產品的品牌並將其從產品名中剔除,這樣我們得到的就是單純的產品名了。

  • 然後,我們分離產品名中描述顏色的單詞,以便減少資料噪聲。此時,我們就可以根據顏色給產品分類。例如,我們想建立這兩個類別:「黑色匡威全明星鞋 10」和「白色匡威全明星鞋 10.5」。

  • 接下來,我們分離產品名中的數字和度量單位(如果有的話),因為我們想把非常相似的產品歸到一類中去,比如「Cola 330ml」和「Cola 500ml」。

  • 最後,我們對單詞進行詞幹處理。也就是說,分離單詞的字尾,以找出共同的詞根,並完全去停用詞。

  • 為了將產品名輸入至演算法中,我們要把資料轉換為向量。為此,我們使用 2 個不同的向量器:CountVectorizer 和* *tf-idf Vectorizer。前者用 {0,1} 建立二元向量,後者根據單詞在所有向量中的頻率為每個單詞分配一個權重。在這裡,我們用這兩個向量器來找出對我們更有效的向量。

下一步:文字聚類

什麼是文字聚類?

文字聚類是在無標籤資料中生成分組的過程,很多網站的「同類」新聞就是通過文字聚類完成的。在大多數聚類技術中,分組(或叢集)數量是由使用者預定義的。但在本文中,分組數量必須動態變化。

我們的聚類可以包含單個產品,也可以包含 10 個或更多產品;這個數量要取決於我們找到的相似產品的數量。

前面所述的需求令我們鎖定了 DBSCAN 聚類。DBSCAN 是一種基於密度的演算法,它依賴於向量相互之間的距離,以建立分組。

DBSCAN 生成的分組:

推薦系統之路 (2):產品聚類

為什麼 DBSCAN 無法正確地聚類資料?

產品名一般都很短(1~5 個單詞)。但是,我們建立的向量很龐大,因為資料中每個單獨的詞最終組成了整個詞彙表。詞彙表的大小即向量的長度,所以我們相當於丟失了所有資訊。

像 PCA 和 SVD 這樣的降維技術也沒辦法解決這個問題,因為轉換矩陣的每一列都代表一個單詞。因此,當你刪除一些列時,也刪除了很多產品。

由於我們現有的解決方案無法正常工作,所以,我們決定構建自定義的聚類過程,以找到解決問題的辦法。

打破舒適圈:訓練向量器

當你訓練向量器(vectorizer)時,它會學習給定句子中包含的單詞。

例如,給定「Nike Capri Shoes」,向量器只學習這三個單詞。這意味著當你轉換其它產品時,除了那些包含一個單詞或所有單詞的產品外,其它產品的向量都會為 0。

為了找出 2 個向量之間的相似性,我們用歐幾里得距離來進行衡量。如果 2 個產品被歸為 1 類,且距離要高於我們的閾值,我們就稱生成的組為 category。

推薦系統之路 (2):產品聚類

想象一下,我們的資料就像一大桶產品。category 很有用,因為它們建立了更小的桶來包含相關資料,而我們可以處理這種規模的資料。

現在,我們用更高的閾值再次執行同樣的過程,然後為每個「小桶」建立 Subcategory。Subcategory 是我們將使用的最小組別。

推薦系統之路 (2):產品聚類

換擋:提高處理速度的技巧

整個聚類過程有些費時。為了節約時間,我們將仔細檢查所有的文字預處理步驟,向量化除外。

之後,我們根據產品名包含的單詞數量對資料進行分類,所以只含有 1 個單詞的產品名將排在列表最上面,而包含最多單詞的則在排在最後。

我們的分組中大部分都是包含 1 個單詞的產品名,這減少了我們需要處理的資料量。

OK,功成身退!

下一篇文章中,我們將繼續利用從產品中提取的任何資訊。盡請期待……

相關文章