我在 Coursera 的 DeepLearning.AI TensorFlow Developer Professional Certificate 課程中,認識到一個有趣的工具,叫做 TensorFlow Embedding Projector,它是由 Google 開發的工具,可用來可視化高維度的詞向量 (embedding),讓我們有機會探索數據點之間的關係。
這篇文章是我嘗試用中文的文本資料來訓練 NLP model,並使用訓練出來的 embedding 來玩這個工具,看看是否能發現一些有趣的關聯。
我的程式碼在此:https://github.com/alisonyang/data-science-blog/blob/main/NLP_Text_Embedding_Chinese.ipynb
訓練文本我使用豆瓣的電影評論資料集,其實我蠻想找繁體資料集來玩的,但時間因素,我最後選擇這一個。資料集樣貌:
由於我要做簡單的二元分類模型,因此我選擇 Star 和 Comment 這兩個欄位分別當 Label 和 Feature。Label 的部分我將 1~5星用簡單粗暴的方法將其分成 0 (negative), 和 1 (positive)。對於 Feature 方面,我使用結巴(jieba)來處理中文斷詞, 而stop word list 則是參考這裡的文檔。
這個模型簡單且無腦,我沒有花時間在 tuning 上,因為我主要目的是想產生 embedding weights,可上傳到 TensorFlow Embedding Projector 即可。
如果你不想花費時間訓練模型,也可以直接下載 vecs.tsv 和 meta.tsv 這兩個檔案。
vecs.tsv — 包含詞彙表中每個單詞的向量權重
meta.tsv — 包含詞彙表中單詞的名稱
接著我們到 TensorFlow Embedding Projector 網頁,在左側欄選擇「Load」,依序上傳 vecs.tsv 和 meta.tsv 。
上傳成功後你會看到這個畫面,就可以開始隨意玩啦!
可以在右側的 「Search」 欄輸入特定的字看與它鄰近的字有哪些,例如當我分別輸入「棒呆」、「大失所望」,得到的相鄰字大不同:
前面提到的 Embeddings 是將資料集中的詞彙映射到高維的向量空間。透過這個二元分類的NLP 模型,也就是將電影評論分類為「好評」或「壞評」的訓練過程,我們可用學習到的 embedding weights 來看這些單詞的語義。例如,在查看電影評論時,具有正面情感的單詞「棒呆」的維度會指向特定方向,而具有負面情感的「大失所望」則指向不同的方向。
另外,當選擇 「isolate 101 points」可以看的更清楚這一群有哪些鄰近的單詞。以「大失所望」為例,第一眼初步看到的是,的確這一群都蠻負面的 😅。接著可看到「無聊」、「沒勁」、「又臭又長」等單詞。
誒~等等,怎麼有「黃曉明」🫣,這是 model 說的,不是我說的喔…
感覺蠻好玩的,那讓我們來仔細看一下「棒呆」:
大部分的詞是正面的,像是「三刷」、「值得一看」、「完美」、「好片」、「怒贊」等。
感謝 TensorFlow Embedding Projector 這個可視化工具,我覺得當訓練完模型後,可以先花時間在上面探索模型訓練出來的詞向量分佈是否符合你所預想的,好啦~本篇分享就到此結束啦,我自己是玩得蠻開心的,希望你也是!