无法理解 Doc2Vec 输出

如何解决无法理解 Doc2Vec 输出

所以我开始尝试学习doc2vec,特别是余弦相似度输出。基本上,当我尝试将一个新句子与我训练我的模型的句子列表进行匹配时,我得到了一个意外的输出。如果有人可以提供帮助,那就太棒了,这是我的代码

import gensim
from gensim.models.doc2vec import doc2vec,TaggedDocument

import nltk
from nltk.tokenize import word_tokenize

data = [
        'I love machine learning','I love coding in python','I love building chatbots','they chat amazingly well','dog poops in my yard','this is a stupid exercise','I like math and statistics','cox communications is a dumb face','Machine learning in python is difficult'
        ]

tagged_data = [TaggedDocument(words = word_tokenize(d.lower()),tags = [str(i)]) for i,d in enumerate(data)]

max_epochs = 15
vec_size = 10
wndw = 2
alpha_num = 0.025

model = doc2vec(vector_size = vec_size,window = wndw,alpha = alpha_num,min_alpha = 0.00025,min_count = 1,dm = 1)
  
model.build_vocab(tagged_data)

model = doc2vec(tagged_data,vector_size = 20,window = 2,workers = 4,epochs = 100)

new_sent = 'machine learning in python is easy'.split(' ')

model.docvecs.most_similar(positive = [model.infer_vector(new_sent)])

我收到的输出是这样的(每次运行时也是随机的,所以我也不确定):

[('2',0.4818369746208191),('5',0.4623863697052002),('3',0.4057881236076355),('4',0.3984462022781372),('8',0.2882154583930969),('7',0.27972114086151123),('6',0.23783418536186218),('0',0.11647315323352814),('1',-0.12095103412866592)]

意思是模型表明“我喜欢用 Python 编码”与“用 Python 进行机器学习很容易”最相似,而我认为“用 Python 进行机器学习很困难”最相似。至少我是这么解释的。

解决方法

您可能误解了输出。数字是训练向量的索引。因此,它与索引2处的向量最相似,即I love building chatbots,而与索引1处的向量即I love coding in python最不相似。

话虽如此,不要创建两个模型,一个用于创建向量,另一个用于测试。只有您创建向量的模型理解向量,而另一个模型不理解。

古怪的结果可能是因为没有足够的数据让机器理解或开发有用的词嵌入。随机性可能是因为每次运行它时,都会在创建词向量时滚动不同的 RNG。如果有办法,请尝试设置随机状态。

,

Doc2Vec 和类似的算法在像这样的玩具大小的数据集上不起作用。演示的最低限度是包含数百个文本和数万个训练词 - 对于这样一个(仍然非常小)的数据集,您再次希望将默认的 vector_size 减少到某些东西像您的 10-20 个值一样小,而不是默认的 100

因此,首先要在更大的数据集上进行测试。原始论文和大多数其他非平凡的演示将使用数以万计的文本集,每个文本至少有十几个,最好有几十个或几百个字长。

其次,您当前的代码正在创建一个初始 Doc2Vec 实例,然后在其上调用 .build_vocab(),然后……丢弃该模型,并在您的第二个分配中创建一个全新的模型model 变量。您只需要创建一个,并且它应该只有您真正想要的参数 - 而不是当前代码中不同参数的混合。

在 INFO 级别打开日志记录将提供输出,帮助您了解正在发生的步骤 - 当您学习阅读输出时,您可能会看到良好进展的确认或问题的迹象。

最后,min_count=1 几乎总是一个坏主意 - 这些算法需要多个单词使用示例,以免在训练中产生噪音,通常最好丢弃单例(和非常罕见)单词让别人变得更好。 (一旦您使用更大的数据集,丢失单词而不是只出现 1 到几次就不应该是一个大问题。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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元字符(。)和普通点?