內容推薦 (1) 關鍵詞識別

背景

從內容召回說起

電商推薦系統多路召回中,通常會有一路召回商品叫內容召回 $\text{content I2I}$

content I2I 與其他根據用戶行為的召回不同, 最簡單的 content I2I 可以根據 A 商品 title 內容找出其他與 A 相似的 title 的商品,這給了他很強的推薦解釋性

對於商品冷啟動或者系統冷啟動來說,content I2I 可以在沒有用戶交互訊息時,就可以進行推薦,也不失為一種冷啟動方案。

在萬物皆可 Embedding 的今天,content I2I 只要把所有商品的 title 送進 word2Vec 硬 train 一發也就完事了

當然要是這麼簡單,也就不會有這篇了

推薦系統相關文章

一言難盡的商品 title

我司的電商商品 title 為中翻英淘寶商品 title 而來,基本上毫無文法可言

如果用 word2Vec 硬做一發,再以 doc2vector 的思路融合成 sentence vector ,肯定會加入某些糟糕詞彙的 vector。

諸如此類的怪異詞彙:

  • EX: “real time” (應該是實時發貨?) , liu haichang(劉海夾??), two yuan(兩元?), yiwu(義烏?)

為了讓 vector 能更好的表達句子 title,加上組內對於商品關鍵字有需求,於是就有了以下商品 title 挖掘出中 產品詞 與 標籤詞的識別任務

原理

關鍵詞識別

先解釋一下,什麼是產品詞,什麼是標籤詞

以下是我自己的定義:

商品 title

所有商品都會有自己的 tilte,但肯定會有一個 “產品詞” 去描述這商品到底是賣什麼,他可以是單詞,稱為 unigram,也可以複合詞,bigram or trigram……

  • unigram:shirt , blouse
  • bigram: apron dress, bermuda shorts
  • trigram: buckle strap shoes, denim mini dress

“ 標籤詞 “ (label words),定義比較空泛, 狹義一點指那些可以用來形容商品或能凸顯商品特色的詞

  • unigram: denim, hipster
  • bigram: chinese tunic, cotton padded
  • trigram: deep v collar

廣義一點,也可以包含產品詞,最終還得看業務需求,標籤詞他還能在細分出 "屬性詞"(propery)

  • 領口:高領, 低領,V 領,深 V ..
  • 材質:棉,麻 …

不管怎樣,如果沒有人工去蒐集出詞彙,那就得靠機器自己挖掘詞彙字典。

問題來了,在我們的商品池中的商品 title,基本上沒什文法可言,詞彙也是中翻英出來的。

如何找出有意義的詞彙組成的 "產品詞"或"標籤詞"就是問題的核心了

EX:
"long","sleeved" 分別看沒什意義,但合起來變成 bigram words: "long sleeved” 就有意義

那要怎麼衡量 words 跟 words 之間的組合程度呢?

就是 熵 entropy了

Entropy 識別關鍵字

Entropy

在 information theory 中 ,entropy 被用來衡量系統內的不確定性程度

"不確定性"(uncertainty) 跟 information 豐富程度是一體兩面的

entropy 越高,代表不確定性越高,代表能提供的 information 也更多

舉例來說,如果明天會下雨的 probability 為 0.5,天氣系統的 entropy (以 2 為底)就是

如果明天會下雨的 probability 為 1,那天氣系統的 entropy 就是

代表天氣系統完全沒有不確定性,明天肯定會下雨,對我們無法提供任何 information

我們可以利用 entropy 來衡量 :

  • 內聚力:word 跟 word 之間的連結緊密程度,由互消息衡量之
  • 豐富度:words 本身的自由運用程度,由 left entropy / right entropy 衡量之

互消息 (MI - Mutual Information)

先上公式

再上圖

看圖就可以直觀明白,$I(X,Y)$ 可以用來衡量兩個事件彼此的關聯性,直觀上互消息可以用來衡量兩個 word 之間的依賴程度。

$\text{PMI}$ (point-wise mutual information) 也可以用來來衡量兩個 word 的相關性,他被視為簡化版的 $\text{MI}$

word A 跟 word B 的 PMI(A, B) 或 MI(A,B)value 越高,代表 A, B 越相互依賴,組成一個 term 的可能性越越大

