Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Doc2Vec推断向量未按预期工作_Python_Text Classification_Doc2vec - Fatal编程技术网

Python Doc2Vec推断向量未按预期工作

Python Doc2Vec推断向量未按预期工作,python,text-classification,doc2vec,Python,Text Classification,Doc2vec,程序应该返回列表中最相似的第二个文本,因为它是一个字对一个字。但事实并非如此 import gensim from nltk.tokenize import word_tokenize from gensim.models import Word2Vec from gensim.models.doc2vec import Doc2Vec, TaggedDocument data = ["I love machine learning. Its awesome.", "I lo

程序应该返回列表中最相似的第二个文本,因为它是一个字对一个字。但事实并非如此

import gensim
from nltk.tokenize import word_tokenize
from gensim.models import Word2Vec
from gensim.models.doc2vec import Doc2Vec, TaggedDocument


data = ["I love machine learning. Its awesome.",
        "I love coding in python",
        "I love building chatbots",
        "they chat amagingly well"]


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

max_epochs = 100
vec_size = 20
alpha = 0.025

model = Doc2Vec(size=vec_size,
                alpha=alpha, 
                min_alpha=0.00025,
                min_count=1,
                negative=0,
                dm =1)

model.build_vocab(tagged_data)

for epoch in range(max_epochs):
    #print('iteration {0}'.format(epoch))
    model.train(tagged_data,
                total_examples=model.corpus_count,
                epochs=model.iter)
    # decrease the learning rate
    model.alpha -= 0.0002
    # fix the learning rate, no decay
    model.min_alpha = model.alpha

model.save("d2v.model")


loaded_model=Doc2Vec.load("d2v.model")
test_data=["I love coding in python".lower()]

v1=loaded_model.infer_vector(test_data)

similar_doc=loaded_model.docvecs.most_similar([v1])
print similar_doc
输出:

[('0', 0.17585766315460205), ('2', 0.055697083473205566), ('3', -0.02361609786748886), ('1', -0.2507985532283783)]

它将列表中的第一个文本显示为最相似的文本,而不是第二个文本。您能帮忙吗?

首先,您不会从带有玩具大小数据集的
Doc2Vec
样式的模型中获得好的结果。仅仅四个文档和一个包含大约20个独特单词的词汇表,无法创建一个充满20维向量的对比鲜明的“密集嵌入”向量模型

其次,如果在模型初始化中设置了
negative=0
,则禁用了默认的模型训练校正模式(
negative=5
)——并且没有启用非默认的、不太推荐的替代模式(
hs=1
)。根本不会进行任何培训。代码输出中也可能显示错误–但是,如果您在运行至少
INFO
级别的日志记录,您可能会注意到输出中的其他问题

第三,
推断向量()
需要一个单词标记列表作为其参数。你提供了一个简单的字符串。在代码中,这看起来像是一个由一个字符组成的单词列表,所以就像你要求它根据23个单词的句子进行推断:

['i', ' ', 'l', 'o', 'v', 'e', ' ', 'c', ...]
expert_vector()
的参数应与训练文本的标记完全相同。(如果您在培训期间使用了
word\u tokenize()
,那么也可以在推理期间使用它。)

infere_vector()
还将对文本使用多次重复的推断过程,这些过程等于
Doc2Vec
模型中的“epochs”值,除非您指定另一个值。由于您没有指定
epochs
,因此该模型仍将具有
epochs=5
的默认值(继承自
Word2Vec
)。大多数
Doc2Vec
工作在训练期间使用10-20个纪元,并且在推理期间至少使用同样多的纪元似乎是一种很好的做法

而且:

除非您是专家,否则不要尝试在循环中多次调用
train()
,或在自己的代码中管理
alpha

无论什么在线示例建议使用像您的

适用于范围内的历元(最大历元):
#打印('迭代{0}'。格式(历元))
模型列车(标记的列车数据,
示例总数=model.corpus\u计数,
epochs=模型.iter)
#降低学习率
模型α-=0.0002
#固定学习速率,无衰减
model.min_alpha=model.alpha
…是一个坏的例子。它将有效的
alpha
速率错误地上下发送,如果你想更改
历次次数,它是非常脆弱的,它实际上运行了500个历次(100*model.iter),代码远远超出了需要

相反,不要更改默认的
alpha
选项,并在创建模型时指定所需的纪元数。因此,该模型将缓存一个有意义的
epochs
值,供以后的
推断向量()
使用

然后,只调用train()一次。它将正确处理所有时代和阿尔法管理。例如:

model=Doc2Vec(size=vec\u size,
min_count=1,这不是一个好主意,带有真实的微粒,但还行
dm=1,#无需指定,因为它是默认值,但可以
历元=最大历元)
model.build\u vocab(标记的\u数据)
模型列车(标记的列车数据,
示例总数=model.corpus\u计数,
epochs=model.epochs)

我训练了没有循环的模型,在推断向量中传递了标记化的单词,而不是整句话“data\u test=“我喜欢用python编码”。lower()test\u data=word\u tokenize(data\u test)v1=loaded\u model。推断向量(test\u data)``输出仍然显示列表中最相似的第一个文本:`[('0',0.39219772815704346),('2',0.29952746629714966),('3',0.21126431226730347),('1',0.04621686041355133)]`是的,根据上面的第一点,“你不会从带有玩具大小数据集的Doc2Vec样式模型中得到好结果。”因此,除了修复代码外,在看到有意义的结果之前,您还需要更多的数据。要训练20维向量,我建议至少400个文本和数千个单词的独特词汇表。感谢您的帮助,我正在尝试将具有类似上下文的句子分组,您还有什么其他方法可供选择是吗?如果您只是想学习
Doc2Vec
,gensim的教程可以提供帮助,比如在。它使用一个小语料库(“lee语料库”)为了测试的目的,它与gensim捆绑在一起的新闻故事的数量仍然比实际工作中通常的要小——每个文档只有几百个,几百个单词——但具有类似的缩减训练参数,足以显示一些所需的文本相似性。