我试图了解doc2vec,我可以用它来解决我的情况。我想使用TaggedSentences([words],[tags])为一个或多个标签标记句子,但是不确定我的理解是否正确。

所以基本上,我需要做到这一点(或者我完全超出了预期)

我创建了2个TaggedDocuments

TaggedDocument(words=["the", "bird", "flew", "over", "the", "coocoos", "nest", labels=["animal","tree"])
TaggedDocument(words=["this", "car", "is", "over", "one", "million", "dollars", labels=["motor","money"])


我建立我的模型

model = gensim.models.Doc2Vec(documents, dm=0, alpha=0.025, size=20, min_alpha=0.025, min_count=0)


然后我训练我的模型

model.train(documents, total_examples=len(documents), epochs=1)


所以当我完成所有工作后,我期望的是执行时

model.most_similar(positive=["bird", "flew", "over", "nest])


是[动物,树],但我得到

[('the', 0.4732949137687683),
('million', 0.34103643894195557),
('dollars', 0.26223617792129517),
('one', 0.16558100283145905),
('this', 0.07230066508054733),
('is', 0.012532509863376617),
('cocos', -0.1093338280916214),
('car', -0.13764989376068115)]


更新:
当我推断

vec_model = model.Word2Vec.load(os.path.join("save","vec.w2v"))
infer = vec_model.infer_vector(["bird", "flew", "over", "nest"])
print(vec_model.most_similar(positive=[infer], topn=10))


我懂了

[('bird', 0.5196993350982666),
('car', 0.3320297598838806),
('the',  0.1573483943939209),
('one', 0.1546170711517334),
('million',  0.05099521577358246),
('over', -0.0021460093557834625),
('is',  -0.02949431538581848),
('dollars', -0.03168443590402603),
('flew', -0.08121247589588165),
('nest', -0.30139490962028503)]


所以房间里的大象是doc2vec我需要完成上述方案,还是我应该回到床上睡觉并仔细考虑一下Im想要在生活中实现的目标:)

任何帮助,不胜感激

最佳答案

目前尚不清楚您的目标是什么。

您的代码示例有些混乱;当前显示的TaggedDocument构造不可能产生出很好的文本示例。 (words必须是单词列表,而不是带有一串逗号分隔标记的字符串。)

如果您向model提出相似性,您将得到一些信息–如果您想要doc标签,则必须询问该模型的docvecs子属性。 (即model.docvecs.most_similar()。)

关于您的训练参数,没有充分的理由将默认min_alpha更改为与起始alpha相等。保留所有单词的min_count=0通常会使word2vec / doc2vec向量更糟。而且该算法通常需要对数据进行多次传递,通常是10次或多次,而不是一次。

而且,word2vec / doc2vec确实需要大量数据才能获得其结果–玩具大小的测试很少显示出与较大数据集相同的有益特性。

关于python - Gensim doc2vec句子标记,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46674609/

10-12 18:13