如何解决如何解释以前看到的数据的 doc2vec 结果?
我使用 gensim 4.0.1 并训练 doc2vec:
from gensim.test.utils import common_texts
from gensim.models.doc2vec import doc2vec,TaggedDocument
sentences = [['hello','world'],['james','bond'],['adam','smith']]
documents = [TaggedDocument(doc,[i]) for i,doc in enumerate(sentences)]
model = doc2vec(documents,vector_size=5,window=5,min_count=0,workers=4)
documents
[TaggedDocument(words=['hello',tags=[0]),TaggedDocument(words=['james',tags=[1]),TaggedDocument(words=['adam','smith'],tags=[2])]
model.dv[0],model.dv[1],model.dv[2]
(array([-0.10461631,-0.11958256,-0.1976151,0.1710569,0.0713223 ],dtype=float32),array([ 0.00526548,-0.19761242,-0.10334401,-0.19437183,0.04021204],array([ 0.05662392,0.09290017,-0.08597242,-0.06293383,-0.06159503],dtype=float32))
我希望在 TaggedDocument #1 上获得匹配
seen = ['james','bond']
令人惊讶的是,已知文本(james bond)产生了一个完全“看不见”的向量:
new_vector = model.infer_vector(seen)
new_vector
array([-0.07762126,0.03976333,-0.02985927,0.07899596,-0.03556045],dtype=float32)
most_similar() 没有指向预期的 Tag=1。此外,所有 3 个分数都很弱,这意味着完全看不见数据。
model.dv.most_similar_cosmul(positive=[new_vector])
[(0,0.5322251915931702),(2,0.4972134530544281),(1,0.46321794390678406)]
这里有什么问题,有什么想法吗?
解决方法
对于只有 6 个单词、6 个唯一单词和 3 个 2 单词文本的玩具大小的数据集来说,五个维度仍然太多。
Word2Vec
/Doc2Vec
/FastText
类型的算法均不适用于少量人为数据。他们只能从各种语境中许多微妙对比的单词用法中学习自己的模式。
它们的真正优势只出现在 50、100 或数百个维度宽的向量中 - 并且训练多个维度需要(至少)数千个单词的独特词汇 - 理想情况下数万或数十万个单词 - 每个单词都有许多用法示例。 (对于 Doc2Vec
这样的变体,您同样需要成千上万个不同的文档。)
当使用足够的训练数据时,您会看到与预期结果的相关性得到改善。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。