cs224n學習筆記1——Introduction and Word Vectors

1 WordNet使用

1.1 簡介

wordnet:一個詞典

調用wordnet:

from nltk.corpus import wordnet as wn
  • lemma 詞根
  • synonym 同義詞
  • hypernym 上位詞
  • hyponym 下位詞

1.2 使用

poses = {'n':'noun','v':'verb','s':'adj(s)', 'a':'adj', 'r':'adv'}
for synset in wn.synsets('good'):
    print('{}:{}'.format(poses[synset.pos()], ','.join([l.name() for l in synset.lemmas()])))
  • synsets()查看一個單詞的同義詞集合,synonym sets

  • pos()查看單詞的詞性,可以爲(n|v|s|a|r),分別表示(名詞|動詞|形容詞|副詞)

  • hypernyms()查看單詞的上位詞

  • 一個 synset 被一個三元組描述:(單詞.詞性.序號)

    如 ’dog.n.01’ 指:dog 的第一個名詞意思;’chase.v.01’ 指:chase 的第一個動詞意思。

2 詞向量前期發展

2.1 one-hot

RV×1\mathbb{R}^{|V| \times 1} 維度的詞向量代表每個單詞,詞向量只由 0 和 1 表示,給出一個很大的詞彙表 V,詞彙表中的單詞是排序的,然後用這個詞彙表中的序號代表每個單詞中 1 出現的位置。

缺點:

  • 所有詞向量都是正交的,無法表示單詞之間的相似度關係
  • 詞彙表一般很大,這樣表示的詞向量的維度也很大

2.2 SVD Based Methods

2.2.1 Word-Document Matrix

詞-文檔矩陣,X 是按照以下方式構建:遍歷數億的文檔和當詞 i 出現在文檔 j,我們對 Xij 加一。這是一個很大的矩陣( RV×M\mathbb{R}^{|V| \times M}),它的規模是和文檔(M)成正比關係。

2.2.2 Window based Co-occurrence Matrix共現矩陣

計算每個單詞在我們感興趣單詞的附近特定大小的窗口中出現的次數。按照這個方法對語料庫中的所有單詞進行統計。

打個栗子:

有三句話

  1. I enjoy flying。
  2. I like NLP。
  3. I like deep learning。

計數矩陣的結果如下所示:

在這裏插入圖片描述

通過這兩種方法得到的矩陣,通過奇異值分解,選擇前 K 個行向量作爲詞向量。

這兩種方法都給我們提供了足夠的詞向量來編碼語義和句法(part of speech)信息,但伴隨許多其他問題

  • 矩陣的維度會經常發生改變(經常增加新的單詞和語料庫的大小會改變)。
  • 矩陣會非常的稀疏,因爲很多詞不會共現。
  • 矩陣維度一般會非常高
  • 基於 SVD 的方法的計算複雜度很高 ( m×n 矩陣的計算成本是 O({mn}^2) ),並且很難合併新單詞或文檔
  • 需要在 X 上加入一些技巧處理來解決詞頻的急劇不平衡(比如某個單詞在文檔中出現的概率爲0,並不表示這個單詞不存在)

對上述討論中存在的問題存在以下的解決方法:

  • 忽略功能詞,例如 “the”,“he”,“has” 等等。
  • 根據文檔中單詞之間的距離對共現計數進行加權
  • 使用皮爾遜相關係數並將負計數設置爲0,而不是隻使用原始計數

3 Word2vec

兩個算法:CBOW 和 skip-gram

  • CBOW:由上下文單詞預測中心單詞
  • skip-gram:由中心單詞預測上下文單詞

兩種訓練方法:negative sampling 和 hierarchical softmax

3.1 n-gram

一個單詞出現的概率依賴於它從第一個單詞w1到它之前一個單詞wi1w_{i−1}的影響:

p(S)=p(w1w2⋯wn)=p(w1)p(w2∣w1)⋯p(wn∣wn−1⋯w2w1)

問題:參數空間過大;數據稀疏嚴重;

引入:馬爾科夫假設,這個單詞出現的概率只與他前 n 個單詞出現的概率有關,這就是 n-gram

3.2 skip-gram

skip-gram:由中心單詞預測上下文單詞

在skip-gram模型中,每個詞被表示成兩個 d 維向量,用來計算條件概率。假設這個詞在詞典中索引爲 i,當它爲中心詞時向量表示爲 Vi,而爲背景詞時向量表示爲 Ui 。設中心詞 Wc 在詞典中索引爲 C,背景詞 Wo 在詞典中索引爲 O,我們假設給定中心詞生成背景詞的條件概率滿足下式:

在這裏插入圖片描述

3.3 CBOW(Continuous bag-of-words)

CBOW:由上下文單詞預測中心單詞
在這裏插入圖片描述

