【问题标题】:Gensim doc2vec sentence taggingGensim doc2vec 句子标注
【发布时间】:2017-10-10 19:37:00
【问题描述】:

我正在尝试了解 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 来完成上述场景,还是我应该回到床上好好想想我在生活中想要实现的目标 :)

非常感谢任何帮助

【问题讨论】:

    标签: python machine-learning data-science gensim doc2vec


    【解决方案1】:

    不清楚你的目标是什么。

    您的代码示例有点混乱;如当前所示,TaggedDocument 构造不可能产生良好的文本示例。 (words 需要是单词列表,而不是带有一堆逗号分隔标记的字符串。)

    如果您向model 询问相似之处,您会得到文字——如果您想要文档标签,您必须询问模型的docvecs 子属性。 (即model.docvecs.most_similar()。)

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

    而且,word2vec/doc2vec 确实需要大量数据来实现其结果 - 玩具大小的测试很少显示出与大型数据集相同的有益属性。

    【讨论】:

    • 非常感谢 gojomo 的回复 :),所以 iv 修正了上述代码 sn-ps(字符串列表)中的拼写错误,我也尝试更好地理解 min_count 和 min_alpha。 :) 我使用 docvecs.most_similar() 重新运行代码,我确实得到了我期望的正确排名标签。我对 ML 很陌生,非常感谢反馈。不是我必须得到一个更大的数据集和一些好的数据来玩。我的旅程还在继续:)
    • 不清楚你的目标是什么。 > 我试图用相似句子的标签来标记一个句子
    • 我也有点困惑,如果我有 100 个具有独特句子和标签的文档,如果我运行的查询与我希望获得特定标签的句子完全匹配......每次都给我不同的标签...应该发生这种情况吗?
    • Doc2Vec 训练/推理中使用了固有的随机性,因此您不会从运行到运行(无需额外努力)获得相同的向量,但它们应该相似 ,而且如果模型/推理正在使用足够的数据和良好的参数运行。当训练文本的重新推理带回 most_similar() 该文本的训练标签时,常见原因是:(1) 需要更多的推理工作(尤其是在小文本上) - 默认 @ 987654329@ 经常太少; (2) 不像训练那样预处理推理; (3) 数据太少(或太大/“过拟合”模型)。
    • (本质上与“小”数据相比,“大”模型可以很好地训练目标,而无需对输入空间进行可推广的强制“致密化”......因此相同/相似的文本稍后可能会在开始随机化时略有差异,最终会得到相当不同的向量,尤其是对于短文本或少量迭代。更多的迭代、更多的数据或更小的向量大小可能有帮助......但你真的想要许多数万或数百万个示例,甚至可以训练约 100+ 维向量。100 个示例分为 20 维,尤其是如果示例很短,则将其拉伸。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 2018-07-21
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多