转自:https://blog.csdn.net/mpk_no1/article/details/72510655
API:https://radimrehurek.com/gensim/models/doc2vec.html
用gensim函数库训练Word2Vec模型有很多配置参数。这里对gensim文档的Word2Vec函数的参数说明进行翻译,以便不时之需。
class gensim.models.word2vec.Word2Vec
(sentences=None,size=100,alpha=0.025,window=5, min_count=5, max_vocab_size=None, sample=0.001,seed=1, workers=3,min_alpha=0.0001, sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=<built-in function hash>,iter=5,null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000)
参数:
· sentences:可以是一个·ist,对于大语料集,建议使用BrownCorpus,Text8Corpus或·ineSentence构建。
· sg: 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
· size:是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百。
· window:表示当前词与预测词在一个句子中的最大距离是多少
· alpha: 是学习速率
· seed:用于随机数发生器。与初始化词向量有关。
· min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5
· max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。
· sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)
· workers:参数控制训练的并行数。
· hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0(defau·t),则negative sampling会被使用。
· negative: 如果>0,则会采用negativesamp·ing,用于设置多少个noise words
· cbow_mean: 如果为0,则采用上下文词向量的和,如果为1(defau·t)则采用均值。只有使用CBOW的时候才起作用。
· hashfxn: hash函数来初始化权重。默认使用python的hash函数
· iter: 迭代次数,默认为5
· trim_rule: 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受()并返回RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的函数。
· sorted_vocab: 如果为1(defau·t),则在分配word index 的时候会先对单词基于频率降序排序。
· batch_words:每一批的传递给线程的单词的数量,默认为10000
本篇主要用一个实例来介绍一下如何进行Word2vec和Doc2vec的训练,并对Word2vec和Doc2vec模型训练过程中的参数进行一些解读。使用的是Python版本的gensim库实现,想要了解Word2vec和Doc2vec的原理可以查看我的上一篇博客( 深度学习笔记——Word2vec和Doc2vec原理理解并结合代码分析)。代码见我的GitHub(使用Gensim库训练Word2vec和Doc2vec模型)
Word2vec
使用Gensim训练Word2vec十分方便,训练步骤如下:
1.将语料库预处理:一行一个文档或句子,将文档或句子分词(以空格分割,英文可以不用分词,英文单词之间已经由空格分割,中文预料需要使用分词工具进行分词,常见的分词工具有StandNLP、ICTCLAS、Ansj、FudanNLP、HanLP、结巴分词等);
2.将原始的训练语料转化成一个sentence的迭代器,每一次迭代返回的sentence是一个word(utf8格式)的列表。可以使用Gensim中word2vec.py中的LineSentence()方法实现;
3.将上面处理的结果输入Gensim内建的word2vec对象进行训练即可:
- from gensim.models import Word2Vec
- model = Word2Vec(LineSentence(inp), size=100, window=10, min_count=3,
- workers=multiprocessing.cpu_count(), sg=1, iter=10, negative=20)
- class Word2Vec(utils.SaveLoad):
- def __init__(
- self, sentences=None, size=100, alpha=0.025, window=5, min_count=5,
- max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001,
- sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0,
- 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。
一些参数的选择与对比:
1.skip-gram (训练速度慢,对罕见字有效),CBOW(训练速度快)。一般选择Skip-gram模型;
2.训练方法:Hierarchical Softmax(对罕见字有利),Negative Sampling(对常见字和低维向量有利);
3.欠采样频繁词可以提高结果的准确性和速度(1e-3~1e-5)
4.Window大小:Skip-gram通常选择10左右,CBOW通常选择5左右。
综上,就完成了一个Word2vec模型的训练过程。可以将训练好的模型保存在文件中:
- model.save_word2vec_format(outp2, binary=False)
- from gensim.models import Word2Vec
- model = Word2Vec.load("D:/data/wiki2vector/en_1000_no_stem/en.model")
- print(model.similarity('woman', 'man'))
Doc2vec
Doc2vec的工作原理与word2vec极为相似,只是将文档或句子作为一个特殊的token id引入训练语料中。在Gensim中,doc2vec也是继承于word2vec的一个子类。训练过程十分相似。
主要的区别在数据的预处理上,Doc2vec接受一个由TaggedLineDocument对象组成的迭代器作为其构造函数的输入参数。可以使用Gensim内建的类TaggedLineDocument来实现:
- class TaggedLineDocument(object):
- """Simple format: one document = one line = one TaggedDocument object.
- Words are expected to be already preprocessed and separated by whitespace,
- tags are constructed automatically from the document line number."""
- def __init__(self, source):
- self.source = source
- def __iter__(self):
- """Iterate through the lines in the source."""
- try:
- # Assume it is a file-like object and try treating it as such
- # Things that don't have seek will trigger an exception
- self.source.seek(0)
- for item_no, line in enumerate(self.source):
- yield TaggedDocument(utils.to_unicode(line).split(), [item_no])
- except AttributeError:
- # If it didn't work like a file, use it as a string filename
- with utils.smart_open(self.source) as fin:
- for item_no, line in enumerate(fin):
- yield TaggedDocument(utils.to_unicode(line).split(), [item_no])
- model = Doc2Vec(TaggedLineDocument(inp), size=200, window=5, min_count=5, workers=multiprocessing.cpu_count())
- model.save(outp1)#save dov2vec
- model.save_word2vec_format(outp2, binary=False)#save word2vec
具体的训练参数解释如下:
- class Doc2Vec(Word2Vec):
- """Class for training, using and evaluating neural networks described in http://arxiv.org/pdf/1405.4053v2.pdf"""
- def __init__(self, documents=None, dm_mean=None,
- dm=1, dbow_words=0, dm_concat=0, dm_tag_count=1,
- docvecs=None, docvecs_mapfile=None, comment=None, trim_rule=None, **kwargs):
· dm: 训练算法:默认为1,指DM;dm=0,则使用DBOW。
· dm_mean: 当使用DM训练算法时,对上下文向量相加(默认0);若设为1,则求均值。
· dm_concat: 默认为0,当设为1时,在使用DM训练算法时,直接将上下文向量和Doc向量拼接。
· dbow_words: 当设为1时,则在训练doc_vector(DBOW)的同时训练Word_vector(Skip-gram);默认为0,只训练doc_vector,速度更快。
其他参数与Word2vec的训练参数类似。