結論:用史丹佛做好的 GloVe 字典去考 19,544 題,答對 63.11%。首都、國籍很準(將近九成),貨幣、反義字首、加 -ly 很差(14%~24%)。t-SNE 圖看得出字是按「角色」分群,男女配對黏在一起。
for analogy in tqdm(data["Question"]): # 一題一題做(tqdm 只是顯示進度條)
word_a, word_b, word_c, word_d = analogy.lower().split() # ① 先轉小寫,再切成四個字
golds.append(word_d) # 正確答案先記下來,等一下對答案
if all(w in model.key_to_index for w in (word_a, word_b, word_c)): # ② 三個字都查得到嗎?
preds.append(model.most_similar(positive=[word_b, word_c], # ③ b + c − a
negative=[word_a], topn=1)[0][0])
else:
preds.append(None) # 查不到 → 這題算答錯
| # | 在做什麼 | 為什麼 |
|---|---|---|
| ① | 先轉小寫 | GloVe 字典裡的字全部是小寫。考卷有 Athens、Greece 這種大寫字,不轉的話會查不到,程式直接報錯。正確答案也要轉小寫,不然 iraq 和 Iraq 會被判成不一樣。 |
| ② | 檢查三個字是不是都在字典裡 | 字典裡沒有的字叫 OOV(out-of-vocabulary,字典外的字)。查不到就沒辦法算,直接算答錯。GloVe 有 40 萬字,這次 0 題查不到。 |
| ③ | most_similar(positive=[b, c], negative=[a]) | 就是第 1 節的 b − a + c:positive 是「加」,negative 是「減」。topn=1 只拿最近的那一個字當答案。Gensim 會自動排除題目裡的 a、b、c 三個字,不然最近的字常常是題目自己(例如算出來最像的是 queen 本身)。 |
| 小類 | 答對率 | 白話 |
|---|---|---|
| 整體 | 63.11% | (語意 65.34%、語法 61.26%) |
| 常見國家首都 | 93.87% | Athens : Greece = Baghdad : ? |
| 全世界首都 | 88.95% | |
| 國名 → 國籍 | 87.87% | Albania : Albanian |
| 家人/性別 | 81.62% | boy : girl |
| 比較級 | 79.13% | bad : worse |
| 名詞複數 | 72.00% | banana : bananas |
| -ing | 69.51% | code : coding |
| 動詞第三人稱 | 58.39% | decrease : decreases |
| 過去式 | 55.45% | dancing : danced |
| 最高級 | 54.28% | bad : worst |
| 美國城市在哪州 | 30.81% | Chicago : Illinois |
| 形容詞 → 副詞 | 24.40% | amazing : amazingly |
| 反義字首 | 20.07% | aware : unaware |
| 貨幣 | 14.20% | Algeria : dinar |
| 情況 | 原因(白話) |
|---|---|
| 首都、國籍很準 | 新聞和維基百科裡天天寫「某國首都某某」「某國人」,而且這些字都很常見,座標學得很穩。 |
| 貨幣很差 | kwanza(安哥拉的錢)、dram(亞美尼亞的錢)這些字一年也出現不了幾次,座標學不準。而且 won(韓圜)、real(巴西的錢)這種字平常是別的意思(贏了、真的),座標被平常的意思拉走。 |
| 反義字首、-ly 很差 | aware 和 unaware 的前後文常常一樣(「I was __ of it」),所以座標很近,但「加上 un-」這個方向不夠一致。詞向量只看前後文,看不到字的拼法。 |
| 美國城市在哪州普通 | 很多美國城市名同時出現在好幾個州(例如好多州都有 Springfield),地圖上不好擺。 |
上面的原因是根據詞向量的原理推論的;要真的確認,要看錯題分析(第 12 節)。
把 family 類的 46 個字,從 100 維壓成 2 維畫出來:
⟦IMG:glove_tsne⟧
怎麼看這張圖:
t-SNE 的參數 perplexity(大約是「每個點要照顧幾個鄰居」)預設 30,但只有 46 個字,所以調成 15。它必須比點的數量小,不然會報錯。
結論:自己用 20% 維基百科訓練的字典,答對 ⟦R:w20_overall⟧,比 GloVe 低約 15 個百分點。語法類掉得比語意類多。但有一類反而贏 GloVe:美國城市在哪州。
跟 TODO2 一模一樣,只是把 model(GloVe)換成 my_wv(自己訓練的字典)。另外模板在 TODO6 後面沒有放評分的格子,所以我在同一格最後補了印成績的程式(照抄 Part II 評分格的寫法)。不然看不到成績。
| 小類 | GloVe | 自己的 Wiki 20% | 差多少 |
|---|
| 原因 | 說明 |
|---|---|
| 讀的書少很多 | 我們讀了 6.66 億個字。GloVe 讀的是維基百科全部+大量新聞(Gigaword),共約 60 億個字,大約 9 倍。(60 億是 GloVe 官方公布的數字。) |
| 方法不同 | GloVe 用整份資料的共現統計(Global),Word2Vec 用局部視窗(Local)。老師說「一般來講我們會覺得 GloVe 比 word2vec 好」(W3 01:32:25)。 |
| 文章種類不同 | GloVe 混了新聞,我們只有維基。 |
語法類為什麼掉比較多?(推論)比較級、最高級、-ing 這些字形,在百科全書裡比較少用(百科很少寫「最好的」「正在跑」);GloVe 混了新聞,可能因此比較多。第 10 節的論壇實驗顯示「文體會影響語法類」,但論壇是網友口語,不是新聞,所以不能直接證明新聞的效果。而且 GloVe 跟我們同時差了方法、資料量、文章種類,無法分開。
美國城市在哪州為什麼反而贏?維基百科每一個美國城市都有一篇文章,開頭幾乎都是「X 是 Y 州的一個城市」,這種句型重複了上萬次。我們讀的 100% 是維基百科,GloVe 混了新聞,所以這一類我們的比例比較高。(這是推論,沒有直接驗證。)
⟦IMG:w20_tsne⟧
| GloVe 的圖 | 自己字典的圖 | |
|---|---|---|
| 男女配對黏在一起 | 有 | 有(boy/girl、bride/groom、dad/mom) |
| 皇室一群 | 有 | 有(king、queen、prince、princess 在右下自成一群) |
| 代名詞一群、複數一群 | 有 | 有 |
| 「繼」字輩自成一群 | 有 | 沒有,混在 father、mother、sister 中間 |
可能的解釋:stepfather 這類字在維基百科出現得不多,我們讀的量又只有 GloVe 的九分之一,還學不出「繼父」跟「父親」的差別。(推論。)