在RNN中词使用one_hot表示的问题
定义:指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量。
注:这个维数通常不定,不同实现算法指定维度都不一样,通常在30~500之间。
如下图所示:
4.2.2.1 特点
4.2.2.3 算法类别
Bengio等人在一系列论文中使用了神经概率语言模型使机器“习得词语的分布式表示。
2013年,谷歌托马斯·米科洛维(Tomas Mikolov)领导的团队发明了一套工具word2vec来进行词嵌入。
算法学习实现:https://www.tensorflow.org/tutorials/representation/word2vec
下载gensim库
pip install gensim
4.2.3.1 训练语料
由于语料比较大,就提供了一个下载地址:http://www.sogou.com/labs/resource/cs.php
4.2.3.2 步骤
4.2.3.3 代码
训练的代码如下
if len(sys.argv) < 3:
sys.exit(1)
# inp表示语料库(分词),outp:模型
inp, outp = sys.argv[1:3]
model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())
model.save(outp)
import sys
import multiprocessing
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
if __name__ == '__main__':
if len(sys.argv) < 3:
sys.exit(1)
# inp表示语料库(分词),outp:模型
inp, outp = sys.argv[1:3]
model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())
model.save(outp)
运行命令
python trainword2vec.py ./corpus_seg.txt ./model/*
指定好分词的文件以及,保存模型的文件
improt gensim
gensim.models.Word2Vec.load("./model/corpus.model")
model.most_similar("警察")
Out:
[('警员', 0.6961891651153564),
('保安人员', 0.6414757370948792),
('警官', 0.6149201989173889),
('消防员', 0.6082159876823425),
('宪兵', 0.6013336181640625),
('保安', 0.5982533693313599),
('武警战士', 0.5962344408035278),
('公安人员', 0.5880240201950073),
('民警', 0.5878666639328003),
('刑警', 0.5800305604934692)]
model.similarity('男人','女人')
Out: 0.8909852730435042
model.most_similar(positive=['女人', '丈夫'], negative=['男人'], topn=1)
Out: [('妻子', 0.7788498997688293)]