用gensim实现word2vec 和 glove

本篇讲讲gensim的word2vec模型的使用以及 glove模型用gensim来实现!

首先我们来讲word2vec,  刚开始接触的时候比较迷糊, 我是从tensorflow的神经网络切入的,了解了one-hot 知道要将word 转换成向量才能作为tensor的输入,因此之前的文章也专门写了怎么将word 转换成是很tensor输入格式的操作.网络上大部分文章都会很详尽的讲述了word2vec的原理, CBOW 和 SKIP-GRAW是word2vec的两种基本模型,前者是以周边词预测中间词,后者是以中间词预测周边词.具体原理本文就不在讲述了.总而言之 word2vec 是一种将word转换成词向量的方法,  你可以用tensorflow来实现,也可以用现成的 gensim来实现.  gensim中已经将word2vec训练好了,你只需要将语料传入gensim定义好的方法中,则无需再设计什么神经网络的框架,gensim内部已经定义了一套完整的框架来训练你传入的语料,当然 window_size 这样的参数是要自己传入的!

话不多说我们上代码:

import jieba
from gensim.models import word2vec
#对你的语料进行分词, 目前用的是jieba分词,为什么要进行分词? 因为中文语意强大,因此进行分词能够更好的将有意义的词放在一起
#如果你对你的分词结果不满意,也可以认为干预, 比如用jieba.suggest_freq()函数来制定某些分词

def jieba_cut(filename, cut_filename):

    with open(filename, 'rb') as f:
        mycontent = f.read()
        jieba_content = jieba.cut(mycontent, cut_all=False)
        final_file = ' '.join(jieba_content)
        final_file = final_file.encode('utf-8')

    with open(cut_filename, 'wb+') as cut_f:
        cut_f.write(final_file)


def my_word2vec(cut_filename):
    mysetence = word2vec.Text8Corpus(cut_filename)
# size: embedding的维数 ,hs: 1为负采样, min_count 词频 windows: 窗口大小
    model = word2vec.Word2Vec(mysetence, size=100, hs=1, min_count=1, window=3)

    return model



if __name__ == '__main__':
    filename = r'/Users/apple/Documents/语料/renmingdemingyi.txt'
    cut_filename = r'/Users/apple/Documents/语料/renmingdemingyi_cut.txt'

    jieba_cut(filename, cut_filename)
    model = my_word2vec(cut_filename)
    for key in model.similar_by_word(u'李达康', topn=10):
        print(key)

运行这段代码:

我用的语料比较简单,人民的名义小说, 也没有做任何特殊的处理,所以匹配的也不是很好! 主要是讲解一下就是这么个操作思路. 你也可以用tensorflow 自己来实现word2vec!

word2vec的参数关系还是比较大的, 比如上面的code 把hs=1 取消了 那得出的结果有些天差地别!

接下来我们看看glove的东东, 听说这个glove比word2vec还厉害~~ 由于我用的是python ,也不想在mac电脑上跑虚拟机,所以就没有去搭建glove的生成环境,直接从glove官网上下载了语料 glove.6B.50d.txt   这个表示 50维  前面6B是什么 不清楚.....

那么下载了glove.6B.50d.txt如何使用呢?  其实 gensim也可以使用glove的txt   差别就在于gensim的格式比glove.6B.50d.txt多了一行 多出的这行是首行 --- 行数  维度  比如   400000  50 这样的一行!

扫描二维码关注公众号,回复: 2658074 查看本文章

既然如此我们就可以直接将glove.6B.50d.txt改造一下,添加400001 50 这样的行在首行  (400001 50 ) 这个是glove.6B.50d.txt的行数和维度

因此我们用glove的语料改造一下 就可以直接用

import gensim
from glove_vec import GloveVec

def load(filename):

    myglovevec = GloveVec(filename, 50)
    model = gensim.models.KeyedVectors.load_word2vec_format(myglovevec.get_file()) #GloVe Model
    #model_name = r'/Users/apple/Documents/语料/my_model.npy'
    #model.save(model_name)
    return model

model = load(r'/Users/apple/Documents/语料/glove.6B.50d.txt')

for key in model.similar_by_word(r'brother', topn=10):
    print(key)

其中GloveVec这个类主要做的就是添加了 (40001 50) 这个, 你也可以手动添加!

运行上面的代码的到如下:

效果还是不错的! 可以直接使用! 

我没有下载glove中文的语料,所以就用英文的做写比较! 听说中文的话 阿里的新开源的

本文的全部代码会上传的github! (目前暂时未上传)

本文参考了 https://blog.csdn.net/qq_35273499/article/details/79098689

猜你喜欢

转载自blog.csdn.net/weixin_42724775/article/details/81450192