Gensim doc2vec 句子标注
Gensim doc2vec sentence tagging
我正在尝试理解 doc2vec,我可以用它来解决我的场景吗?我想使用 TaggedSentences([words], [tags]) 用 1 个或多个标签标记句子,但我不确定我的理解是否正确。
所以基本上,我需要它发生(或者我完全偏离了目标)
我创建了 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 来完成上述场景,还是我应该回到床上好好想想我在生活中想要实现的目标:)
非常感谢任何帮助
不清楚您的目标是什么。
您的代码示例有点混乱;目前显示的 TaggedDocument
结构不可能产生良好的文本示例。 (words
需要是单词列表,而不是带有一堆逗号分隔标记的字符串。)
如果您向 model
询问相似性,您会得到文字 – 如果您想要文档标签,则必须询问模型的 docvecs
sub-属性。 (即model.docvecs.most_similar()
。)
关于您的训练参数,没有充分的理由将默认值 min_alpha
更改为等于起始 alpha。一个min_count=0
,保留所有单词,通常会使word2vec/doc2vec向量变差。而且该算法通常需要多次传递数据——通常是 10 次或更多次——而不是一次。
而且,word2vec/doc2vec 确实需要大量数据才能获得结果 - 玩具大小的测试很少显示出更大数据集可能具有的相同有益特性。
我正在尝试理解 doc2vec,我可以用它来解决我的场景吗?我想使用 TaggedSentences([words], [tags]) 用 1 个或多个标签标记句子,但我不确定我的理解是否正确。
所以基本上,我需要它发生(或者我完全偏离了目标)
我创建了 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 来完成上述场景,还是我应该回到床上好好想想我在生活中想要实现的目标:)
非常感谢任何帮助
不清楚您的目标是什么。
您的代码示例有点混乱;目前显示的 TaggedDocument
结构不可能产生良好的文本示例。 (words
需要是单词列表,而不是带有一堆逗号分隔标记的字符串。)
如果您向 model
询问相似性,您会得到文字 – 如果您想要文档标签,则必须询问模型的 docvecs
sub-属性。 (即model.docvecs.most_similar()
。)
关于您的训练参数,没有充分的理由将默认值 min_alpha
更改为等于起始 alpha。一个min_count=0
,保留所有单词,通常会使word2vec/doc2vec向量变差。而且该算法通常需要多次传递数据——通常是 10 次或更多次——而不是一次。
而且,word2vec/doc2vec 确实需要大量数据才能获得结果 - 玩具大小的测试很少显示出更大数据集可能具有的相同有益特性。