Skip to content

清大 NLP HW1:用 Google Analogy 考詞向量——預訓練 GloVe 對上自己用 20% Wikipedia 訓練的 Word2Vec

2026年9月30日1 分鐘
TL;DRHW1 拿 Google Analogy 的 19,544 題(8,869 題語意、10,675 題語法)考詞向量:先用 Gensim 載入預訓練的 glove-wiki-gigaword-100 作答,再從助教清理好的 Wikipedia 抽 20% 文章自己訓練 Word2Vec,兩邊都畫 family 子類的 t-SNE。七個 TODO 共 55%,報告 45%;Fall 2026 的 TODO 和 2025 相同,只是改成繳交含執行結果的 .ipynb。

🌏 English version

這是清大高宏宇 自然語言處理 導讀系列第 3 篇,接在詞向量與語言模型之後。上一篇講詞向量怎麼訓練出來;這一篇把它拿去考試:詞向量真的學到了「king 之於 queen,如同 man 之於 woman」嗎?自己訓練的會比預訓練的差多少?

本文依據 IKMLab 課程 repo 裡 Fall 2025 的 Assignment 1 資料夾:題目說明 NLP_HW1_word_emb.pdf、起始碼 main.ipynb、處理好的 questions-words.csv,以及助教的說明影片(影片標題是「Week 2 Thu. - Assignment 1」,在 2025 課表掛在 W2 那一列)。這份作業的存取等級是 A3:題目、起始碼、資料都公開,缺的是解答與評分腳本,那些在 NTU COOL 上,校外讀者拿不到。

作業在考什麼

題目 PDF 對 analogy 的說法是:「A is to B as C is to D」。拿詞向量作答,就是算 B − A + C,再找離這個向量最近的詞,看它是不是 D。

投影片第 2 頁寫成「King + Queen − Man ≈ Woman」,這個式子是筆誤。起始碼的提示才是正確版本:word_b + word_c - word_a should be close to word_d。拿 king queen man woman 這題來說,就是 queen − king + man ≈ woman。

資料集是 Google Word Analogy(Mikolov et al., 2013)。repo 附的 questions-words.csv 我實際數過:

類別子類數題數例子
Semantic(語意)58,869family:king queen man woman
Syntactic(語法)910,675gram1-adjective-to-adverb:infrequent infrequently cheerful cheerfully
合計1419,544

子類的題數差很多:capital-world 有 4,524 題,family 只有 506 題。之後比較「哪一類答得好」時,要記得各類的樣本數不同。

起始碼的三個部分

作業在 Colab 上做,main.ipynb 分三段。

Part I:資料前處理。 用 wget 下載原始的 questions-words.txt,每行四個詞;以 : 開頭的行是子類標題。notebook 註解提醒:前五個標題屬於 semantic,後九個屬於 syntactic。TODO1 要把它整理成有 Question、Category、SubCategory 三欄的 DataFrame。助教直接提供了處理好的 CSV,但 PDF 寫明 TODO1 的程式還是要自己寫。

Part II:預訓練詞向量。 用 Gensim 的 downloader 載入 glove-wiki-gigaword-100,註解說也可以換成 Gensim 列出的其他預訓練模型。TODO2 逐題算預測、保留正解;接下來的評估區塊已經寫好,會分別印出兩大類與 14 個子類的準確率(預測詞和正解完全相同才算對)。TODO3 則是把 family 子類出現的詞畫成 t-SNE 圖。

Part III:自己訓練詞向量。 原始的 Wikipedia dump 下載很久,用 Gensim 的 WikiCorpus 清理更久,所以助教先清好了,切成 11 個 .txt.gz 檔,用 gdown 下載。notebook 註解說每個檔有 562,365 行,一行是一篇文章(最後一個檔除外)。清理時用的是 WikiCorpus 的預設參數,所以單一字元的詞都被丟掉了。

