在自然語言處理領域中,佔據核心地位的就是文字向量化的技術。先前有介紹過了經典好用的 tfidf,這次想要介紹融入了神經網路模型為基礎的
word2vec(Google 2013年論文),事不宜遲,就讓我們往下看看吧
https://arxiv.org/pdf/1301.3781.pdf
目錄
- 什麼是 word2vec?
- word2vec 背後的直覺?
- 如何去建立 word2vec?該怎麼用?
- 總結
一、什麼是 word2vec?
上次介紹tfidf 時,發現tfidf 雖然簡單、好用,但也有幾個明顯缺陷,如:詞與詞之間相似性 維度爆炸、稀疏 這也是 word2vec 出現的主要原因!比如「開心」「雀躍」應該是非常類似的詞,但用 tfidf / one-hot 時,相似性將是0;而 word2vec 是將一個個詞,如「開心」「雀躍」都將其嵌入到 k 維的稠密向量,後續的相似性計算則可以改善過往為0的缺陷。['雀躍'] # [1, 0] 簡單以 2 維來示意
['開心'] # [0, 1]
# cosine similarity = 0
二、word2vec 背後的直覺?
word2vec當時想要改善的是相似性的部分,所以直覺想到的是將原先相當稀疏的向量壓縮到較小維度的稠密向量。而要達到這個概念,作者想到的是將每一個「詞」對應到一個k維的向量,再經過模型訓練,更新 k 維的對應參數,最後可以將其 k 維向量去計算相似性。而這其中背後的直覺在於:「詞」與「周圍的詞」之間是有關連的。
透過大量的文字資料去建立一個語言模型,透過預測出現詞的任務,去優化模型參數,使得「詞向量」可以表達詞與詞之間的關係。
三、如何去建立 word2vec?該怎麼用?
根據論文主要有兩種實踐方式:Skip-gram model:透過中間詞預測周圍詞。
CBOW:透過周圍詞預測中間詞。
對於實現 code 感興趣的可以到
Google 官方教程 參考!而該怎麼使用呢?假設我們已經訓練好了一個 word2vec 模型,而我們以剛剛「開心」「雀躍」為例。「開心」 -> word2vec -> k維向量「雀躍」 -> word2vec -> k維向量以文本分類(正面/負面)來說,將其當作特徵(k維)丟入下游的模型比如隨機森林,去辨識。
# pseudo code
word2vec = Word2vec(...)
vector = word2vec.predict(['開心', '雀躍', '難過'])
rf = RandomForestClassifier(...)
rf.fit(vector, [1, 1, 0])
四、總結
透過 word2vec 模型,可以得到「詞向量」,而「詞向量」聚合可以得到更高階層的「句向量」就可以搭配下游的 NLP 任務,如輿情分析、語意搜尋等任務使用,可以達到不錯的效果(詳見論文)可以發現,上游的詞向量模型與下游的 NLP 任務是獨立的,下游任務並不會改變上游訓練好的詞向量,在某些任務上可能會造成效果比沒有那麼好,這種向量固定的方式也稱為 feature-based。另外也發現,其背後的直覺、假設關係,詞與詞之間的關係是在一定的條件下,而真實的情況不一定完全符合,且沒有考慮上下文不同時,同一個詞可能代表不同意思。下一篇再介紹 BERT,如何去改良了這些缺點,也造成了一股風潮。
如果覺得文章有幫助,希望可以給我一些掌聲👏讓我更有動力繼續分享類似的主題,也歡迎提供想了解的主題唷!
參考