推荐一个讲解word2vec理论的视频:
李沐-[MXNet/Gluon] 动手学深度学习第十六课:词向量(word2vec)
工具:anaconda2
前者的输入有两个参数:一行分词后的文本,标签;
后者的输入:分词之后的文本文件,每个文本占一行.
python的gensim有2.3.0和3.4.0两个版本,加载模型推测文本向量时所用的gensim版本一定要和训模型时使用的版本一样。
我想计算两个本文的语义相似,一开始我用如下方式推测文本向量,然后计算两个向量的余弦值:
model = Doc2Vec.load("model.model",mmap='r')
#推测文本的向量
Vector1 = model.infer_vector(text1,steps=6,alpha=0.025)
Vector2 = model.infer_vector(text2,steps=6,alpha=0.025)
后来我发现模型load一次,用这个模型对同一段文本推测两次,两次结果是不一样的,即下面的v1和v2是不一样的:
model = Doc2Vec.load("model.model",mmap='r')
#推测文本的向量
v1 = model.infer_vector(text1,steps=6,alpha=0.025)
v2 = model.infer_vector(text1,steps=6,alpha=0.025)
关于gensim的doc2vec该如何推测非训练语料库里文本的向量(训练语料库里的文本直接用函数model.docvecs[]便可求得),查了一些资料,虽然还是含糊不清,大概有以下3种方法:
model = Doc2Vec.load("model.model",mmap='r')
model.random.seed(0)
v1 = model.infer_vector(text1,steps=6,alpha=0.025)
model.random.seed(0)
v2 = model.infer_vector(text1,steps=6,alpha=0.025)
model = Doc2Vec.load("model.model",mmap='r')
v1 = model.infer_vector(text1,steps=6,alpha=0.025)
model = Doc2Vec.load("model.model",mmap='r'
v2 = model.infer_vector(text1,steps=6,alpha=0.025)
数据量大时,写“数据预处理“脚本一定要写成分布式的,一定要写成分布式的,一定要写成分布式的!!!(300M数据量,分词和去停用词,普通机器,我至少跑了一天一夜,具体时间我记不得了)
“文本相似度计算“这是一个需要实时跑的需求,也就是说我需要根据web页面点击实时加载模型,推测向量,计算余弦值。但加载模型(模型1.28g)就花了4s,太慢,这个问题后来解决了。
可以用两段文本重合词百分比来衡量两段文本是否在说同一件事,如是否都在说武侠,是否都在说天气,但更细一层的语义便没法衡量了。
有老师说相似度值的大小并不能确切地说明模型的好与不好,所以设计了衡量标准:不同模型,根据文本的topN是否稳定来决定调参的方向。
于此同时,尽管有老师说“不能看相似度的数值”来判断模型好和不好,我还是认为数值具有借鉴意义。模型最终确定时,用完全一样的两个文本的相似度来衡量“模型阐述文本相似的能力”。如300组完全一样的文本,通过查看“相似度值聚集的范围”,来衡量“模型阐述文本相似的能力”。
[1]推测非训练语料库里文本的向量-model.random.seed()等
[2]推测非训练语料库里文本的向量-每次推测前模型都加载一次