NLP--gensim中doc2vec句向量实例

参考文章:https://blog.csdn.net/juanjuan1314/article/details/75124046/

Doc2vec又叫Paragraph Vector是Tomas Mikolov基于word2vec模型提出的,其具有一些优点,比如不用固定句子长度,接受不同长度的句子做训练样本,Doc2vec是一个无监督学习算法,可以用于生成句向量,段落向量和文档向量。生成的向量可以用于文本分类和语义分析.

下面是一个生成句向量,并查看效果的程序(适用小数据量):

#coding:utf-8
import jieba
import sys
import gensim
import sklearn
import numpy as np
from gensim.models.doc2vec import Doc2Vec, LabeledSentence
TaggededDocument = gensim.models.doc2vec.TaggedDocument

#进行中文分词
def  cut_files():
    filePath = 'voicetext.txt'
    fr = open(filePath, 'rb');
    fvideo = file('voiceCut.txt', "w+");
    fileTrainSeg = []
    for line in fr.readlines():
        curLine =' '.join(list(jieba.cut(line)))
        fvideo.writelines(curLine.encode('utf-8'))

#读取分词后的数据并打标记,放到x_train供后续索引,但是这样的话占用很大内存(这种小数据量使用)
def get_datasest():
    with open("voiceCut.txt", 'r') as cf:
        docs = cf.readlines()
        print len(docs)

    x_train = []
    for i, text in enumerate(docs):
        word_list = text.split(' ')
        l = len(word_list)
        word_list[l - 1] = word_list[l - 1].strip()
        document = TaggededDocument(word_list, tags=[i])
        x_train.append(document)

    return x_train

#模型训练
def train(x_train, size=200, epoch_num=1):
    model_dm = Doc2Vec(x_train, min_count=1, window=3, size=size, 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_dm_doc2vec')

    return model_dm

#实例
def test():
    model_dm = Doc2Vec.load("model/model_dm_doc2vec")
    test_text = ['我', '想', '看', '扶摇']
    inferred_vector_dm = model_dm.infer_vector(test_text)
    sims = model_dm.docvecs.most_similar([inferred_vector_dm], topn=10)
    return sims


if __name__ == '__main__':
    cut_files()
    x_train=get_datasest()
    model_dm = train(x_train)
    sims = test()
    for count, sim in sims:
        sentence = x_train[count]
        words = ''
        for word in sentence[0]:
            words = words + word + ' '
        print (words, sim, len(sentence[0]))

    #可以用句向量模型直接根据词向量查询相似度
    print (model_dm.wv.most_similar('扶摇'))

这里写图片描述

扶摇相似度为:
这里写图片描述

如果需要大数据量的数据进行训练,则训练过程中只需要TaggedLineDocument(inp)
具体例子如下:

import multiprocessing
from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import TaggedLineDocument
import numpy as np

inp='corpusSegDone.txt'
sents = TaggedLineDocument(inp) #直接对文本标号 (大数据适用,但是这样后续不能查看对应的内容,需要其他方法查询)
model = Doc2Vec(sents, size = 200, window = 8, alpha = 0.015)
outp1='docmodel'
model.save(outp1)

model=Doc2Vec.load(outp1)
sims = model.docvecs.most_similar(0)#0代表第一个句子或段落

#如果有两个句子
doc_words1=['验证','失败','验证码','未','收到']
doc_words2=['今天','奖励','有','哪些','呢']
#转换为向量:
invec1 = model.infer_vector(doc_words1, alpha=0.1, min_alpha=0.0001, steps=5)
invec2 = model.infer_vector(doc_words2, alpha=0.1, min_alpha=0.0001, steps=5)

sims = model.docvecs.most_similar([invec1])#计算训练模型中与句子1相似的内容
print (sims)

print(model.docvecs.similarity(0,1086620))#计算句子的相似度(0和1086620为句子的标号) 
#打印结果相似度位: 0.9385169567251749

sims打印结果:
这里写图片描述

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值