但從公式上不難看出,MI 是 weighted 過後的 PMI。在實務上,PMI 傾向給 “those word only occur together” 組成的 bigram 較高的分數 ; 而 MI 傾向給 high frequency bigram 更高的分數

EX:
在商品 title 中有個詞 "small fresh"

  • joint probability $\text{p(“small”, “fresh”)} = 0.002$
  • $\text{p(“small”)} = 0.0058$ $\text{p(“fresh”)}= 0.0035$
  • $\text{PMI(“small”, “fresh”)} = 4.59$
  • $\text{MI(“small”, “fresh”)} =0.009$

有另一個詞 "fresh loos"

  • join probability $\text{p(“fresh loose”)} = 0.0001$
  • $\text{p(“fresh”) =0.0035}$ $\text{p(“loose”)} = 0.0024$
  • $\text{PMI(“fresh”, “loose”)} = 2.47$
  • $\text{MI(“fresh”, “loose”)} =0.00024$

顯然,對於 fresh 這個 word 而言,"small fresh"比 "fresh loose"成詞程度較高。

左右熵

左右熵代表了 word 本身可以自由運用的程度

我們知道,一個 word A 可以跟左邊的 word L,也可以跟右邊的 word R 組合,而左右熵就是來衡量 word A 組成 phase 的豐富程度

EX:

假設 "skirt " 這個產品詞在池子中的鄰字組合計數如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def cal_information(x):
return - x * math.log(x)

def cal_entropy(freqDict):
total_count = sum(list(freqDict.values()))
informations = [cal_information(fre / total_count) for fre in freqDict.values()]
return sum(informations)

skirt_left = {
"long skirt": 500,
"midi skirt": 1000,
"pegged skirt": 100,
"pleated skirt": 300,
"prairie skirt": 20
"printed skirt": 400,
"sarong skirt": 80,
"trumpet skirt": 600
}
skirt_right = {
"skirt suit": 500,
"skirt dress": 1000
}

則 skirt 的 left entropy 為

right entropy為

顯然對 “skirt” 而言,左側語境比右側豐富

Normalize Entropy & PMI & MI

PMI, MI 與 entropy 的值域是個相對 unbound 的值,造成在使用時比較難拿捏 threshold,得來回比對數值決定成詞標準,解決方法是 normalize 值到固定範圍內:

  • Normalizing PMI into (1, -1)
  • Normalizing MI into (0, 1)
  • Normalizing entropy into (0, 1)

論文研究顯示 Normalized MI & PMI 為對角線趨勢,但依然會有一定失真,所以在使用上得自行拿捏Normalized (Pointwise) Mutual Information in Collocation Extraction

一般來說

  • MI 偏向 high frequency,NMI 會稍微將高頻詞 push down ,低頻詞 pull up
  • PMI 偏向 low frequency,NPMI 稍微降低低頻詞的 rank

Score 成詞分數

有了度量語境豐富度跟詞彙內聚力的工具後,得進一步定出一個 score 代表"成詞程度",score 越高,代表這個詞成為有意義詞的可能性相對較高。

先定義一個 candidate phrase 的抽象表達,方便我們計算其成詞 score。

我們的 Candidate phrase 可以是以下這些組合:

  • unigram candidate (special case)
    • [unigram] , ex: [skirt]
  • bigram candidate
    • [unigram] :: [unigram], ex: [long :: skirt]
  • trigram candidate
    • [unigram] :: [bigram], ex: [casual] :: [long skirt]
    • [bigram] :: [unigram] ex: [flower printed] :: [shirt]

拆分成 [Left] :: [Right] 的形式方便我們泛化處理 candidate phrase

接下來利用定義好的 candidate phrase 來計算成詞 score

product_label_word

這裡給出一個最簡單的 score 計算:

  • $\min(Right_{\text{left_entropy}}, Left_{\text{right_entropy}})$ 分別表示,Left side 與 Right side 各自的語境豐富程度,通常取 min 後的的值越大,代表 Left side 或 Right side 有一側傾向與其他詞結合,candidate 越不可能成詞
  • $\min(\text{right_entropy}, \text{left_entropy})$ 表示 candidate 左右兩側語境豐富成度,越大代表 candidate 越可能成詞

