我有一个1000个文档的列表,其中前500个属于movies
中的文档(即,列表索引从0
到499
),其余500个语言属于{ {1}}(即从tv series
到500
的列表索引)。
对于电影,999
以document tag
开头(例如movie_
),而对于电视系列节目,文档标签以movie_fast_and_furious
开头(例如tv_series_
)
我使用这些电影和电视连续剧数据集来建立tv_series_the_office
模型,如下所示。
doc2vec
现在,对于每个from gensim.models import doc2vec
from collections import namedtuple
dataset = json.load(open(input_file))
docs = []
analyzedDocument = namedtuple('AnalyzedDocument', 'words tags')
for description in dataset:
tags = [description[0]]
words = description[1]
docs.append(analyzedDocument(words, tags))
model = doc2vec.Doc2Vec(docs, vector_size = 100, window = 10, min_count = 1, workers = 4, epochs = 20)
,我想获得其最接近的5 movie
及其余弦相似度。
我知道,gensim提供的功能tv series
。但是,这样做的结果也包括电影(这不是我的意图)。是否有可能在gensim中做到这一点(我假设文档向量是按照我们提供的model.docvecs.most_similar
的顺序创建的。)
很高兴在需要时提供更多详细信息。
答案 0 :(得分:1)
所有tags
是Doc2Vec
的不透明标识符。因此,如果您的数据存在内部差异,则需要自己对该数据进行建模和过滤。
因此,我的主要建议是要求提供比您需要的topn
大得多的most_similar()
,然后丢弃那些您不需要的类型或超出您实际需要的数量的结果。
(请注意,topn
的每次计算都需要与整个已知文档标签集进行比较,而使用较小的topn
仅在排序这些完整结果时节省了一些计算。因此,使用更大的topn
,甚至达到已知文档标签的完整大小,并不像您担心的那样昂贵。)
只有两个类别,要使10个电视节目最接近查询电影,您可以使most_similar()
等于电影数量减去1(查询)再加上10 –然后绝对最糟糕的情况是,所有电影都比第一个电视节目更近,您仍然可以获得10个有效的电视节目结果。
(restrict_vocab
函数还包含一个restrict_vocab=500
参数。它需要一个int计数,并将结果按内部存储顺序仅限制为第1个许多项。因此,实际上前500个文档都是电视节目,Word2Vec
仅给出该子集的结果,但是,我不建议依赖此子集,因为(a)它仅适用于预先加载的一个类别,而不是其他任何文件;(b)理想情况下,您不会将所有相似的文件聚在一起,但将它们混洗以散布对比文件,通常将restrict_vocab
向量集进行排序将出现频率最高的单词排在第一位-不管原始数据的出现顺序如何,这都使/* about */
.about-container{
padding: 3rem;
max-width: 90vw;
margin: 2rem auto;
display: grid;
grid-row-gap: 2rem;
}
@media screen and (min-width:768px){
.about{
display: grid;
grid-template-columns: 1fr 1fr;
}
}
.about_picture_1{
width: 100%;
display: block;
height: 100%;
border-radius: 0.25rem;
}
在那里更有用,因为通常只有最常见的单词和最强的矢量的结果才最有趣)