1. 程式人生 > >gensim訓練word2vec和doc2vec

gensim訓練word2vec和doc2vec

word2vec和doc2vec是做NLP過程中經常使用的方法。

用向量表示詞彙這種做法由來已久,最早使用的是one-hot向量,即只有一個維度為1,其餘維度都為0,但這種做法有很多缺陷,過多的維度會導致資料處理的困難,而且這種表示方法無法體現詞所在的上下文關係。於是便有了word embedding,將詞彙對映到連續的,稠密的向量空間。doc2vec實現方法和word2vec類似,通過訓練,我們可以推測出一句話的固定維度的向量表達。

本文使用python gensim包,在Django框架基礎上簡單說明word2vec訓練和doc2vec訓練方法。

一.word2vec訓練

將目標語料庫進行分詞

def train_data_build():
    file = r'F:\train_data.txt'
    names = file_name('F:\\data')
    for name in names:
        f = open(name, errors='ignore')
        st = f.read()
        with open(file, 'a+') as f:
            seg_list = jieba.cut(st, cut_all=False)
            f.write(" ".join(seg_list))
            f.write('\n')
        f.close()

對分詞結果進行訓練

def train_data():
    from gensim.models import word2vec
    sentences = word2vec.Text8Corpus('F:\\train_data.txt')
    model = word2vec.Word2Vec(sentences, size=50)
    model.save('word2vec_model')

分詞是一個開銷比較大的工作,最開始訓練的目標是搜狗公佈的新聞語料庫,但用我的手提電腦跑了兩個小時才切完詞,切出了一個十幾個G的文字檔案,再進行訓練電腦立馬卡死。

二.doc2vec訓練

假設已經蒐集好了需要訓練的句子,儲存在model Sentence中

TaggededDocument = gensim.models.doc2vec.TaggedDocument
def train_sentence():
    sens = Sentence.objects.all()
    dic = {}
    for sen in sens:
        dic[sen.name]=sen.sen_id
    keys=dic.keys()
    x_train = []
    for key in keys:
        document = TaggededDocument(key, tags=dic[key])
        x_train.append(document)
    model_dm = Doc2Vec(x_train, min_count=1, window=3, vector_size=100, sample=1e-3, negative=5, workers=4)
    model_dm.train(x_train, total_examples=model_dm.corpus_count, epochs=70)
    model_dm.save('model/model_doc2vec')