問題:skip-gram 和 CBOW 的梯度計算的開銷與詞典 V 的大小相關。詞典很大時,計算開銷很大,因此採用「負採樣」或者「hierarchical softmax」來解決這個問題。

3.4 負採樣(negative sampling)

詞典 V 大小之所以會在目標函數中出現,是因爲中心詞 Wc 生成背景詞 Wo 的概率 P(Wo | Wc ) 使用了 softmax,而softmax正是考慮了背景詞可能是詞典中的任一詞, 並體現在softmax的分母上。

我們不妨換個角度,假設中心詞 Wc 生成背景詞 Wo 由以下兩個相互獨立事件聯合組成來近似:

  • 中心詞 Wc 和背景詞 Wo 同時出現在該訓練數據窗口
  • 中心詞 Wc 和第 1 個噪聲詞 W1 不同時出現在該訓練數據窗口(噪聲詞 W1 按噪聲詞分佈 P(w) 隨機生成)
  • … …
  • 中心詞 Wc 和第 K 個噪聲詞 Wk 不同時出現在該訓練數據窗口(噪聲詞 Wk 按噪聲詞分佈 P(w) 隨機生成)

其中,k 是採樣個數,P(w)是一個unigram分佈。此處的採樣是基於詞出現頻率的採樣,具體實現時,對詞頻取了0.75次冪
len(w)=[ counter (w)]0.75uD[counter(u)]0.75\operatorname{len}(w)=\frac{[\text { counter }(w)]^{0.75}}{\sum_{u \in D}[\operatorname{counter}(u)]^{0.75}}

負採樣的公式爲(以skip-gram爲例):在這裏插入圖片描述

在這裏插入圖片描述

對於CBOW,最後的公式爲:

在這裏插入圖片描述

對於一對中心詞和背景詞,我們從詞典中隨機採樣 K 個噪聲詞(實驗中設 K=5)。根據 Word2Vec 論文的建議,噪聲詞采樣概率 P(w) 設爲 W 詞頻與總詞頻之比的 0.75 次方。

3.5 代碼

在建立詞語索引時:

counter = collections.Counter([tk for st in raw_dataset for tk in st]) # tk是token的縮寫
counter = dict(filter(lambda x: x[1] >= 5, counter.items())) # 只保留在數據集中至少出現5次的詞
idx_to_token = [tk for tk, _ in counter.items()]
token_to_idx = {tk: idx for idx, tk in enumerate(idx_to_token)}
dataset = [[token_to_idx[tk] for tk in st if tk in token_to_idx]
           for st in raw_dataset] # raw_dataset中的單詞在這一步被轉換爲對應的idx
num_tokens = sum([len(st) for st in dataset])
'# tokens: %d' % num_tokens

3.5.1 collections.Counter() 用法

參考鏈接:https://blog.csdn.net/qwe1257/article/details/83272340

  • 可以直接 Counter() 爲空,之後在空的Counter上進行操作
  • 也可以在創建的時候傳進一個迭代器(list,string,dict等)
c = Counter('gallahad')                 # 傳進字符串
c = Counter({'red': 4, 'blue': 2})      # 傳進字典
c = Counter(cats=4, dogs=8)             # 傳進元組

3.5.2 filter() 用法

filter() 函數用於過濾序列,過濾掉不符合條件的元素,返回一個迭代器對象,如果要轉換爲列表,可以使用 list() 來轉換。

該接收兩個參數,第一個爲函數,第二個爲序列,序列的每個元素作爲參數傳遞給函數進行判,然後返回 True 或 False,最後將返回 True 的元素放到新列表中。

語法

以下是 filter() 方法的語法:

filter(function, iterable)

參數

  • function – 判斷函數。
  • iterable – 可迭代對象。

返回值

返回一個迭代器對象

4 其他

4.1 分佈式表示(distributional semantics)

distributional semantics:一個單詞的意思由它上下文的單詞來決定

4.2 TF-IDF

TF-IDF(term frequency–inverse document frequency,詞頻-逆向文件頻率)是一種用於信息檢索(information retrieval)與文本挖掘(text mining)的常用加權技術。

   TF-IDF是一種統計方法,用以評估一個字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨着它在文件中出現的次數成正比增加,但同時會隨着它在語料庫中出現的頻率成反比下降。

   TF-IDF的主要思想是:如果某個單詞在一篇文章中出現的頻率TF高,並且在其他文章中很少出現,則認爲此詞或者短語具有很好的類別區分能力,適合用來分類。

其公式爲 TF * IDF ,其中,

  • TF是詞頻(Term Frequency)

    TF=TF= \frac{某文檔中該詞出現的頻數}{該文檔的總詞數}

  • IDF是逆向文件頻率(Inverse Document Frequency):某一特定詞語的IDF,可以由總文件數目除以包含該詞語的文件的數目再將得到的商取對數得到

    IDF=log(+1)IDF=\log (\frac{語料庫的總文檔數}{包含該詞的文檔數+1})

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章