能被電腦理解的文字 NLP(一) — Word Embedding
自然語言處理 Nature Language Processing (NLP),一直以來都是科技發展的重點之一。
我們總是希望有個管家機器人,只要跟他說句話就能幫忙處理大小事,例如做早餐、泡咖啡、傳送訊息,甚至是組裝鋼鐵鎧甲(我希望有全自動駕駛的鋼鐵鎧甲每天接送我上下班)。
而在語音助手這一方面,從幾年前震驚所有人但現在不值一提的 Siri,或是明顯成長的 Google Assistant,到更進一步的 Amazon Alexa、Google Home,都在逐步實現我們的夢想。
而在文字處理方面也有了許多的改變,這篇將介紹將文字編碼的方式。
Bag of Words (BoW)
BoW 是一種將句子拆解成每個詞出現次數的方法,例如我將以下兩個句子拆解
I like apple.
{"I": 1, "like": 1, "apple": 1}
I like mango.
{"I": 1, "like": 1, "mango": 1}
這方法乍看之下分析出了句子的組成,但是卻忽略掉了很重要的次序關係,會使得以下兩句的結果完全相同
I like apple, but I don't like mango.
I like mango, but I don't like apple.
Word Embedding
Word Embedding 的概念是建立字詞向量(Word Vector),例如我定義一個向量的每個維度對應到什麼字,並且將句子中每個字轉換為向量,最後結合起來變成矩陣。
["I", "like", "apple", "mango"]
I => [1, 0, 0, 0]
like => [0, 1, 0, 0]
apple => [0, 0, 1, 0]
mango => [0, 0, 0, 1]
"I like apple" =>
[[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]]
"I like mango" =>
[[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 0, 1]]
如此一來不僅可以保留句子中字詞的順序,使 BoW 範例中兩個語意相反的句子有不同的呈現,且改變為適合電腦運算的矩陣形式,但產生了新的問題是「當字詞過多時每個字的向量會太長,句子轉換的矩陣亦會更加龐大,且這矩陣中有大量的欄位皆為 0」。
這麼一來使得電腦多了許多額外的運算及儲存成本,而且整體的效率十分低,後來有了更好的方法。
Word2vec
Word2vec 依靠了 skip-gram 與 Continuous Bag of Word (CBOW) 的方法來實作,核心是一個極為淺層的類神經網路。透過使每個字詞與前後字詞的向量相近,來訓練出含有每個字詞語義的字詞向量。
透過上圖可以發現 男-女 關係的字詞在將向量降維到二維平面的結果,會有相似的值與關聯。如果對降維有興趣,可以參考另一篇文章《多維度資料視覺化呈現的好夥伴-主成份分析法(PCA)》。
依照 stanfordnlp/GloVe 預先訓練好的 word vector 中,可以用 300 維的向量來表示兩百二十萬個字詞,可以有效解決上述的維度爆炸問題,節省了大量的運算及儲存成本。
結論
Word2vec 對於文字處理的領域帶來了巨大的改變,後面也可以再使用 Convolution Neural Network 來做進階的辨識等方法。
但是要注意的點是訓練出來的 Word Vector 與訓練資料有極大的相關,例如在食譜網站中「蜜桃」的相關字詞可能是「蘋果」,但是在男性雜誌中可能就不是如此。
又或著有團隊進行過研究,用不同年代的資料訓練 Word Vector。發現「蘋果」在二十年前的相關字詞是冰淇淋、蛋糕等甜點類,到了十年前則是與其他水果類相關,而近幾年是與其他科技公司相關。 論文連結:Dynamic Word Embeddings for Evolving Semantic Discovery
Word2vec 在字詞的層面獲得了不錯的成果,但如果將一份文件中每個字詞的向量加總,試圖來獲得這份文章的 vector 時,依舊是會發生失去了順序性的問題,下一篇我將介紹 Doc2vec 這方法。