关于gensim中doc2vec的使用参考

推荐一个讲解word2vec理论的视频:
李沐-[MXNet/Gluon] 动手学深度学习第十六课:词向量(word2vec)

工具:anaconda2

TaggedDocumnet 和TaggedLineDocument

前者的输入有两个参数:一行分词后的文本,标签;
后者的输入:分词之后的文本文件,每个文本占一行.

库版本的差异

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.random.seed()[1][2]
    即模型加载后,每次推测之前都要设置model.random.seed()参数,但具体怎么设置并没有查到详细资料,举例如下:
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)
  • 每次推测之前都要加载一次模型,这种方式太耗时,不适合频繁使用,举例如下:[2]
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)
  • steps参数设置大一点[2],只是有人这么说,我没有试过。

数据量大时,预处理的脚本要写成分布式的形式

数据量大时,写“数据预处理“脚本一定要写成分布式的,一定要写成分布式的,一定要写成分布式的!!!(300M数据量,分词和去停用词,普通机器,我至少跑了一天一夜,具体时间我记不得了)

预处理时要给数据去重和去噪

模型加载速度慢

“文本相似度计算“这是一个需要实时跑的需求,也就是说我需要根据web页面点击实时加载模型,推测向量,计算余弦值。但加载模型(模型1.28g)就花了4s,太慢,这个问题后来解决了。

计算文本相似性的思考

可以用两段文本重合词百分比来衡量两段文本是否在说同一件事,如是否都在说武侠,是否都在说天气,但更细一层的语义便没法衡量了。

模型评估的思考

有老师说相似度值的大小并不能确切地说明模型的好与不好,所以设计了衡量标准:不同模型,根据文本的topN是否稳定来决定调参的方向。
于此同时,尽管有老师说“不能看相似度的数值”来判断模型好和不好,我还是认为数值具有借鉴意义。模型最终确定时,用完全一样的两个文本的相似度来衡量“模型阐述文本相似的能力”。如300组完全一样的文本,通过查看“相似度值聚集的范围”,来衡量“模型阐述文本相似的能力”。

参考资料

[1]推测非训练语料库里文本的向量-model.random.seed()等
[2]推测非训练语料库里文本的向量-每次推测前模型都加载一次

你可能感兴趣的:(机器学习)