Doc2vec原理解析及代碼實踐

2021-02-19 小小挖掘機

本文概覽:

1. 句子向量簡介

Word2Vec提供了高質量的詞向量,並在一些任務中表現良好。雖然Word2Vec提供了高質量的詞彙向量,但是仍然沒有有效的方法將它們結合成一個高質量的文檔向量。對於一個句子、文檔或者說一個段落,怎麼把這些數據投影到向量空間中,並具有豐富的語義表達呢?過去人們常常使用以下幾種方法:

TF-IDF Weighted Word Vectors

就Bag of Words而言,有如下缺點:

因此這種方法對於短文本效果很差,對於長文本效果一般,通常在科研中用來做Baseline。

Average Word Vectors就是簡單的對句子中的所有詞向量取平均。是一種簡單有效的方法,但缺點也是沒有考慮到單詞的順序。

TF-IDF Weighted word vectors是指對句子中的所有詞向量根據TF-IDF權重加權求和,是常用的一種計算sentence embedding的方法,在某些問題上表現很好,相比於簡單的對所有詞向量求平均,考慮到了TF-IDF權重,因此句子中更重要的詞佔得比重就更大。但缺點也是沒有考慮到單詞的順序。

LDA模型就是計算出一篇文檔或者句子的主題分布,也常常用於文本分類任務。

2. Doc2vec原理

Doc2vec方法是一種無監督算法,能從變長的文本(例如:句子、段落或文檔)中學習得到固定長度的特徵表示。Doc2vec也可以叫做 Paragraph Vector、Sentence Embeddings,它可以獲得句子、段落和文檔的向量表達,是Word2Vec的拓展,其具有一些優點,比如不用固定句子長度,接受不同長度的句子做訓練樣本。Doc2vec算法用於預測一個向量來表示不同的文檔,該模型的結構潛在的克服了詞袋模型的缺點。

Doc2vec模型是受到了Word2Vec模型的啟發。Word2Vec預測詞向量時,預測出來的詞是含有詞義的,Doc2vec中也是構建了相同的結構,所以Doc2vec克服了詞袋模型中沒有語義的缺點。假設現在存在訓練樣本,每個句子是訓練樣本,和Word2Vec一樣,Doc2vec也有兩種訓練方式,一種是分布記憶的段落向量(Distributed Memory Model of Paragraph Vectors, PV-DM)類似於Word2Vec中的CBOW模型,另一種是分布詞袋版本的段落向量(Distributed Bag of Words version of Paragraph Vector,PV-DBOW)類似於Word2Vec中的Skip-gram模型。

2.1 Distributed Memory Model of Paragraph Vectors

訓練句向量的方法和詞向量的方法非常類似。訓練詞向量的核心思想就是可以根據每個單詞

在Doc2vec中,每一句話用唯一的向量來表示,用矩陣

Doc2vec相對於Word2vec不同之處在於,在輸入層增添了一個新的句子向量Paragraph vector,Paragraph vector可以被看作是另一個詞向量,它扮演了一個記憶角色。Average Word Vectors中,使用Word2Vec訓練詞向量,因為每次訓練只會截取句子中一小部分詞訓練,而忽略了除了本次訓練詞以外該句子中的其他詞,這樣僅僅訓練出來每個詞的向量表達,句子只是每個詞的向量累加在一起取平均的一種表達。正如上面所說的Average Word Vectors的缺點,忽略了文本的詞序問題。而Doc2vec中的Paragraph vector則彌補了這方面的不足,它每次訓練也是滑動截取句子中一小部分詞來訓練,Paragraph Vector在同一個句子的若干次訓練中是共享的,所以同一句話會有多次訓練,每次訓練中輸入都包含Paragraph vector。它可以被看作是句子的主旨,有了它,該句子的主旨每次都會被作為輸入的一部分來訓練。這樣每次訓練過程中,不光是訓練了詞,得到了詞向量。同時隨著一句話每次滑動取若干詞訓練的過程中,作為每次訓練的輸入層一部分的共享Paragraph vector,該向量表達的主旨會越來越準確。Doc2vec中PV-DM模型具體的訓練過程和Word2Vec中的CBOW模型訓練方式相同,這裡就不在重複講解了,不明白Word2Vec原理可以看我的這篇文章:深入理解Word2Vec原理解析。

