Skip to content

[NLP][Python] 表示文件向量: Doc2Vec

之前我曾經紀錄過,如何使用 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


Read More

Tags:

Leave a Reply