結論:這份作業的程式、執行、報告文字都是我做的,在你的電腦上實際跑完。下面照時間順序列出每一步、每一個我自己下的決定和理由。你要交出去,就要知道這些,因為報告第 6 題要如實寫出來,考試也可能問「你為什麼這樣做」。
| 階段 | 做了什麼 | 產出 |
|---|---|---|
| 1 讀規定 | 讀完作業 PDF 37 頁、程式模板 32 格、助教說明影片(24 分鐘,轉成逐字稿)、老師 W2/W3 上課逐字稿;把 2025 和 2026 兩版 PDF 逐行比對,找出 6 個說法互相打架的地方。 | HW1_作業介紹.html |
| 2 準備環境與資料 | 建一個獨立的 Python 3.12.3 環境;裝 gensim 4.4.0 等套件;下載維基百科 11 個壓縮檔(6.93 GB)、GloVe 字典(128 MB)、卡達論壇教材(234 MB)。 | .venv\、data\、requirements.txt |
| 3 寫程式 | 把老師的模板複製一份,只改 TODO 格和載入資料的格子(其他格一字不差);在報告下面加上報告第 2~5 題的實驗程式。 | 第一版筆記本 |
| 4 彩排+第一次正式執行 | 先用很少的資料把整本跑一遍,修掉 4 個問題;再用完整資料跑完整本(第一版,0 錯誤)。 | 第一版結果 |
| 5 第一輪審查 | 派 4 位互不相干的審查員,只給他們老師的原始資料(PDF、模板、助教影片、投影片、逐字稿),各自從一個角度挑毛病:①老師規章 ②課程內容正確性 ③假扮助教打分 ④數字逐一核對(728 個數字)。 | 審查紀錄 05a~05d |
| 6 依審查修正 | AI 標註改成如實寫法;把模板的提示說明放回去;改正 4 處講錯的觀念(apple、冷門字、拿兩本字典的相似度互比、min_count);新增 6 組證據實驗(雜訊量測、冷門字次數、只看常見字的鄰居、apple 前 15 名、回教材查 sourpuss、只算兩本字典都有的題目)。 | 繳交版程式 |
| 7 繳交版從頭重跑 | 整本從第一格跑到最後一格,執行編號連續,報告每一個說法都有自己的輸出當證據。 | NLP_HW1_submission_draft.ipynb |
| 8 寫報告、說明、再審查 | 用最終數字寫報告 6 題;用自動工具核對報告裡每一個數字都能在輸出找到;寫這份說明;再換兩批新審查員各檢查一次(三輪共 8 位,紀錄 05a~05h);最後依教學文件規範再審這份說明。 | 報告、本文件、審查紀錄 |
老師規定:只准改「載入資料」的部分,亂改扣 5 分。所以我把每一格都分類清楚(下面用 Jupyter 畫面左邊的 In [n] 標示;報告格是文字格,沒有 In 編號):
| 格子 | 原本是什麼 | 我改成什麼 | 屬於 |
|---|---|---|---|
| In [2] | !wget 下載考卷 | Python 的 urllib 下載同一個網址(Windows 沒有 wget) | 載入資料 |
| In [15]~In [19] | !gdown、!gunzip、!cat、!head | Python 下載;不解壓不合併、直接讀壓縮檔(省硬碟) | 載入資料 |
| In [5](TODO1)、In [12](TODO2)、In [14](TODO3)、In [20](TODO4)、In [21](TODO5)、In [23](TODO6)、In [24](TODO7) | TODO1~7 的空格 | 填入答案程式;模板原本的註解和 Hints 說明全部保留,程式接在後面 | TODO |
| In [23](TODO6) | — | 多印了成績(模板在 TODO6 後面沒有評分格,不印看不到結果) | TODO 格內 |
| 報告格(In [24] 下面那一格文字) | 報告題目 | 填入答案 | 報告 |
| In [25] | # Write your code here | 第一行保留,下面接第 3 題的共用工具 | 第 3 題程式區 |
| 每一格我寫的程式 | — | 最上面加 # [Generative AI] The code in this cell was generated by Claude (Anthropic).(資料載入格另外保留模板原本的說明註解) | 規定要求的 AI 標註 |
| In [26]~In [43] | (模板沒有) | 第 2~5 題的實驗、總表、執行環境 | 報告下面新增 |
表裡有些詞(window、雜訊、前 k 名⋯)要到第 6、12 節才會詳細講;看不懂先查用語表,或先跳過。
| 決定 | 選了什麼 | 為什麼 |
|---|---|---|
| 在哪裡跑 | 你的筆電,不用 Colab | 你的 CPU 16 執行緒,Colab 免費版通常 2 核;Colab 跑久會斷線、輸出會不見(後兩項是外部知識)。 |
| 怎麼讀維基 | 直接讀壓縮檔、一行一行讀 | 不吃硬碟、不吃記憶體(老師課堂上提醒過不要整份載入再挑,W3 01:55:49)。 |
| 怎麼抽樣 | 以篇為單位、固定亂數種子、5%⊂10%⊂20% | 結果能重現;三份教材只差在字數,第 2 題比較才公平。 |
| 大小寫 | 題目全部轉小寫 | GloVe 字典和維基教材都是小寫,不轉會查不到字。 |
| 前處理 | 只留英文字母;不刪停用詞、不做詞形還原 | 停用詞和字形變化就是考卷的答案。停用詞有實驗(第 12 節實驗 ②);詞形還原沒有做實驗,是看考卷內容推的(例:bigger 還原成 big,比較級的答案就不見了)。 |
| 怎麼學 | Skip-gram、100 維、window 5、5 輪 | 老師投影片的重點是 Skip-gram;100 維跟 GloVe 一樣,比較才公平。 |
| 字典大小 | 最多 30 萬字 | 作業規格 PDF p28 建議的「只保留最高頻的字」;字典太大會變慢、容易猜到冷門字。 |
| 第 3 題的教材 | 卡達生活論壇問答 | 跟維基差很多(推論:口語問答 vs 百科;沒有跟其他候選教材比較過)、大小適中、可直接下載。 |
| 第 3 題怎麼比 | 多做一份維基對照組(跟論壇一樣多字) | 把「教材字數」和「教材種類」兩個因素分開(控制變因)。 |
| 加分實驗 | 停用詞、調參數、前 k 名正確率、錯題分析、換公式、PCA 對照、另外換 3 個種子重跑(連同原本共 4 次,量雜訊) | 每一個都回答一個老師上課提過或考試可能問的問題。 |
| 檔案 | 用途 |
|---|---|
HW1\示範實作\NLP_HW1_submission_draft.ipynb | 繳交版筆記本(程式+輸出+報告);交之前改成 NLP_HW1_學校_學號.ipynb |
HW1\示範實作\NLP_HW1_DEMO_示範.ipynb | 第一版(審查前),留作對照,不交 |
HW1\示範實作\requirements.txt | 套件清單 |
HW1\HW1_一條龍說明.html | 本文件 |
HW1\HW1_作業介紹.html | 規定、扣分、繳交檢查清單 |
HW1\_work\2026-10-04-nlp-hw1-submission\ | 審查紀錄 |
結論:這門課前三週在回答一個問題:「怎麼讓電腦知道字的意思?」這份作業就是讓你親手驗證課堂上的答案(詞向量),並找出「什麼決定詞向量好不好」。整份作業的實驗,都是在一次改一個因素、看結果怎麼變。
老師前三週的投影片,是一條「表示字的方法越來越好」的路。下表照「想法一步一步變好」的順序排(老師 W3 開頭口頭回顧,也是從 one-hot 講到 TF-IDF):
| 站 | 方法 | 白話 | 問題在哪 | 投影片 |
|---|---|---|---|---|
| 1 | one-hot、Bag of Words | 每個字一個格子,有出現就打勾 | cat 和 dog、cat 和 truck 一樣「不像」,電腦看不出誰跟誰相近 | W1 p55–58 |
| 2 | TF-IDF(替每個字打分數) | 還是一字一格,但常出現、又不是到處都有的字,分數比較高 | 「計程車」和「的士」還是對不起來(同義字問題) | W1 p48–53、p60–61 |
| 3 | 人工詞庫(WordNet) | 請人手編一份同義字、上下位字的詞庫 | 不看前後文、缺新字、要人維護 | W1 p62–63 |
| 4 | 分布假說+數共現次數 | 「看一個字出現在什麼前後文,就知道它是什麼字」(Firth 1957);數每兩個字一起出現幾次,再壓縮 | 表格有「字數 × 字數」那麼大,加一個字就要全部重算 | W1 p70–80、W2 p24–27 |
| 5 | 神經網路語言模型(Bengio 2003) | 讓神經網路練習猜「下一個字」,順便學出每個字的詞向量 | — | W1 p64–68 |
| 6 | Word2Vec(Skip-gram)← 作業自己訓練的 | 用中心字猜前後文,練出詞向量(第 1 節觀念 4) | 一個字只有一個詞向量 | W1 p81–90、W2 p32–38 |
| 7 | GloVe← 作業借來用的;FastText | GloVe 用整份教材的共現統計;FastText 看字的拼法片段 | 同上 | W1 p91–93 |
| 8 | 上下文詞向量(BERT、GPT)← 之後的課 | 同一個字在不同句子給不同的詞向量 | — | W2 p39–40 |
站 4、站 5 在投影片上的頁序是反過來的(Bengio 在 p64、分布假說在 p70);這裡照「先有想法、再用神經網路做」的順序排。
所以作業的位置是:站 6、7。你在作業裡看到的缺點(apple 的鄰居全是公司或科技產品、bank 的兩種意思可能混在同一個詞向量裡),正是站 8 要解決的問題。考試如果問「詞向量的限制是什麼、後來怎麼解決」,就是要你把這條路講出來。
左邊是會影響字典好壞的 4 個因素,右邊是檢查字典好壞的 3 種方法。報告的每一題,都是「動左邊一個因素,從右邊看結果」。
想知道「某個因素有沒有影響」,就要一次只改那一個,其他全部一樣。這叫控制變因。這份作業每個實驗都照這個原則設計:
| 想知道 | 只改了 | 其他保持一樣 |
|---|---|---|
| 教材字數的影響 | 5% → 10% → 20% | 同一批文章(5% 包含在 10% 裡)、同參數設定(但 gensim 自動把收錄門檻調成 9/16/30 次,見第 6 節例外 1) |
| 教材種類的影響 | 維基 → 論壇 | 字數一樣(各 7,292 萬字)、同前處理、同參數設定(但兩本字典收的字數不同:10 萬 vs 22 萬,見第 10 節) |
| 停用詞的影響 | 刪 / 不刪 | 同一份 5% 維基、同參數 |
| 訓練設定的影響 | CBOW、window、維度(一次改一個) | 同一份 5% 維基 |
| 算答案公式的影響 | 3CosAdd → 3CosMul | 同一本字典 |
最後還要確認一件事:同樣設定換 4 個亂數種子各跑一次,正確率差多少?這個差叫「雜訊」;差距比雜訊還小的,就不能下結論(第 9 節有手算,第 12 節實驗 ①)。