接著:

  • TODO4:抽樣 20% 的文章。
  • TODO5:用抽出來的文章訓練自己的 Word2Vec。
  • TODO6、TODO7:和 TODO2、TODO3 一樣,換成自己的模型再答一次題、再畫一次 t-SNE。

PDF 第 28 頁列出建議的前處理:去掉非英文詞、去停用詞、lemmatization(rocks → rock)、比空白切分更好的 tokenization、字典只留高頻詞。同一頁也提醒,這些技巧不一定都會讓分數變好,要自己試。

配分

程式 55%,七個 TODO 的配分如下:

TODO內容配分
1類比資料轉成 DataFrame5%
2用預訓練詞向量作答10%
3預訓練詞向量的 family t-SNE5%
4抽樣 20% Wikipedia 文章5%
5用抽樣文章訓練自己的詞向量10%
6用自己的詞向量作答10%
7自己詞向量的 family t-SNE10%

報告 45%,題目如下:

  • 用了哪個 embedding 模型、做了哪些前處理、超參數怎麼設(5%)
  • TODO4 改抽 5%、10%、20% 時表現如何(10%)
  • 換一個語料訓練,各類別或子類的表現有何不同(15%):呈現結果、介紹你選的語料並說明它和 Wikipedia 在資料量、主題、結構上的差異、解釋表現為何變好或變差,各 5%
  • 挑幾個詞,找出各自最相近的五個詞,你觀察到什麼(10%)
  • 其他能強化報告的內容(5%)

第二題的價值在於它逼你畫出「語料量 vs. 準確率」的曲線。第三題則要你離開 Wikipedia,自己找一份語料。

繳交規則

2025 版要交三個檔案,壓成一個 zip 上傳到 NTU COOL:

  • 程式:從 Colab 下載的 .py,檔名 NLP_HW1_學校_學號.py
  • 套件清單:requirements.txt(例子是 gensim==4.3.3)
  • 報告:照模板寫的 .docx

報告裡要寫執行環境與 Python 版本。用了生成式 AI,程式註解和報告裡都要註明;參考網路上的程式要附連結。檔名、缺 requirements.txt、改動程式模板(只允許改資料載入的部分)等違規各扣 5 分;程式或報告和其他同學高度相似,雙方各扣 100 分。作業期限是三週。

Fall 2026 版改了什麼

2026 作業頁目前只放出 HW1,說明影片換成新的一支。我把 2026 版 PDF 和 2025 版逐行比對,也比對了兩份 notebook:

  • 題目相同:TODO1–7 的內容與配分、資料集、預訓練模型、Wikipedia 檔案都沒變。
  • 繳交格式改了:程式改交 .ipynb,而且要保留執行結果(20% 版本的 Wikipedia),沒有輸出就拿不到任何實驗結果或圖表相關的分數。報告不再用 Word,直接寫在 notebook 的報告區塊。
  • 報告題目微調:換語料那題寫明「except wiki」,而且額外實驗的程式要放在 notebook 裡,否則該題 0 分。找相近詞那題改成至少挑五個詞。另外新增「Generative AI Usage」一欄,沒寫要扣 10 分。

所以拿 2025 的資料自學,和 2026 修課生做的是同一份作業。

動手前的建議

  1. 先把 Part II 跑完再碰 Wikipedia。 Part II 只需要下載 GloVe,幾分鐘就有第一組各類準確率。這組數字是後面所有比較的基準線。
  2. TODO4 先用 5% 走完整條流程。 報告本來就要 5%、10%、20% 三個點,從小的開始可以先抓出前處理的 bug,不用每次等 20% 訓練完。
  3. 注意 OOV。 GloVe 的詞表和你自己訓練的詞表不同。題目裡有詞不在詞表中時,你的程式要怎麼處理,會直接影響準確率,報告裡要講清楚。
  4. t-SNE 圖要看「關係」而不是「群聚」。 family 子類的題目都是 king/queen、man/woman 這種配對,好的詞向量會讓配對之間的位移方向接近。

延伸閱讀

參考資料