Gensim简介及word2vec API

1. 简介

Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。
它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法。

2. word2vec

gensim word2vec API概述
    在gensim中,word2vec 相关的API都在包gensim.models.word2vec中。和算法有关的参数都在类gensim.models.word2vec.Word2Vec中。算法需要注意的参数有:

1) sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出。后面我们会有从文件读出的例子。

2) size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。

3) window:即词向量上下文最大距离,这个参数在我们的算法原理篇中标记为c,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5,10]之间。

4) sg: 即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型,是1则是Skip-Gram模型,默认是0即CBOW模型。

5) hs: 即我们的word2vec两个解法的选择了,如果是0, 则是Negative Sampling,是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。

6) negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。

7) cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的xw为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示xw,默认值也是1,不推荐修改默认值。

8) min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。

9) iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。

10) alpha: 在随机梯度下降法中迭代的初始步长。算法原理篇中标记为η,默认是0.025。

11) min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。

以上就是gensim word2vec的主要的参数,下面我们用一个实际的例子来学习word2vec。

3. 示例

from gensim.test.utils import common_texts, get_tmpfile
from gensim.models import Word2Vec
path = get_tmpfile("word2vec.model")

model = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)
model.save("word2vec.model")

值得注意的是,对于输入的语料一般是可迭代类型,或者是a list of lists of tokens,即 [[first,sentence],[second,sentence]] 这种形式。

有的时候,我们获得list类型的语料且比较大时,可以考虑自定义一个迭代器去读取,比如:

class MySentences(object):
    def __init__(self, doc):
        self.corpus = doc
        
    def __iter__(self):
        for sentence in self.corpus:
            yield sentence
            
def get_word2vec_features(df, feature='col',fea_size=150):
    '''
    sentence形式:['We','are','human beings']
    min_count:最小的词频
    sg=1,使用skip-gram模型。
    '''
    print('train word2vec model')
    sentences = MySentences(df[feature].tolist())
    word2vec_model =  Word2Vec(sentences, size=fea_size,sg=1,window=10, min_count=1, iter=5)

	 vocab = list(set(word2vec_model.wv.vocab.keys()))
	 print('vocabulary:', len(vocab), vocab[:5])

参考:

  1. zhihu 15分钟入门Gensim;
  2. wiki Genism;
  3. 刘建平 gensim介绍;
  4. gensim 官网
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章