gensim-word2vec

作者: 迅速傅里叶变换 | 来源:发表于2018-03-09 17:26 被阅读572次

    通过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=())
    从一系列句子更新模型的神经权重.

    相关文章

      网友评论

        本文标题:gensim-word2vec

        本文链接:https://www.haomeiwen.com/subject/kqkmfftx.html