這個段落向量或句向量也可以認為是一個單詞,它的作用相當於是上下文的記憶單元或者是這個段落的主題,所以我們一般叫這種訓練方法為Distributed Memory Model of Paragraph Vectors(PV-DM)。在訓練的時候我們固定上下文的長度,用滑動窗口的方法產生訓練集。段落向量或句向量在該上下文中共享。

訓練完了以後,就會得到訓練樣本中所有的詞向量和每句話對應的句子向量,那麼Doc2vec是怎麼預測新的句子Paragraph vector呢?其實在預測新的句子的時候,還是會將該Paragraph vector隨機初始化,放入模型中再重新根據隨機梯度下降不斷迭代求得最終穩定下來的句子向量。不過在預測過程中,模型裡的詞向量、投影層到輸出層的softmax weights參數是不會變的,這樣在不斷迭代中只會更新Paragraph vector,其它參數均已固定,只需很少的時間就能計算出待預測的Paragraph vector。

總結PV-DM的過程, 主要有兩步:

訓練模型,在已知的訓練數據中得到詞向量

另外一種訓練方法是忽略輸入的上下文,讓模型去預測段落中的隨機一個單詞。就是在每次迭代的時候,從文本中採樣得到一個窗口,再從這個窗口中隨機採樣一個單詞作為預測任務,讓模型去預測,輸入就是段落向量。我們稱這種模型為 Distributed Bag of Words version of Paragraph Vector(PV-DBOW),如下圖所示:

在上述兩種方法中,我們可以使用PV-DM或者PV-DBOW得到段落向量或者句向量。對於大多數任務,PV-DM的方法表現很好,但論文中的作者也強烈推薦兩種方法相結合。

3. 代碼實踐

現在,我們對NLP中Doc2vec算法進行簡單地實現。這個案例是使用gensim 3.4和python3實現Doc2vec模型的訓練和預測,gensim庫使Doc2vec的實現更加容易。本文的所有代碼已經放在我的GitHub中,地址:https://github.com/Microstrong0305/WeChat-zhihu-csdnblog-code/blob/master/NLP/Doc2vec/Doc2vec.py

# ---Let’s start implementing--# Import all the dependenciesfrom gensim.models.doc2vec import Doc2Vec, TaggedDocumentfrom nltk.tokenize import word_tokenizeimport nltk
nltk.download()
# ---Let’s prepare data for training our doc2vec model--data = ["I love machine learning. Its awesome.", "I love coding in python", "I love building chatbots", "they chat amagingly well"]
tagged_data = [TaggedDocument(words=word_tokenize(_d.lower()), tags=[str(i)]) for i, _d in enumerate(data)]
# ---Lets start training our model--max_epochs = 100vec_size = 20alpha = 0.025
model = Doc2Vec(size=vec_size, alpha=alpha, min_alpha=0.00025, min_count=1, dm=1)
'''Note: dm defines the training algorithm. If dm=1 means『distributed memory』(PV-DM) and dm =0 means『distributed bag of words』(PV-DBOW). Distributed Memory model preserves the word order in a document whereas Distributed Bag of words just uses the bag of words approach, which doesn’t preserve any word order.'''
model.build_vocab(tagged_data)
for epoch in range(max_epochs): print('iteration {0}'.format(epoch)) model.train(tagged_data, total_examples=model.corpus_count, epochs=model.iter) # decrease the learning rate model.alpha -= 0.0002 # fix the learning rate, no decay model.min_alpha = model.alpha
model.save("d2v.model")print("Model Saved")
# ---Lets play with it--from gensim.models.doc2vec import Doc2Vec
model = Doc2Vec.load("d2v.model")# to find the vector of a document which is not in training datatest_data = word_tokenize("I love chatbots".lower())v1 = model.infer_vector(test_data)print("V1_infer", v1)
# to find most similar doc using tagssimilar_doc = model.docvecs.most_similar('1')print(similar_doc)
# to find vector of doc in training data using tags or in other words, printing the vector of document at index 1 in training dataprint(model.docvecs['1'])

實踐總結:

使用gensim的Doc2vec進行句子、段落或文章的向量表示時,不需要進行分詞;train訓練模型,save 和 load 加載訓練好的模型;docvecs.most_similar( )計算相似度;4. Reference

