4 Part II:借別人的字典考試(TODO2 10%、TODO3 5%)

結論:用史丹佛做好的 GloVe 字典去考 19,544 題,答對 63.11%。首都、國籍很準(將近九成),貨幣、反義字首、加 -ly 很差(14%~24%)。t-SNE 圖看得出字是按「角色」分群,男女配對黏在一起。

TODO2 的程式(逐行講解)

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
-ing69.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 節)。

TODO3:t-SNE 圖

把 family 類的 46 個字,從 100 維壓成 2 維畫出來:

⟦IMG:glove_tsne⟧

怎麼看這張圖:

看圖要小心
t-SNE 只是盡量讓「原本很近的點,畫出來也很近」。群跟群之間的距離沒有意義,每次跑形狀也可能不同。所以只能說「這幾個字是一群」,不能說「皇室離複數很遠」。

t-SNE 的參數 perplexity(大約是「每個點要照顧幾個鄰居」)預設 30,但只有 46 個字,所以調成 15。它必須比點的數量小,不然會報錯。

考試可能問
「為什麼要先轉小寫?」→ GloVe 是小寫字典,不轉會查不到(OOV)。
「most_similar 的 positive 和 negative 各放什麼?」→ positive 放 b、c,negative 放 a。
「哪一類最難?為什麼?」→ 貨幣:字很少見,而且有些字有別的常用意思。
「t-SNE 圖上兩群離很遠,代表意思差很多嗎?」→ 不一定,t-SNE 不保留群與群的距離。

7 Part III 用自己的字典考試(TODO6 10%、TODO7 10%)

結論:自己用 20% 維基百科訓練的字典,答對 ⟦R:w20_overall⟧,比 GloVe 低約 15 個百分點。語法類掉得比語意類多。但有一類反而贏 GloVe:美國城市在哪州。

程式

跟 TODO2 一模一樣,只是把 model(GloVe)換成 my_wv(自己訓練的字典)。另外模板在 TODO6 後面沒有放評分的格子,所以我在同一格最後補了印成績的程式(照抄 Part II 評分格的寫法)。不然看不到成績。

跟 GloVe 比一比

⟦R:w20_vs_glove_rows⟧
小類GloVe自己的 Wiki 20%差多少

為什麼比 GloVe 差

原因說明
讀的書少很多我們讀了 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 混了新聞,所以這一類我們的比例比較高。(這是推論,沒有直接驗證。)

TODO7:自己字典的 t-SNE 圖

⟦IMG:w20_tsne⟧

GloVe 的圖自己字典的圖
男女配對黏在一起有有(boy/girl、bride/groom、dad/mom)
皇室一群有有(king、queen、prince、princess 在右下自成一群)
代名詞一群、複數一群有有
「繼」字輩自成一群有沒有,混在 father、mother、sister 中間

可能的解釋:stepfather 這類字在維基百科出現得不多,我們讀的量又只有 GloVe 的九分之一,還學不出「繼父」跟「父親」的差別。(推論。)

考試可能問
「你自己訓練的詞向量為什麼比 GloVe 差?」→ 資料量少(約九分之一)、只有維基百科沒有新聞、方法不同(全域共現統計 vs 局部視窗);三個因素混在一起,作業裡無法分開。
「哪一類下降最多?」→ 這次是 -ing(−38.17)、名詞複數(−30.33)、比較級(−30.03)、最高級(−29.95)這些語法類;美國城市在哪州反而比 GloVe 高(35.51 vs 30.81)。