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 官網
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章