首页 > 解决方案 > 如何在python的gensim中分别识别doc2vec实例

问题描述

我有一个包含 1000 个文档的列表,其中前 500 个属于(即列表索引 from to )中的文档,其余 500 个属于文档movies(即列表索引 from to )中的0文档。499tv series500999

对于电影,document tagmovie_(例如,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)

现在对于每个movie,我想得到最接近的 5tv series以及它们的余弦相似度。

我知道,gensim 提供的功能model.docvecs.most_similar。然而,这个结果也包括电影(这不是我的意图)。是否可以在 gensim 中执行此操作(我假设文档向量是按照documents list我们提供的顺序创建的)。

如果需要,我很乐意提供更多详细信息。

标签: pythongensim

解决方案


所有这些tags都是不透明的标识符Doc2Vec。因此,如果您的数据存在内部差异,您需要自己建模和过滤。

所以,我的主要建议是要求topn比你需要的大得多,然后丢弃那些你不想要的类型的结果,或者超过你实际需要的数量。

(请注意,每次计算都most_similar()需要与整个已知的 doc-tags 集进行比较,并且使用较小的topn仅在对这些完整结果进行排序时节省了一些计算。因此,使用较大的topn,甚至可以达到已知文档的完整大小-标签,并不像您担心的那样昂贵。)

只有两个类别,要获得最接近查询电影的 10 个电视节目,您可以使topn等于电影的数量,减去 1(查询),再加上 10——然后在绝对最坏的情况下,所有电影都是比第一个电视节目更接近,您仍然可以获得 10 个有效的电视节目结果。

(该most_similar()函数还包括一个restrict_vocab参数。它需要一个 int 计数,并将结果限制为内部存储顺序中的第一个那么多项目。因此,如果实际上第 500 个文档都是电视节目,则restrict_vocab=500只会给出结果来自那个子集。但是,我不建议依赖这个,因为 (a) 它只适用于前加载的一个类别,而不适用于任何其他类别;(b) 理想情况下,对于培训,你不会把所有相似的文档放在一起,但将它们打乱以与对比文档穿插。通常对Word2Vec向量集进行排序以将最高频率的词放在第一位——无论原始数据中出现的顺序如何。这使得restrict_vocab在那里更有用,因为通常只有具有最强向量的最常见单词的结果才是最有趣的。)


推荐阅读