Label Score & Product Score

有了以上的 background 是時候來說說產品詞跟標籤詞的特性了,大致上

  • 產品詞在 candidate 會出現在 right side,其左側自由度較高: left_entropy > right_entropy

lace blouse

  • 標籤詞在 candidate 會出現在 left side,其右側自由度較高: right_entropy > left_entropy

short sleeve

顯然只有成詞分數 score 不足以將產品詞和標籤詞分離,所以每個 candidate phrase,會針對 label 跟 product 特性計算 label score 跟 product score。

先上圖:product_label_recong

  • Right Phrase,表 corpus 內出現在 candidate right side 的 phrase 集合
    • EX : short sleeve right side unigram 集合

  • Light Phrase,表 corpus 內出現在 candidate left side 的 phrase 集合

計算 Right Phrases 集合內每一個 phase 對 candidate phrase 的 sum of information,代表從所有 right phrases 的角度來看 candidate phrase 的豐富度,值越高代表 candidate 的 right phrases 組成越豐富,其成為 label 的機會越高。

cal_information

我們希望單個 $\text{phrase}_i$ 對 candidate phrase $C$ 的 conditional probability $p(\text{phrase}_i::C|\text{phrase}_i)$ 不要太高也不要太低,此時算出的 $\text{information} = - p(\text{phrase}_i::C|\text{phrase}_i) \log p(\text{phrase}_i::C|\text{phrase}_i)$ 恰好是最大

  • $I_{L,C}$ 表 left phrases 對 candidate 的 sum of information
  • $C_L$ 表 candidate 的 left phrase 集合

有了 left / right phrases information,一個簡單的 label score and product score 計算如下

P.S. 上面分數計算只是提供一個計算思路,實際使用還是得資料分析

Engineering

Data Structure

candidate phrase 的需要計算的值有

  • candidate 的 left entropy and right entropy
  • candidate 的 PMI/MI 中的 joint probability / frequency
  • left component 的 entropy ; right component 的 entropy
  • right phrase information and left phrase information
  • … etc

為了方便計算 candidate 需要兩種 Tries ,一個存 corpus 內所有 sentence 的 prefix tries,另一個存 corpus 內所有 reversed title 的 reversed tries (叫 suffix tries 怕有歧義)

title = "Masks Scarf Cashmere Sweater Cap" 為例

首先將 title 所有可能 ngram 取出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
['Masks', 'Scarf', 'Cashmere', 'Sweater', 'Cap']
['Masks', 'Scarf', 'Cashmere', 'Sweater']
['Masks', 'Scarf', 'Cashmere']
['Masks', 'Scarf']
['Masks']
['Scarf', 'Cashmere', 'Sweater', 'Cap']
['Scarf', 'Cashmere', 'Sweater']
['Scarf', 'Cashmere']
['Scarf']
['Cashmere', 'Sweater', 'Cap']
['Cashmere', 'Sweater']
['Cashmere']
['Sweater', 'Cap']
['Sweater']
['Cap']

build prefix tries:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[['Masks'],
['Masks', 'Scarf'],
['Masks', 'Scarf', 'Cashmere'],
['Masks', 'Scarf', 'Cashmere', 'Sweater'],
['Masks', 'Scarf', 'Cashmere', 'Sweater', 'Cap'],
['Scarf'],
['Scarf', 'Cashmere'],
['Scarf', 'Cashmere', 'Sweater'],
['Scarf', 'Cashmere', 'Sweater', 'Cap'],
['Cashmere'],
['Cashmere', 'Sweater'],
['Cashmere', 'Sweater', 'Cap'],
['Sweater'],
['Sweater', 'Cap'],
['Cap']]

build reversed tries:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[['Cap'],
['Cap', 'Sweater'],
['Cap', 'Sweater', 'Cashmere'],
['Cap', 'Sweater', 'Cashmere', 'Scarf'],
['Cap', 'Sweater', 'Cashmere', 'Scarf', 'Masks'],
['Sweater'],
['Sweater', 'Cashmere'],
['Sweater', 'Cashmere', 'Scarf'],
['Sweater', 'Cashmere', 'Scarf', 'Masks'],
['Cashmere'],
['Cashmere', 'Scarf'],
['Cashmere', 'Scarf', 'Masks'],
['Scarf'],
['Scarf', 'Masks'],
['Masks']]

