Last Updated on 2021-07-24 by Clay
之前我曾經紀錄過,如何使用 Python 的 Gensim 套件訓練一個 Word2Vec 模型,讓我們將『詞彙』轉成『向量』,而這些轉成的『向量』也並不是毫無道理,直觀理解上,是每一維度中包含著文本中的一個隱含主題 —— 至少人們是這樣希望模型學習到東西的。
今天,我想紀錄的並非以『詞』為單位,而是想要將一個『文件』轉成『向量』,也即是所謂的『文件向量』(Document vector)。在 Python 中,我們同樣可以透過呼叫 Gensim 內集成的 Doc2Vec 函式,來簡單地完成模型訓練。
參數介紹
同 Word2Vec,Doc2Vec 同樣有著一些常見、可選擇的參數,以下就簡單地紀錄:
- vector_size: 特徵的向量維度
- window: 句子中當前詞和預測詞之間的最大距離
- min_count: 忽略頻率低於此值的單詞
- workers: 使用多少線程訓練模型
- epochs: 模型訓練迭代次數
- dm: 為 1 的情況,使用 PV-DM 演算法;其餘則為 PV-DBOW
如何訓練 Doc2Vec 模型
如果環境中沒有安裝過 Gensim,可以使用以下指令先行安裝:
pip3 install gensim
接下來便來看段簡單的 Sample Code,由於只是測試,所以只放了兩個簡單的小句子當作文本。
# coding: utf-8 import sys import json from gensim.models import doc2vec from collections import namedtuple # Load data raw_doc = [ 'Today is a nice day', 'I want to go to play' ] # Preprocess docs = [] analyzedDocument = namedtuple('AnalyzedDocument', 'words tags') for index, text in enumerate(raw_doc): words = text.split() docs.append(analyzedDocument(words, [index])) # Train model = doc2vec.Doc2Vec(docs, size=300, window=300, min_count=1, workers=4, dm=1) # Save model.save('doc2vec.model') # Load model = doc2vec.Doc2Vec.load('doc2vec.model') print(model.docvecs[1].shape)
Output:
(300,)
由於只是簡單的範例,故我連斷詞都僅僅只是使用空格分割,實際上在訓練前可以依自己的需求進行各種調整與前處理。
References
- https://radimrehurek.com/gensim/models/doc2vec.html
- https://stackoverflow.com/questions/31321209/doc2vec-how-to-get-document-vectors