本篇讲讲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 这样的一行!
既然如此我们就可以直接将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