當我們的 candidate phrase = ["Cashmere" :: "Sweater"] 時,

透過 prefix tries 即可找出 ["Cashmere" :: "Sweater"] 右側所有的 phrase node

透過 reversed tries 即可找出 ["Cashmere" :: "Sweater"] 左側所有的 phrase node

啟發式辨識流程

用 entropy 辨識產品詞與標籤詞本質上是 unsupervised learning 的做法,如果以 threshold 卡 score, label score, product score 判斷結果,肯定事倍工半。辨識過程中加入 clustering/grouping 輔助判斷,多迭代幾遍後就能搜集到高度置信的結果。

Grouping

把 candidate phrase 當成 data sample $x$ 的話,其包含的特徵有

  • 自身統計類:frequency ,probability … etc
  • 自身 entropy related PMI/MI,NPMI/NMI,left entropy / right entropy
  • left / right component related: PMI/MI ,entropy to left/entropy to right
  • left phrase/right phrase related: sum of information ,deviation,diversity,total frequency,average frequency,total phrase …etc
  • score 類:成詞 score ,label score,product score

挑出 data samples 裡有鑑別度的特徵丟進 cluster 算法中初步分成四群:

  • group A: 獨立成詞
    • 一些用法固定的詞彙
    • ex : “big code”(這應該是想表示大碼?),”united state”
  • group B: label 詞
    • 符合 label 詞的特性,右側自由度高
    • ex: “short sleeved”
  • group C: 右側 product 詞
    • 符合 product 詞的特性,左側自由度高
    • ex: “lace blouse”
  • group D: 無用詞
    • 沒什意義的詞,本身成詞 score 不高
    • ex: “lace long”

然後在每個 group 中,分別挑出多個 high confidence and typical data samples ,跟其餘的 data sample 做 KNN/Kmean,來回個幾次做 semi-supervised 。

Exploration

隨著置信的 data sample 越多,可以考慮訓練 decision tree,辨識新的 candidate phrases。

也可以利用 word2Vec 強大的相近詞搜索相似的 產品詞/標籤詞 挖掘辨識新的產品詞/標籤詞

這兩個做法建立在手頭上的詞彙已能很好區分出產品詞和標籤詞的情況下,例如用 word2Vec 找相近產品詞有奇效:

In:

1
w2v_model.wv.most_similar("flight_jacket", topn=10)

out:

1
2
3
4
5
6
7
8
9
10
[('bomber_jacket', 0.8251528739929199),
('flight_suit', 0.8104218244552612),
('coach_jacket', 0.7058290243148804),
('workwear_jacket', 0.7037896513938904),
('jacket', 0.7035773992538452),
('ma_1', 0.6985215544700623),
('baseball_uniform', 0.6333736181259155),
('ma1_pilot', 0.6201080679893494),
('jackets', 0.608674168586731),
('denim_jacket', 0.6048851013183594)]

Some Tips

  1. candidate phrase proposal:可以透過 TF-IDF, frequency, student-t, PMI 先行召回一批 candidate 再開始辨識
  2. 一次處理一種 ngram
  3. 辨識過程中加入字典輔助
    • product words 黑白字典
    • label words 黑白字典
  4. 善用 bigram / trigram 可以由其他 phrase 組合出,可以省去很多計算量
    • 產品詞組成
      • unigram 產品詞
        • [unigram], ex: skirt
      • bigram 產品詞
        • [unigram label] :: [unigram product] , ex: long skirt
        • [unigram] :: [unigram], ex: phone shell (手機殼 …)
      • trigram 產品詞
        • [bigram label] :: [unigram product], ex: long sleeved blouse
        • [unigram label] :: [bigram product], ex: little black dress
    • 標籤詞組成
      • unigram 標籤詞
        • [unigram], ex: slim
      • bigram 標籤詞
        • [unigram] :: [unigram], ex: v neck, high cut
      • trigram 標籤詞
        • [unigram label] :: [bigram label], ex: half high collar
        • [bigram label] :: [unigram], ex: deep v collar

Reference

Author

seed9D

Posted on

2021-02-09

Updated on

2021-02-10

Licensed under


Comments