通过word2vec的“skip-gram和CBOW模型”生成词向量,使用hierarchical softmax或negative sampling方法。
注意:在Gensim中不止Word2vec可以产生词向量,详见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
你可以通过模型执行各种NLP任务,有些是内置的
>>> 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
如果模型训练完成(不再更新),可以在wv中转换gensim.models.KeyedVectors实例来避免不必要的内存消耗
>>> 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数据的一部分)迭代句子,dirname是存储布朗语料库的根目录(通过nltk.download()下载布朗语料库),得到的这个对象可以通过循环迭代语料库的句子,如下:
['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)
与上一样,也是产生迭代器,但需要更改下文件格式。简单的格式:一句话=一行; 单词已经过预处理并由空格分隔。
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=())
一个训练,使用和评估的神经网络类。如果训练结束,可以再wv中转换gensim.models.KeyedVectors实例。模型可以通过load()和save()加载和保存,或者通过 wv.save_word2vec_format()和Word2VecKeyedVectors.load_word2vec_format().
用句子的迭代器进行模型初始化,每个句子都是一组词(unicode)
- sentence(iterable of iterables):可迭代的句子可以是简单的list,但对于较大的语料库,可以考虑直接从磁盘/网络传输句子的迭代。见BrownCorpus,Text8Corpus 或LineSentence.
- SG(INT {1 ,0}) -定义的训练算法。如果是1,则使用skip-gram; 否则,使用CBOW。
- size(int) - 特征向量的维数。
- window(int) - 句子中当前词和预测词之间的最大距离。
- alpha(float) - 初始学习率。
- min_alpha(float) - 随着训练的进行,学习率将线性下降至min_alpha。
- seed(int) - 随机数发生器的种子。
- min_count(int) - 忽略总频率低于此值的所有单词。
- max_vocab_size(int) - 在构建词汇表时限制RAM; 如果还有比这更独特的单词,那么修剪不常用的单词。每1000万字类型需要大约1GB的RAM。无限制设置为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参数非零,negative sampling.
- negative(int) - 如果> 0,将使用negative sampling,int指定应绘制多少“噪声词”(通常在5-20之间)。如果设置为0,则不使用负采样
- cbow_mean(INT {1 ,0}) -如果为0,使用上下文词向量的和。如果是1,则使用平均值,仅在使用cbow时适用
初始化并训练模型
>>> 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)
从一系列句子中构建词汇表(可以是一次性的生成器流)。每个句子都是可迭代的iterable(也可以简单地是一个unicode字符串列表)。
build_vocab_from_freq(word_freq, keep_raw_vocab=False, corpus_count=None, trim_rule=None, update=False)
从词频词典中构建词汇。从包含(单词,单词计数)的传递字典中构建模型词汇表。单词必须是类型unicode字符串。
>>> from gensim.models import Word2Vec
>>>
>>> model= Word2Vec()
>>> model.build_vocab_from_freq({"Word1": 15, "Word2": 20})
estimate_memory(vocab_size = None,report = None )
使用当前设置和提供的词汇大小估算模型所需的内存。
predict_output_word(context_words_list, topn=10)
报告中心词的概率分布,给定上下文词作为训练模型的输入。
context_words_list - 上下文单词列表
topn(int) - 返回最常用的单词及其概率
返回:
(单词,概率)元组的topn长度列表
返回类型:
obj:列表:obj:元组
score(sentences, total_sentences=1000000, chunksize=100, queue_factor=2, report_delay=1)
计算一系列句子的对数概率
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=())
从一系列句子更新模型的神经权重.