【NLP】doc2vec原理及實踐

2021-02-19 深度學習自然語言處理
點擊上方,選擇星標置頂,每天給你送乾貨!閱讀大概需要7分鐘
跟隨小博主,每天進步一丟丟https://blog.csdn.net/John_xyz/article/details/79208564word2vec提供了高質量的詞向量,並在一些任務中表現良好。 https://arxiv.org/pdf/1310.4546.pdfhttps://arxiv.org/pdf/1301.3781.pdf關於如何使用第三方庫gensim訓練word2vec可以參考這篇博客:http://blog.csdn.net/john_xyz/article/details/54706807儘管word2vec提供了高質量的詞彙向量,仍然沒有有效的方法將它們結合成一個高質量的文檔向量。對於一個句子、文檔或者說一個段落,怎麼把這些數據投影到向量空間中,並具有豐富的語義表達呢?過去人們常常使用以下幾種方法:就bag of words而言,有如下缺點:1.沒有考慮到單詞的順序,2.忽略了單詞的語義信息。因此這種方法對於短文本效果很差,對於長文本效果一般,通常在科研中用來做baseline。average word vectors就是簡單的對句子中的所有詞向量取平均。是一種簡單有效的方法,但缺點也是沒有考慮到單詞的順序tfidf-weighting word vectors是指對句子中的所有詞向量根據tfidf權重加權求和,是常用的一種計算sentence embedding的方法,在某些問題上表現很好,相比於簡單的對所有詞向量求平均,考慮到了tfidf權重,因此句子中更重要的詞佔得比重就更大。但缺點也是沒有考慮到單詞的順序LDA模型當然就是計算出一片文檔或者句子的主題分布。也常常用於文本分類任務,後面會專門寫一篇文章介紹LDA模型和doc2vec的本質不同doc2vec是google的兩位大牛Quoc Le和Tomas Mikolov在2014年提出的,原始論文地址如下:https://cs.stanford.edu/~quocle/paragraph_vector.pdfDoc2Vec 或者叫做 paragraph2vec, sentence embeddings,是一種非監督式算法,可以獲得 sentences/paragraphs/documents 的向量表達,是 word2vec 的拓展。學出來的向量可以通過計算距離來找 sentences/paragraphs/documents 之間的相似性,可以用於文本聚類,對於有標籤的數據,還可以用監督學習的方法進行文本分類,例如經典的情感分析問題。在介紹doc2vec原理之前,先簡單回顧下word2vec的原理熟悉word2vec的同學都知道,下圖是學習詞向量表達最經典的一幅圖。在下圖中,任務就是給定上下文,預測上下文的其他單詞。

其中,每個單詞都被映射到向量空間中,將上下文的詞向量級聯或者求和作為特徵,預測句子中的下一個單詞。一般地:給定如下訓練單詞序列,目標函數是當然,預測的任務是一個多分類問題,分類器最後一層使用softmax,計算公式如下:
這裡的每一個可以理解為預測出每個word的概率。因為在該任務中,每個詞就可以看成一個類別。計算的公式如下: ‍‍‍‍這裡U和b都是參數,h是將‍‍‍‍級聯或者求平均。因為每個單詞都是一類,所以類別眾多,在計算softmax歸一化的時候,效率很低。因此使用hierarical softmax加快計算速度,其實就是huffman樹,這個不再贅述,有興趣的同學可以看word2vec的paper。doc2vec基本原理1. A distributed memory model訓練句向量的方法和詞向量的方法非常類似。訓練詞向量的核心思想就是說可以根據每個單詞的上下文預測,也就是說上下文的單詞對是有影響的。那麼同理,可以用同樣的方法訓練doc2vec。例如對於一個句子s: i want to drink water,如果要去預測句子中的單詞want,那麼不僅可以根據其他單詞生成feature, 也可以根據其他單詞和句子ss來生成feature進行預測。因此doc2vec的框架如下所示:每個段落/句子都被映射到向量空間中,可以用矩陣DD的一列來表示。每個單詞同樣被映射到向量空間,可以用矩陣WW的一列來表示。然後將段落向量和詞向量級聯或者求平均得到特徵,預測句子中的下一個單詞。這個段落向量/句向量也可以認為是一個單詞,它的作用相當於是上下文的記憶單元或者是這個段落的主題,所以我們一般叫這種訓練方法為Distributed Memory Model of Paragraph Vectors(PV-DM)在訓練的時候我們固定上下文的長度,用滑動窗口的方法產生訓練集。段落向量/句向量 在該上下文中共享。

