如何在gensim中单独识别doc2vec实例

时间:2019-07-05 05:48:32

标签: python gensim

我有一个1000个文档的列表,其中前500个属于movies中的文档(即,列表索引从0499),其余500个语言属于{ {1}}(即从tv series500的列表索引)。

对于电影,999document 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的顺序创建的。)

很高兴在需要时提供更多详细信息。

1 个答案:

答案 0 :(得分:1)

所有tagsDoc2Vec的不透明标识符。因此,如果您的数据存在内部差异,则需要自己对该数据进行建模和过滤。

因此,我的主要建议是要求提供比您需要的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; } 在那里更有用,因为通常只有最常见的单词和最强的矢量的结果才最有趣)