通過word2vec的“skip-gram和CBOW模型”生成詞向量,使用hierarchical softmax或negative sampling方法。
注意:在Gensim中不止Word2vec可以產(chǎn)生詞向量,詳見Fasttext和wrappers。
初始化模型:
model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4)
保存加載模型:
model.save(fname)
model = Word2Vec.load(fname) # you can continue training with the loaded model!
詞向量存儲在model.wv的KeyedVectors實例中,可以直接在KeyedVectors中查詢詞向量。
model.wv['computer'] # numpy vector of a word
array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
詞向量也可以被硬盤上已有的C格式文件實例化成KeyedVectors
from gensim.models import KeyedVectors
word_vectors = KeyedVectors.load_word2vec_format('/tmp/vectors.txt', binary=False) # C text format
word_vectors = KeyedVectors.load_word2vec_format('/tmp/vectors.bin', binary=True) # C binary format
你可以通過模型執(zhí)行各種NLP任務(wù),有些是內(nèi)置的
>>> model.wv.most_similar(positive=['woman', 'king'], negative=['man'])
[('queen', 0.50882536), ...]
>>> model.wv.most_similar_cosmul(positive=['woman', 'king'], negative=['man'])
[('queen', 0.71382287), ...]
>>> model.wv.doesnt_match("breakfast cereal dinner lunch".split())
'cereal'
>>> model.wv.similarity('woman', 'man')
0.73723527
模型下的文本概率:
>>> model.score(["The fox jumped over a lazy dog".split()])
0.2158356
如果模型訓(xùn)練完成(不再更新),可以在wv中轉(zhuǎn)換gensim.models.KeyedVectors實例來避免不必要的內(nèi)存消耗
>>> word_vectors = model.wv
>>> del model
gensim.models.phrases模塊可以讓你自動檢測短語的詞向量
>>> bigram_transformer = gensim.models.Phrases(sentences)
>>> model = Word2Vec(bigram_transformer[sentences], size=100, ...)
class gensim.models.word2vec.BrownCorpus(dirname )
從布朗語料庫(NLTK數(shù)據(jù)的一部分)迭代句子,dirname是存儲布朗語料庫的根目錄(通過nltk.download()下載布朗語料庫),得到的這個對象可以通過循環(huán)迭代語料庫的句子,如下:
['the/at', 'fulton/np', 'county/nn', 'grand/jj', 'jury/nn', 'said/vb', 'friday/nr', 'an/at', 'investigation/nn', 'of/in', "atlanta's/np", 'recent/jj', 'primary/nn', 'election/nn', 'produced/vb', 'no/at', 'evidence/nn', 'that/cs', 'any/dt', 'irregularities/nn', 'took/vb', 'place/nn']
class gensim.models.word2vec.LineSentence(source, max_sentence_length=10000, limit=None)
與上一樣,也是產(chǎn)生迭代器,但需要更改下文件格式。簡單的格式:一句話=一行; 單詞已經(jīng)過預(yù)處理并由空格分隔。
class gensim.models.word2vec.PathLineSentences(source,max_sentence_length = 10000,limit = None )
與LineSentence類一樣,不過這里是處理根目錄下的所有文件,同樣文件中句子格式需要處理
class gensim.models.word2vec.Text8Corpus(fname,max_sentence_length = 10000 )
從text8語料庫中迭代句子
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, compute_loss=False, callbacks=())
一個訓(xùn)練,使用和評估的神經(jīng)網(wǎng)絡(luò)類。如果訓(xùn)練結(jié)束,可以再wv中轉(zhuǎn)換gensim.models.KeyedVectors實例。模型可以通過load()和save()加載和保存,或者通過 wv.save_word2vec_format()和Word2VecKeyedVectors.load_word2vec_format().
用句子的迭代器進行模型初始化,每個句子都是一組詞(unicode)
- sentence(iterable of iterables):可迭代的句子可以是簡單的list,但對于較大的語料庫,可以考慮直接從磁盤/網(wǎng)絡(luò)傳輸句子的迭代。見BrownCorpus,Text8Corpus 或LineSentence.
- SG(INT {1 ,0}) -定義的訓(xùn)練算法。如果是1,則使用skip-gram; 否則,使用CBOW。
- size(int) - 特征向量的維數(shù)。
- window(int) - 句子中當前詞和預(yù)測詞之間的最大距離。
- alpha(float) - 初始學(xué)習(xí)率。
- min_alpha(float) - 隨著訓(xùn)練的進行,學(xué)習(xí)率將線性下降至min_alpha。
- seed(int) - 隨機數(shù)發(fā)生器的種子。
- min_count(int) - 忽略總頻率低于此值的所有單詞。
- max_vocab_size(int) - 在構(gòu)建詞匯表時限制RAM; 如果還有比這更獨特的單詞,那么修剪不常用的單詞。每1000萬字類型需要大約1GB的RAM。無限制設(shè)置為None。
- sample(float) - 用于配置哪些較高頻率的詞隨機下采樣的閾值,有用范圍是(0,1e-5)
- worker(int) - 線程
- hs (int {1,0}) – If 1, hierarchical softmax will be used for model training. If set to 0, negative參數(shù)非零,negative sampling.
- negative(int) - 如果> 0,將使用negative sampling,int指定應(yīng)繪制多少“噪聲詞”(通常在5-20之間)。如果設(shè)置為0,則不使用負采樣
- cbow_mean(INT {1 ,0}) -如果為0,使用上下文詞向量的和。如果是1,則使用平均值,僅在使用cbow時適用
初始化并訓(xùn)練模型
>>> from gensim.models import Word2Vec
>>> sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]]
>>>
>>> model = Word2Vec(sentences, min_count=1)
>>> say_vector = model['say'] # get vector for word
build_vocab(sentences, update=False, progress_per=10000, keep_raw_vocab=False, trim_rule=None, **kwargs)
從一系列句子中構(gòu)建詞匯表(可以是一次性的生成器流)。每個句子都是可迭代的iterable(也可以簡單地是一個unicode字符串列表)。
build_vocab_from_freq(word_freq, keep_raw_vocab=False, corpus_count=None, trim_rule=None, update=False)
從詞頻詞典中構(gòu)建詞匯。從包含(單詞,單詞計數(shù))的傳遞字典中構(gòu)建模型詞匯表。單詞必須是類型unicode字符串。
>>> from gensim.models import Word2Vec
>>>
>>> model= Word2Vec()
>>> model.build_vocab_from_freq({"Word1": 15, "Word2": 20})
estimate_memory(vocab_size = None,report = None )
使用當前設(shè)置和提供的詞匯大小估算模型所需的內(nèi)存。
predict_output_word(context_words_list, topn=10)
報告中心詞的概率分布,給定上下文詞作為訓(xùn)練模型的輸入。
context_words_list - 上下文單詞列表
topn(int) - 返回最常用的單詞及其概率
返回:
(單詞,概率)元組的topn長度列表
返回類型:
obj:列表:obj:元組
score(sentences, total_sentences=1000000, chunksize=100, queue_factor=2, report_delay=1)
計算一系列句子的對數(shù)概率
train(sentences, total_examples=None, total_words=None, epochs=None, start_alpha=None, end_alpha=None, word_count=0, queue_factor=2, report_delay=1.0, compute_loss=False, callbacks=())
從一系列句子更新模型的神經(jīng)權(quán)重.