訓練模型,在已知的訓練數據中得到詞向量W, softmax的參數U和b,以及段落向量/句向量D

推斷過程(inference stage),對於新的段落,得到其向量表達。具體地,在矩陣D中添加更多的列,在固定WW,UU,bb的情況下,利用上述方法進行訓練,使用梯度下降的方法得到新的D,從而得到新段落的向量表達。

2. Paragraph Vector without word ordering: Distributed bag of words還有一種訓練方法是忽略輸入的上下文,讓模型去預測段落中的隨機一個單詞。就是在每次迭代的時候,從文本中採樣得到一個窗口,再從這個窗口中隨機採樣一個單詞作為預測任務,讓模型去預測,輸入就是段落向量。如下所示:我們稱這種模型為 Distributed Bag of Words version of Paragraph Vector(PV-DBOW)在上述兩種方法中,我們可以使用PV-DM或者PV-DBOW得到段落向量/句向量。對於大多數任務,PV-DM的方法表現很好,但我們也強烈推薦兩種方法相結合。3. 基於gensim的doc2vec實踐我們使用第三方庫gensim進行doc2vec模型的訓練
# -*- coding: utf-8 -*-import sysimport loggingimport osimport gensim# 引入doc2vecfrom gensim.models import Doc2VeccurPath = os.path.abspath(os.path.dirname(__file__))rootPath = os.path.split(curPath)[0]sys.path.append(rootPath)from utilties import ko_title2words
# 引入日誌配置logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
# 加載數據documents = []# 使用count當做每個句子的「標籤」,標籤和每個句子是一一對應的count = 0with open('../data/titles/ko.video.corpus','r') as f:for line in f: title = unicode(line, 'utf-8')# 切詞,返回的結果是列表類型 words = ko_title2words(title)# 這裡documents裡的每個元素是二元組,具體可以查看函數文檔 documents.append(gensim.models.doc2vec.TaggedDocument(words, [str(count)]))count += 1if count % 10000 == 0: logging.info('{} has loaded...'.format(count))
# 模型訓練model = Doc2Vec(documents, dm=1, size=100, window=8, min_count=5, workers=4)# 保存模型model.save('models/ko_d2v.model')

def test_doc2vec():# 加載模型    model = doc2vec.Doc2Vec.load('models/ko_d2v.model')# 與標籤『0』最相似的    print(model.docvecs.most_similar('0'))# 進行相關性比較    print(model.docvecs.similarity('0','1'))# 輸出標籤為『10』句子的向量    print(model.docvecs['10'])# 也可以推斷一個句向量(未出現在語料中)    words = u"여기 나오는 팀 다 가슴"    print(model.infer_vector(words.split()))# 也可以輸出詞向量    print(model[u'가슴'])

以上都是一些比較常見的用法,更多的用法請參https://radimrehurek.com/gensim/models/doc2vec.html方便交流學習,備註:暱稱-學校(公司)-方向,進入DL&NLP交流群。
方向有很多:機器學習、深度學習,python,情感分析、意見挖掘、句法分析、機器翻譯、人機對話、知識圖譜、語音識別等。

