如何解释以前看到的数据的 doc2vec 结果?

如何解决如何解释以前看到的数据的 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?