Doc2Vec:tuTypeError:“ str”和“ int”的实例之间不支持“ <”

时间:2019-05-02 16:10:15

标签: python doc2vec

我创建了一个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'

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

enter image description here我遇到了同样的错误,并且找到了解决方法。 出现此错误的原因是因为您的函数: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属性。