這幾天陸續都有談到,要讓電腦能夠處理並理解人類語言的方式,就是要把文字轉換成數值,也就是「向量」。
昨天的 Bag-of-Words Model 把文字轉換成向量的方式很直觀,只看文字出現的次數,不過就沒有考量到字與字之間的語意關係以及語序。
所以今天要介紹的 Word2Vec,就是一個更進階的方法。
它不只把文字變成向量,還會讓這些向量帶有「語意上的關聯性」。
假設我們用 Word2Vec 訓練一個模型,最後會發現「蘋果(apple)」和「香蕉(banana)」的向量彼此之間距離很近,因為它們在語意上有關聯,都屬於水果。
Word2Vec 主要有兩種訓練方式:Skip-gram 和 CBOW(Continuous Bag of Words)。
Skip-gram 是一種產出 word embeddings(詞向量、詞嵌入)的模型,他的概念其實很直觀:
👉🏻 拿一個目標詞(target word),去預測它周圍會出現哪些詞(context words)。
以這個句子為例:
I am drinking a cup of coffee.
假設我們把 window size 設為 2,當目標詞是 drinking 時,它的上下文詞就包含:
左邊的 I、am
右邊的 a、cup
那 Skip-gram 會生成以下訓練的樣本:
(drinking, I)
(drinking, am)
(drinking, a)
(drinking, cup)
簡而言之,skip-gram 學習一個字的表示方式,就是先選好目標詞彙跟指定的window大小的上下文,並將目標詞跟上下文丟給模型去訓練,接著,再讓機器去預測目標詞彙的上下文。
以這個例子而言,就是去看「drinking 這個字附近會出現什麼字?」
先用 one-hot encoding 把文字轉換成機器讀懂的編碼。
經過神經網路(Neural Network)的一層 hidden layer,把高維度、稀疏的向量壓縮成低維度、密集的向量(例如 300 維)。
訓練過程中,模型會逐漸學到詞與詞的關聯,最後我們就能得到一個「詞向量空間」,讓詞語之間的距離和方向反映出語意上的關係。
CBOW(Continuous Bag of Words)跟 Skip-gram 剛好相反,
👉🏻 它是用上下文詞(context words)來預測中間的目標詞(target word)。
沿用上面的例句:
I am drinking a cup of coffee.
假設目標詞是 cup,上下文是 a 和 of,那麼 CBOW 就會用這些上下文詞去推測最有可能的詞,也就是 cup。
因為 CBOW 一次會處理多個上下文詞,所以在計算時,通常會先把這些詞的向量加總或取平均,再丟進模型進行預測。
Word2Vec 相對於 Bag-of-Words 來說有考量到比較多的文字因素,它讓我們不再只是用簡單的詞頻來表示文字,而是能夠把詞投射到一個有意義的向量空間,捕捉語境上的相似性,是 NLP 當中重要的一環!