相關焦點

  • Doc2vec原理解析及代碼實踐
    2. Doc2vec原理Doc2vec方法是一種無監督算法,能從變長的文本(例如:句子、段落或文檔)中學習得到固定長度的特徵表示。Doc2vec中PV-DM模型具體的訓練過程和Word2Vec中的CBOW模型訓練方式相同,這裡就不在重複講解了,不明白Word2Vec原理可以看我的這篇文章:深入理解Word2Vec原理解析。
  • 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。
  • 文本深度表示模型—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 得到文檔/段落/句子的向量表達
    兩種實現方法用 Gensim 實現 Doc2Vec 訓練Doc2Vec 或者叫做 paragraph2vec, sentence embeddings,是一種非監督式算法,可以獲得 sentences/paragraphs/documents 的向量表達,是 word2vec 的拓展。
  • 利用Doc2Vec 對 Quora 問題標籤聚類
    本文為 AI 研習社編譯的技術博客,原標題:Clustering Quora Question Tags with Doc2Vec.翻譯 | nick李、csnoooong 校對 | 凡江 整理 | 志豪原文連結:https://medium.com/@samriddhisinha/clustering-quora-question-tags-with-doc2vec-d4fb3c5177f7
  • 【NLP】競賽必備的NLP庫
    doc = nlp(text)print("Noun phrases:", [chunk.text for chunk in doc.noun_chunks])print("Verbs:", [token.lemma_ for token in doc if token.pos_ == "VERB"])for entity in doc.ents: print(entity.text
  • 【乾貨】NLP中「詞袋」模型和詞嵌入模型的比較(附代碼)
    count_vec = CountVectorizer()count_occurs =count_vec.fit_transform([doc])count_occur_df = pd.DataFrame( (count, word) for word, count in    zip(count_occurs.toarray
  • NLP中的詞向量對比:word2vec/glove/fastText/elmo/GPT/bert
    2、怎麼從語言模型理解詞向量?怎麼理解分布式假設?3、傳統的詞向量有什麼問題?怎麼解決?各種詞向量的特點是什麼?4、word2vec和NNLM對比有什麼區別?(word2vec vs NNLM)5、word2vec和fastText對比有什麼區別?(word2vec vs fastText)6、glove和word2vec、 LSA對比有什麼區別?
  • 打包帶走,競賽必備的NLP庫
    doc = nlp(text)print("Noun phrases:", [chunk.text for chunk in doc.noun_chunks])print("Verbs:", [token.lemma_ for token in doc if token.pos_ == "VERB"])for entity in doc.ents: print(entity.text
  • 數據競賽必備的NLP庫總結!
    ")doc = nlp(text)print("Noun phrases:", [chunk.text for chunk in doc.noun_chunks])print("Verbs:", [token.lemma_ for token in doc if token.pos_ == "VERB"])for entity in doc.ents: print(entity.text
  • 乾貨 | NLP、知識圖譜教程、書籍、網站、工具...(附資源連結)
    /assets/slides/CMU Machine Translation and Sequence to Sequence Modelshttp://phontron.com/class/mtandseq2seq2017/Oxford Deep NLP 2017 coursehttps://github.com/oxford-cs-deepnlp
  • 【Word2Vec】深入淺出Word2Vec原理解析
    Word2Vec在工業界的應用Word2Vec主要原理是根據上下文來預測單詞,一個詞的意義往往可以從其前後的句子中抽取出來。而用戶的行為也是一種相似的時間序列,可以通過上下文進行推斷。7.2 圖嵌入基於Word2Vec這一類的Graph Embedding方法有很多,具體可以參考論文:DeepWalk(是引入Word2Vec思想比較經典的圖嵌入算法),node2vec,struc2vec 等等。
  • [NLP] 秒懂詞向量Word2vec的本質
    引子2. Word2vec參考資料總結3. 正文4. 實戰1.Word2vec參考資料總結(以下都是我踩過的坑,建議先跳過本節,閱讀正文部分,讀完全文回頭再來看)先大概說下我深挖 word2vec 的過程:先是按照慣例,看了 Mikolov 關於 Word2vec 的兩篇原始論文,然而發現看完依然是一頭霧水,似懂非懂,主要原因是這兩篇文章省略了太多理論背景和推導細節;然後翻出 Bengio 03年那篇JMLR
  • 深入淺出Word2Vec原理解析
    Word2Vec在工業界的應用Word2Vec主要原理是根據上下文來預測單詞,一個詞的意義往往可以從其前後的句子中抽取出來。而用戶的行為也是一種相似的時間序列,可以通過上下文進行推斷。7.2 圖嵌入基於Word2Vec這一類的Graph Embedding方法有很多,具體可以參考論文:DeepWalk(是引入Word2Vec思想比較經典的圖嵌入算法),node2vec,struc2vec 等等。
  • 【NLP】從word2vec, ELMo到BERT
    而在這種風向下,不管word2vec也好,glove也好,fasttext也好,都只能充當一個錦上添花的作用。說好的遷移學習、預訓練呢?在NLP似乎始終沒成主角。每個人對於BERT的理解都不一樣,本文就試著從word2vec和ELMo的角度說說BERT。下面先簡單回顧一下word2vec和ELMo中的精華,已經理解很透徹的小夥伴可以快速下拉到BERT章節啦。
  • 我的開源項目匯總(機器&深度學習、NLP、網絡IO、AIML、mysql協議、chatbot)
    So far, it supports hot word extracting, text classification, part of speech tagging, named entity recognition, chinese word segment, extracting address, synonym, text clustering, word2vec model, edit