zoukankan      html  css  js  c++  java
  • Python gensim库word2vec 基本用法

    ip install gensim安装好库后,即可导入使用:

    1、训练模型定义

    from gensim.models import Word2Vec  
    model = Word2Vec(sentences, sg=1, size=100,  window=5,  min_count=5,  negative=3, sample=0.001, hs=1, workers=4)  
    

      

    参数解释:

    0.sentences是训练所需语料,可通过以下方式进行加载

    sentences=word2vec.Text8Corpus(file)
    

      

    此处训练集的格式为英文文本或分好词的中文文本

    1.sg=1是skip-gram算法,对低频词敏感;默认sg=0为CBOW算法。

    2.size是输出词向量的维数,值太小会导致词映射因为冲突而影响结果,值太大则会耗内存并使算法计算变慢,一般值取为100到200之间。

    3.window是句子中当前词与目标词之间的最大距离,3表示在目标词前看3-b个词,后面看b个词(b在0-3之间随机)。

    4.min_count是对词进行过滤,频率小于min-count的单词则会被忽视,默认值为5。

    5.negative和sample可根据训练结果进行微调,sample表示更高频率的词被随机下采样到所设置的阈值,默认值为1e-3。

    6.hs=1表示层级softmax将会被使用,默认hs=0且negative不为0,则负采样将会被选择使用。

    7.workers控制训练的并行,此参数只有在安装了Cpython后才有效,否则只能使用单核。

    详细参数说明可查看word2vec源代码。

    2、训练后的模型保存与加载

    model.save(fname)  
    model = Word2Vec.load(fname)  


    3、模型使用

    model.most_similar(positive=['woman', 'king'], negative=['man'])  
    #输出[('queen', 0.50882536), ...]  
      
    model.doesnt_match("breakfast cereal dinner lunch".split())  
    #输出'cereal'  
      
    model.similarity('woman', 'man')  
    #输出0.73723527  
      
    model['computer']  # raw numpy vector of a word  
    #输出array([-0.00449447, -0.00310097,  0.02421786, ...], dtype=float32)  
    

      

     gensim  word2vec实战

    我选择的《人民的名义》的小说原文作为语料,语料原文在这里

    完整代码参见 github: https://github.com/ljpzzz/machinelearning/blob/master/natural-language-processing/word2vec.ipynb

    拿到了原文,我们首先要进行分词,这里使用结巴分词完成。在中文文本挖掘预处理流程总结中,我们已经对分词的原理和实践做了总结。

    加入下面的一串人名是为了结巴分词能更准确的把人名分出来。

    # -*- coding: utf-8 -*-
    
    import jieba
    import jieba.analyse
    
    jieba.suggest_freq('沙瑞金', True)
    jieba.suggest_freq('田国富', True)
    jieba.suggest_freq('高育良', True)
    jieba.suggest_freq('侯亮平', True)
    jieba.suggest_freq('钟小艾', True)
    jieba.suggest_freq('陈岩石', True)
    jieba.suggest_freq('欧阳菁', True)
    jieba.suggest_freq('易学习', True)
    jieba.suggest_freq('王大路', True)
    jieba.suggest_freq('蔡成功', True)
    jieba.suggest_freq('孙连城', True)
    jieba.suggest_freq('季昌明', True)
    jieba.suggest_freq('丁义珍', True)
    jieba.suggest_freq('郑西坡', True)
    jieba.suggest_freq('赵东来', True)
    jieba.suggest_freq('高小琴', True)
    jieba.suggest_freq('赵瑞龙', True)
    jieba.suggest_freq('林华华', True)
    jieba.suggest_freq('陆亦可', True)
    jieba.suggest_freq('刘新建', True)
    jieba.suggest_freq('刘庆祝', True)
    
    with open('./in_the_name_of_people.txt') as f:
        document = f.read()
        
        #document_decode = document.decode('GBK')
        
        document_cut = jieba.cut(document)
        #print  ' '.join(jieba_cut)  //如果打印结果,则分词效果消失,后面的result无法显示
        result = ' '.join(document_cut)
        result = result.encode('utf-8')
        with open('./in_the_name_of_people_segment.txt', 'w') as f2:
            f2.write(result)
    f.close()
    f2.close()

     拿到了分词后的文件,在一般的NLP处理中,会需要去停用词。由于word2vec的算法依赖于上下文,而上下文有可能就是停词。因此对于word2vec,我们可以不用去停词。

     现在我们可以直接读分词后的文件到内存。这里使用了word2vec提供的LineSentence类来读文件,然后套用word2vec的模型。

       这里只是一个示例,因此省去了调参的步骤,实际使用的时候,你可能需要对我们上面提到一些参数进行调参。

     
    # import modules & set up logging
    import logging
    import os
    from gensim.models import word2vec
    
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    
    sentences = word2vec.LineSentence('./in_the_name_of_people_segment.txt') 
    
    model = word2vec.Word2Vec(sentences, hs=1,min_count=1,window=3,size=100)  
     

    模型出来了,我们可以用来做什么呢?这里给出三个常用的应用。

    第一个是最常用的,找出某一个词向量最相近的词集合,代码如下:

     
    req_count = 5
    for key in model.wv.similar_by_word('沙瑞金'.decode('utf-8'), topn =100):
        if len(key[0])==3:
            req_count -= 1
            print key[0], key[1]
            if req_count == 0:
                break;
     

    我们看看沙书记最相近的一些3个字的词(主要是人名)如下:

    高育良 0.967257142067
    李达康 0.959131598473
    田国富 0.953414440155
    易学习 0.943500876427
    祁同伟 0.942932963371

    第二个应用是看两个词向量的相近程度,这里给出了书中两组人的相似程度:

    print model.wv.similarity('沙瑞金'.decode('utf-8'), '高育良'.decode('utf-8'))
    print model.wv.similarity('李达康'.decode('utf-8'), '王大路'.decode('utf-8'))

    输出如下:

    0.961137455325
    0.935589365706

    第三个应用是找出不同类的词,这里给出了人物分类题:

    print model.wv.doesnt_match(u"沙瑞金 高育良 李达康 刘庆祝".split())

    word2vec也完成的很好,输出为"刘庆祝"。

    gensim word2vec :https://www.cnblogs.com/pinard/p/7278324.html

    word2vec原理:http://www.cnblogs.com/pinard/p/7160330.html  

    原文:https://blog.csdn.net/angus_monroe/article/details/76999920

  • 相关阅读:
    初识函数作业
    HTTP协议那些事儿(Web开发补充知识点)
    文件操作
    文件操作作业
    深浅拷贝
    深浅拷贝作业
    小数据池 is和== 再谈编码
    小数据池/is和==/再谈编码作业
    如何用好 github 中的 watch、star、fork
    Navicat Premium Mac 12 破解(亲测可用!!!)
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/10589035.html
Copyright © 2011-2022 走看看