【1】Le Q, Mikolov T. Distributed representations of sentences and documents[C]//International conference on machine learning. 2014: 1188-1196.
【2】基於Doc2vec訓練句子向量 - 灰灰的文章 - 知乎https://zhuanlan.zhihu.com/p/36886191
【3】doc2vec原理及實踐,地址:https://blog.csdn.net/John_xyz/article/details/79208564
【4】https://medium.com/@mishra.thedeepak/doc2vec-simple-implementation-example-df2afbbfbad5

相關焦點

  • 【NLP】doc2vec原理及實踐
    也常常用於文本分類任務,後面會專門寫一篇文章介紹LDA模型和doc2vec的本質不同doc2vec是google的兩位大牛Quoc Le和Tomas Mikolov在2014年提出的,原始論文地址如下:https://cs.stanford.edu/~quocle/paragraph_vector.pdfDoc2Vec 或者叫做 paragraph2vec, sentence
  • Doc2vec在推薦系統中的應用(含算法原理、代碼實現)
    Doc2vec是Mikolov2014年提出的論文,也被成為Paragraph Vector,下面的內容分為三方面進行介紹,分別為:1、Doc2vec的算法原理如何學習得到Word的Vector表示一個非常流行的學習Word Vector的方法如下圖所示:一個非常流行的學習Word
  • 【算法】word2vec與doc2vec模型
    2 word2vec與doc2vec有什麼差異?3 如何做word2vec和doc2vec?深度學習掀開了機器學習的新篇章,目前深度學習應用於圖像和語音已經產生了突破性的研究進展。  d)  Word2Vector 模型  最近幾年剛剛火起來的算法,通過神經網絡機器學習算法來訓練N-gram 語言模型,並在訓練過程中求出word所對應的vector的方法。本文將詳細闡述此方法的原理。4.word2vec算法思想  什麼是word2vec?
  • Doc2Vec的一個輕量級介紹
    我將回顧doc2vec的方法,在2014年由Mikilov和Le提出,我們要通過這篇文章提到很多次。值得一提的是,Mikilov也是word2vec的作者之一。Doc2vec是一個非常好的技術。它很容易使用,結果很好,而且從它的名字就可以看出來,它主要基於word2vec。
  • 用 Doc2Vec 得到文檔/段落/句子的向量表達
    兩種實現方法用 Gensim 實現 Doc2Vec 訓練Doc2Vec 或者叫做 paragraph2vec, sentence embeddings,是一種非監督式算法,可以獲得 sentences/paragraphs/documents 的向量表達,是 word2vec 的拓展。
  • 文本深度表示模型—word2vec&doc2vec詞向量模型
    Word2Vector 模型最近幾年剛剛火起來的算法,通過神經網絡機器學習算法來訓練N-gram 語言模型,並在訓練過程中求出word所對應的vector的方法。本文將詳細闡述此方法的原理。4.word2vec算法思想什麼是word2vec?
  • 文本深度表示模型——word2vec&doc2vec詞向量模型
    d)  Word2Vector 模型  最近幾年剛剛火起來的算法,通過神經網絡機器學習算法來訓練N-gram 語言模型,並在訓練過程中求出word所對應的vector的方法。本文將詳細闡述此方法的原理。4.word2vec算法思想  什麼是word2vec?
  • 【DS】Doc2Vec和Logistic回歸的多類文本分類
    2 您如何做文本分類?Doc2vec是一個NLP工具,用於將文檔表示為向量,是word2vec方法的推廣。為了理解doc2vec,最好理解word2vec方法。Doc2vec是一個NLP工具,用於將文檔表示為向量,是word2vec方法的推廣。為了理解doc2vec,最好理解word2vec方法。但是,完整的數學細節超出了本文的範圍。
  • 利用Doc2Vec 對 Quora 問題標籤聚類
    翻譯 | nick李、csnoooong 校對 | 凡江 整理 | 志豪原文連結:https://medium.com/@samriddhisinha/clustering-quora-question-tags-with-doc2vec-d4fb3c5177f7
  • 【Word2Vec】深入淺出Word2Vec原理解析
    那就跳過去,Word2Vec的代碼中也是這麼處理的。7.2 圖嵌入基於Word2Vec這一類的Graph Embedding方法有很多,具體可以參考論文:DeepWalk(是引入Word2Vec思想比較經典的圖嵌入算法),node2vec,struc2vec 等等。
  • 深入淺出Word2Vec原理解析
    那就跳過去,Word2Vec的代碼中也是這麼處理的。7.2 圖嵌入基於Word2Vec這一類的Graph Embedding方法有很多,具體可以參考論文:DeepWalk(是引入Word2Vec思想比較經典的圖嵌入算法),node2vec,struc2vec 等等。
  • word2vec模型深度解析
    【前言】word2vec是一個被廣泛應用的word embedding方法,由於最近研究需要,將算法模型研究了一下由於word2vec內容很多,這裡儘量講解核心內容,有不足之處還請指出!word2vec hierarchical softmax結構和傳統的神經網絡輸出不同的是,word2vec的hierarchical softmax結構是把輸出層改成了一顆哈夫曼樹,其中圖中白色的葉子節點表示詞彙表中所有的|V|個詞,黑色節點表示非葉子節點
  • 白話Word2Vec
    關於Hierarchical Softmax和Negative Sampling的原理細節(包含太多數學公式,白話不出來了,誰要能幫我把這部分講清楚,我請吃飯_)可參看以下文章:word2vec 代碼實現(1) – Skip gramhttps://link.jianshu.com/?
  • 想學習Word2vec?用Numpy從Scratch開始帶你完整過一遍
    然而,我決定僅僅藉助Python和NumPy從頭開始實現一個Word2vec模型,之所以決定重新發明一遍輪子,是因為我想深入學習一下Word2vec,順便鞏固一下Numpy。詞語嵌入並沒有什麼花哨的東西,而是用數字的方式來表示詞彙的方法。更確切地說,是將詞彙映射到向量的方法。最直接的方法可以是使用一熱編碼,將每個字映射到一熱向量上。
  • 萬物皆Embedding,從經典的word2vec到深度學習基本操作item2vec
    的技術細節,為了保證一些初學者的知識是自洽的,我還是想在此之前詳細介紹一下深度學習的基本操作Embedding以及從word2vec到item2vec的模型原理。使embedding空前流行的word2vec對word的vector表達的研究早已有之,但讓embedding方法空前流行,我們還是要歸功於google的word2vec。我們簡單講一下word2vec的原理,這對我們之後理解AirBnB對loss function的改進至關重要。
  • 用word2vec解讀延禧攻略人物關係
    通過從網上收集相關的小說、劇本、人物介紹等,經過word2vec深度學習模型的訓練,構建人物關係圖譜,並通過可視化的方式進行展示。主要使用gensim進行word2vec的訓練。gensim是一個Python NLP的包,封裝了google的C語言版的word2vec。安裝gensim是很容易的,使用"pip install gensim"即可。
  • 【乾貨】NLP中「詞袋」模型和詞嵌入模型的比較(附代碼)
    通過使用scikit-learn,只需要幾行代碼就可以構建模型。之後可以用深度學習的方法來改進它。2. 如果你的數據集很小並且上下文是特定領域的,那麼詞袋模型會比詞嵌入更有效。上下文是非常特定的領域,這意味著你無法從預先訓練好的詞嵌入模型(比如GloVe, fastText等)中找到相應的向量。
  • 使用Python代碼的4種句嵌入技術
    Word2Vec、GloVe、ELMo、FastText等詞嵌入的基本原理就是使用與該詞相鄰的詞的信息。隨著詞嵌入技術的發展,技術人員已經找到了更好的方法來表達更多的信息,由此擴展到了句子和段落。如果我們直接處理句子呢?要知道,在大文本的情況下,很大程度上我們的分析會被從詞嵌入中提取的信息所限制。
  • 深入理解word2vec
    word2vec是一種基於神經網絡的語言模型,也是一種詞彙表徵方法。word2vec包括兩種結構:skip-gram(跳字模型)和CBOW(連續詞袋模型),但本質上都是一種詞彙降維的操作。  我們將NLP的語言模型看作是一個監督學習問題:即給定上下文詞,輸出中間詞,或者給定中間詞,輸出上下文詞。基於輸入和輸出之間的映射便是語言模型。
  • 詞向量詳解:從word2vec、glove、ELMo到BERT
    學習各種詞向量訓練原理可以很好地掌握NLP各種方法。生成詞向量的方法有很多種,本文重點介紹word2vec,glove和bert。這裡總結一下比較經典的語言模型:word2vec、glove、ELMo、BERT。