猿问

无法使用 gensim 加载 Doc2vec 对象

我正在尝试使用 gensim 加载预训练的 Doc2vec 模型,并使用它将段落映射到向量。我指的是https://github.com/jhlau/doc2vec,我下载的预训练模型是英文维基百科的DBOW,也在同一个链接里。但是,当我在维基百科上加载 Doc2vec 模型并使用以下代码推断向量时:


import gensim.models as g

import codecs


model="wiki_sg/word2vec.bin"

test_docs="test_docs.txt"

output_file="test_vectors.txt"


#inference hyper-parameters

start_alpha=0.01

infer_epoch=1000


#load model

test_docs = [x.strip().split() for x in codecs.open(test_docs, "r", "utf-8").readlines()]

m = g.Doc2Vec.load(model)


#infer test vectors

output = open(output_file, "w")

for d in test_docs:

    output.write(" ".join([str(x) for x in m.infer_vector(d, alpha=start_alpha, steps=infer_epoch)]) + "\n")

output.flush()

output.close()

我得到一个错误:


/Users/zhangji/Desktop/CSE547/Project/NLP/venv/lib/python2.7/site-packages/smart_open/smart_open_lib.py:402: UserWarning: This function is deprecated, use smart_open.open instead. See the migration notes for details: https://github.com/RaRe-Technologies/smart_open/blob/master/README.rst#migrating-to-the-new-open-function

  'See the migration notes for details: %s' % _MIGRATION_NOTES_URL

Traceback (most recent call last):

  File "/Users/zhangji/Desktop/CSE547/Project/NLP/AbstractMapping.py", line 19, in <module>

    output.write(" ".join([str(x) for x in m.infer_vector(d, alpha=start_alpha, steps=infer_epoch)]) + "\n")

AttributeError: 'Word2Vec' object has no attribute 'infer_vector'

我知道有几个关于堆栈溢出的 infer_vector 问题的线程,但它们都没有解决我的问题。我使用下载了gensim包


pip install git+https://github.com/jhlau/gensim

另外,我查看了gensim包中的源代码后,发现当我使用Doc2vec.load()时,Doc2vec类本身并没有真正的load()函数,但由于它是Word2vec的子类,它调用Word2vec中load()的super方法,然后使模型成为Word2vec对象。然而,infer_vector() 函数是 Doc2vec 独有的,在 Word2vec 中不存在,这就是它导致错误的原因。我还尝试将模型 m 转换为 Doc2vec

事实上,我现在想要的 gensim 只是使用在学术文章上运行良好的预训练模型将段落转换为向量。由于某些原因,我不想自己训练模型。如果有人可以帮助我解决问题,我将不胜感激。


btw,我用的是python2.7,目前的gensim版本是0.12.4。


开满天机
浏览 195回答 1
1回答

呼唤远方

我会避免使用https://github.com/jhlau/doc2vec上已有 4 年历史的非标准 gensim 分支,或任何仅加载此类代码的已有 4 年历史的已保存模型。那里的维基百科 DBOW 模型也小得令人怀疑,只有 1.4GB。即使在 4 年前,维基百科也有超过 400 万篇文章,而一个 300 维的Doc2Vec模型经过训练以拥有 400 万篇文章的文档向量,其大小至少4000000 articles * 300 dimensions * 4 bytes/dimension= 4.8GB,甚至不包括模型的其他部分。(因此,该下载显然不是相关论文中提到的 4.3M 文档、300 维模型——而是以其他不明确的方式被截断的内容。)当前的 gensim 版本是 3.8.3,几周前发布。使用当前代码和当前维基百科转储构建您自己的Doc2Vec模型可能需要一些修补,以及一整夜或更长时间的运行时间——但随后您将使用现代支持的代码,以及更好地理解单词的现代模型在过去 4 年中投入使用。(而且,如果你在你感兴趣的文档类型的语料库上训练模型——比如学术文章——词汇、词义和与你自己的文本预处理的匹配将用于以后推断的文档一切都会更好。)有一个从维基百科构建模型的 Jupyter notebook 示例,该模型在源代码树中Doc2Vec具有功能性或非常接近功能性:gensimhttps://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-wikipedia.ipynb
随时随地看视频慕课网APP

相关分类

Python
我要回答