Word Embedding 編碼矩陣
技術與方法
Bag of Words (BoW)
BoW 是一種將句子拆解成每個詞出現次數的方法,例如我將以下兩個句子拆解
I like apple.
{"I": 1, "like": 1, "apple": 1}I like mango.
{"I": 1, "like": 1, "mango": 1}
這方法乍看之下分析出了句子的組成,但是卻忽略掉了很重要的次序關係,會使得以下兩句的結果完全相同
I like apple, but I don't like mango.
I like mango, but I don't like apple.
就bag of words而言,有如下缺點:1.沒有考慮到單詞的順序,2.忽略了單詞的語義資訊。因此這種方法對於短文字效果很差,對於長文字效果一般,通常在科研中用來做baseline
Word Vector
使用一個向量來表示每一個詞(vector representation),如此一來,就能把一段由許多詞組成的文句,轉換成一個個詞向量來表示,並把這樣數值化的資料,送到模型裡做後續的應用。
一組好的詞向量,會使意思相似的詞在向量空間上比較靠近彼此,甚至詞義上的關聯可以用詞向量在空間中的關係來表示,如下圖所示
Word Embedding
Word Embedding的概念。如果將word看作文本的最小單元,可以將Word Embedding理解為一種映射,其過程是:將文本空間中的某個word,通過一定的方法,映射或者說嵌入(embedding)到另一個數值向量空間(之所以稱之為embedding,是因為這種表示方法往往伴隨著一種降維的意思
Word Embedding的輸入
Word Embedding的輸入是將原始文本中的一組不重疊的詞彙,將這些詞彙放置到一個dictionary裡,這個dictionary就可以看作是Word Embedding的一個輸入
假設有句子:apple on a apple tree => [“apple”, “on”, “a”, “tree”]
Word Embedding的輸出
Word Embedding的輸出就是每個word的向量表示。對於上文中的原始輸入,每個word都對應了一種數值表示。例如,apple對應的vector就是[1, 0, 0, 0],a對應的vector就是[0, 0, 1, 0],各種機器學習應用可以基於這種word的數值表示來構建各自的模型。
Frequency based embedding
基於頻率的Word Embedding又可細分為如下幾種:
- Count Vector
- TF-IDF Vector
Count Vector
假設有一個語料庫C,其中有D個文檔:{d1, d2, …, dD},C中一共有N個word。這N個word構成了原始輸入的dictionary,我們據此可以生成一個矩陣M,其規模是D X N
該矩陣便是一個counter vector matrix。每個文檔用詞向量的組合來表示,每個詞的權重用其出現的次數來表示。
當然,如果語料庫十分龐大,那麼dictionary的規模亦會十分龐大,因此上述矩陣必然是稀疏的,會給後續運算帶來很大的麻煩。通常的做法是選取出現次數最頻繁的那些詞來構建dictionary(例如,top 10,000個詞),這樣會有效縮減上述矩陣的規模
TF-IDF Vector
對於一個word,如果在特定文檔裡出現的頻率高,而在整個語料庫裡出現的頻率低,那麼這個word對於該文檔的重要性就比較高。
因此我們可以引入逆文檔頻率IDF(Inverse Document Frequency)的概念:IDF=log(N/n)。其中,N代表語料庫中文檔的總數,n代表某個word在幾個文檔中出現過;當一個word出現地越頻繁,那麼IDF就越小。
顯然,IDF用於懲罰那些常用詞彙,而TF用於獎勵那些在特定文檔中出現頻繁的詞彙。二者的乘積TF X IDF用來表示詞彙的權重
- tf (term frequency ):詞頻,計算該詞語在文章所出現的次數
- idf ( inverse document frequency ):逆文檔頻率,衡量該字詞的重要性
字詞的重要性隨著它在檔案中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。也就是說,當 tf 值很高,而 df 值很低,這時得到的權重值就能夠把常見的關鍵字濾掉。詳細數學原理可參考維基百科。
Predicted Based Embedding
基於預測的Word Embedding又可細分為如下幾種:
- Word2vec
- Doc2Vec
- GloVe
1. Word2vec:
由Google的Tomas Mikolov研究團隊所創造。
word2vec 提出了兩種訓練詞向量的方法,分別稱作 CBOW 和 Skipgram。
CBOW 模型輸入前後詞(contex word)詞向量,要預測出可能的目標詞(target word), 將每個單詞的上下文作為輸入,並嘗試預測與上下文對應的單詞。考慮我們的例子: Have a great day.
Skipgram 模型則是輸入目標詞詞向量,預測出可能的前後詞。
這裡說的預測是透過下圖所示的方法:輸入詞先透過查表(lookup)得到詞向量,接著通過一個矩陣(也可解釋為通過一層類神經網路),預測共現(co-occur)的詞的機率。
2. Doc2Vec :
是一種非監督式演算法,可以獲得 sentences/paragraphs/documents 的向量表達,是 word2vec 的拓展。學出來的向量可以通過計算距離來找 sentences/paragraphs/documents 之間的相似性,可以用於文字聚類,對於有標籤的資料,還可以用監督學習的方法進行文字分類,例如經典的情感分析問題。
Doc2vec相對於word2vec不同之處在於,在輸入層,增添了一個新的文檔向量Paragraph vector,Paragraph vector可以被看作是另一個詞向量
Doc2vec也有兩種訓練方式,一種是PV-DM(Distributed Memory Model of paragraph vectors)類似於word2vec中的CBOW模型,如圖一:
另一種是PV-DBOW(Distributed Bag of Words of paragraph vector類似於Word2vec中的skip-gram模型,如圖二:
3. GloVe:
GloVe的全稱叫Global Vectors for Word Representation,它是一個基於全局詞頻統計(count-based & overall statistics)的詞表徵(word representation)工具,它可以把一個單詞表達成一個由實數組成的向量,這些向量捕捉到了單詞之間一些語義特性,比如相似性(similarity)、類比性(analogy)等。我們通過對向量的運算,比如歐幾里得距離或者cosine相似度,可以計算出兩個單詞之間的語義相似性。
由史丹佛(Stanford)研究團隊所創造。
GloVe綜合了LSA、CBOW的優點,訓練更快、對於大規模語料算法的擴展性也很好、在小語料或者小向量上性能表現也很好。
Word Embedding的應用
現今流行的Word Embedding算法攜帶了語義信息且維度經過壓縮便於運算,因此有了很多用武之地,例如:
- 計算相似度,比如man和woman的相似度比man和apple的相似度高
- 在一組單詞中找出與眾不同的一個,例如在如下詞彙列表中:[dog, cat, chicken, boy],利用詞向量可以識別出boy和其他三個詞不是一類。
- 直接進行詞的運算,例如經典的:woman+king-man =queen
- 由於攜帶了語義信息,還可以計算一段文字出現的可能性,也就是說,這段文字是否通順。
Word Embedding實作
以下將針對
- word2Vec : 找出相似的word
- Doc2Vec : 找出相似的文檔
- TF-IDF Vector
- Glove
分別用Gemsim以及jieba斷詞套件進行實作,分別以英文及中文作為範例
gensim是一個python的自然語言處理庫,能夠將文檔根據TF-IDF, LDA, LSI 等模型轉化成向量模式,以便進行進一步的處理。此外,gensim還實現了word2vec功能,能夠將單詞轉化為詞向量
gensim配置
pip install — upgrade gensim
NLTK配置
pip install nltk
# 安裝 NLTK 相關套件會出現以下介面
nltk.download()
安裝 all-corpora
以及 popular
package
word2Vec & Doc2Vec
參考來源:
NLTK 初學指南(一):簡單易上手的自然語言工具箱-探索篇
NLTK-初學指南-二-由外而內-從語料庫到字詞拆解-上手篇
models.deprecated.doc2vec — Deep learning with paragraph2vec