我创建了一个doc2vec模型来确定大多数相似的文档: 这里是培训代码:
#train doc2vec model
docs = g.doc2vec.TaggedLineDocument(train_corpus)
model = g.Doc2Vec(docs, dm=0, dbow_words=1, size=200, window=8, min_count=19, iter=2)
出于推论,我尝试这样:
#load model
m = g.Doc2Vec.load(model)
pprint(m.docvecs.most_similar(positive=["Machine learning"], topn=20))
但是我遇到了这个错误:
TypeError Traceback (most recent call last)
<ipython-input-142-ca36e85d7a79> in <module>
----> 1 pprint(m.docvecs.most_similar(positive=["Machine learning"], topn=20))
~\Anaconda3\lib\site-packages\gensim\models\keyedvectors.py in most_similar(self, positive, negative, topn, clip_start, clip_end, indexer)
1687 if isinstance(doc, ndarray):
1688 mean.append(weight * doc)
-> 1689 elif doc in self.doctags or doc < self.count:
1690 mean.append(weight * self.vectors_docs_norm[self._int_index(doc, self.doctags, self.max_rawint)])
1691 all_docs.add(self._int_index(doc, self.doctags, self.max_rawint))
TypeError: '<' not supported between instances of 'str' and 'int'
有什么想法吗?
答案 0 :(得分:3)
我遇到了同样的错误,并且找到了解决方法。
出现此错误的原因是因为您的函数:most_similar(positive=["Machine learning"]
在参数正数中使用了标记列表,因此您需要提供单词列表而不是句子。
这是给您的解决方法:
def process_query(query):
words = []
words = query.split()
return words
query = "machine learning"
l = process_query(query)
sim = model.most_similar(positive=l,topn=20)
答案 1 :(得分:0)
这是known bug pending a fix,如果您向模型中不知道的tag
提供doc2vec_model.docvecs.most_similar()
,则会显示此令人困惑的错误。
因此,"Machine learning"
不是训练期间提供的tag
。实际上,TaggedLineDocument
类仅根据语料库文件中的行号为每个文档提供单个标签。如果您想要更复杂/更具描述性的标签,则必须自己准备语料库,以显示带有单词列表TaggedDocument
属性和列表列表的单个对象(形状为words
)标签的tags
属性。