Word2vec(自己学习使用)

在NLP任务中,word2vec是常用的word embedding方法,分为CBOW和skip - gram模型。Doc2vec可得到句子或文档向量,有DM和DBOW模型。还介绍了使用gensim训练word2vec和Docvec的步骤,包括语料预处理、转化迭代器及训练参数设置等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在NLP任务中,word2vec是一种常用的word embedding方法,word2vec通过语料库中的句子序列来描述词与词的共现关系,进而学习到词语的向量表示。

embedding就是将单词或者句子,文档向量化

深度学习笔记——Word2vec和Doc2vec原理理解并结合代码分析_mpk_no1的博客-优快云博客_doc2vec和word2vec  参考本篇论文,学习word2vec和doc2vec的原理

word2vec

分为两个模型:CBOW和skip-gram模型

CBOW:由上下文信息预测当前单词

skip-gram:由当前单词预测上下文信息

Doc2vec
虽然Word2vec表示的词性量不仅考虑了词之间的语义信息,还压缩了维度。但是,有时候当我们需要得到Sentence/Document的向量表示,虽然可以直接将Sentence/Document中所有词的向量取均值作为Sentence/Document的向量表示,但是这样会忽略了单词之间的排列顺序对句子或文本信息的影响(转自原文:https://blog.youkuaiyun.com/mpk_no1/article/details/72458003 )

doc2vec也分为两个模型:DM和DBOW

DM:给定上下文和文档向量的情况下预测单词概率

DBOW:给定文档向量的情况下预测文档中随机一组单词的概率

原理参考:

doc2vec原理及实践_爱吃鱼的猫-优快云博客_doc2vec原理

1. A distributed memory model

训练句向量的方法和词向量的方法非常类似。训练词向量的核心思想就是说可以根据每个单词的上下文预测,也就是说上下文的单词对是有影响的。那么同理,可以用同样的方法训练doc2vec。例如对于一个句子i want to drink water,如果要去预测句子中的单词want,那么不仅可以根据其他单词生成feature, 也可以根据其他单词和句子来生成feature进行预测。因此doc2vec的框架如下所示:

每个段落/句子都被映射到向量空间中,可以用矩阵的一列来表示。每个单词同样被映射到向量空间,可以用矩阵的一列来表示。然后将段落向量和词向量级联或者求平均得到特征,预测句子中的下一个单词。

这个段落向量/句向量也可以认为是一个单词,它的作用相当于是上下文的记忆单元或者是这个段落的主题,所以我们一般叫这种训练方法为Distributed Memory Model of Paragraph Vectors(PV-DM)

在训练的时候我们固定上下文的长度,用滑动窗口的方法产生训练集。段落向量/句向量 在该上下文中共享。

总结doc2vec的过程, 主要有两步:

  • 训练模型,在已知的训练数据中得到词向量, softmax的参数和,以及段落向量/句向量
  • 推断过程(inference stage),对于新的段落,得到其向量表达。具体地,在矩阵中添加更多的列,在固定,,的情况下,利用上述方法进行训练,使用梯度下降的方法得到新的D,从而得到新段落的向量表达

2. Paragraph Vector without word ordering: Distributed bag of words

还有一种训练方法是忽略输入的上下文,让模型去预测段落中的随机一个单词。就是在每次迭代的时候,从文本中采样得到一个窗口,再从这个窗口中随机采样一个单词作为预测任务,让模型去预测,输入就是段落向量。如下所示:

使用gensim训练word2vec

训练步骤:参考https://blog.youkuaiyun.com/m0_37870649/article/details/80746511

1.将语料库预处理,每一行一个文档或者句子,将文档和单词进行按空行分割(英文单词本身就用空格分割,中文需要分词)split()

2..将原始的训练语料转化成一个sentence的迭代器,每一次迭代返回的sentence是一个word(utf8格式)的列表。可以使用Gensim中word2vec.py中的LineSentence()方法实现;

3.将上面处理的结果输入Gensim内建的word2vec对象进行训练即可:

model = Word2Vec(size=size,  sg=sg,  window=window,
                 hs=hs, negative=negative, min_count=min_count, workers=workers)
  1. class Word2Vec(utils.SaveLoad):  
  2.     def __init__(  
  3.             self, sentences=None, size=100, alpha=0.025, window=5, min_count=5,  
  4.             max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001,  
  5.             sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0,  
  6.             trim_rule=None, sorted_vocab=1, batch_words=MAX_WORDS_IN_BATCH):  

sentences:可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或lineSentence构建。

· size:是指特征向量的维度,默认为100。

· alpha: 是初始的学习速率,在训练过程中会线性地递减到min_alpha。

· window:窗口大小,表示当前词与预测词在一个句子中的最大距离是多少。

· min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5。

max_vocab_size: 设置词向量构建期间的RAM限制,设置成None则没有限制。

· sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)。

· seed:用于随机数发生器。与初始化词向量有关。

· workers:用于控制训练的并行数。

· min_alpha:学习率的最小值。

· sg: 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。

· hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0(默认),则使用negative sampling。

· negative: 如果>0,则会采用negativesampling,用于设置多少个noise words(一般是5-20)。

· cbow_mean: 如果为0,则采用上下文词向量的和,如果为1(default)则采用均值,只有使用CBOW的时候才起作用。

· hashfxn: hash函数来初始化权重,默认使用python的hash函数。

· iter: 迭代次数,默认为5。

· trim_rule: 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)。

· sorted_vocab: 如果为1(默认),则在分配word index 的时候会先对单词基于频率降序排序。

· batch_words:每一批的传递给线程的单词的数量,默认为10000。

def trainWord2Vec(doc_list=None, buildvoc=1, passes=20, sg=1, size=100,
                  dm_mean=0, window=5, hs=1, negative=5, min_count=1, workers=4):
    model = Word2Vec(size=size,  sg=sg,  window=window,
                     hs=hs, negative=negative, min_count=min_count, workers=workers)

    if buildvoc == 1:
        print('Building Vocabulary')
        model.build_vocab(doc_list)  # build vocabulate with words + nodeID

    print('Iteration')
    for epoch in range(passes):
        #print('Iteration %d ....' % epoch)
        shuffle(doc_list)  # shuffling gets best results

        model.train(doc_list,total_examples=model.corpus_count,epochs=model.epochs)

    return model

使用gensim训练Docvec

def trainDoc2vec(doc_list=None,bulidvoc = 1,passes = 20,dm = 0,size = 100,dm_mean = 0,windows = 5,hs = 1,negative = 5,min_count = 1,workes = 4):
    model = Doc2Vec(dm=dm,size=size,dm_mean=dm_mean,window=windows,hs = hs, min_count = min_count,negative=negative,workers=workes)#初始化模型

    if bulidvoc == 1:
        print("buliding vocabulary...")
        # build vocabulate with words + nodeID
        model.build_vocab(doc_list)

    print("Iteration...迭代")

    for epoch in range(passes):
        shuffle(doc_list)
        model.train(documents=doc_list,total_examples=model.corpus_count,epoch=model.epoch)

    return model

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值