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

标签 python gensim

我有一个包含 1000 个文档的列表,其中前 500 个属于 movies 中的文档(即从 0499 的列表索引)其余 500 个属于电视剧中的文档(即从 500999 的列表索引)。

对于电影,文档标签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 个电视剧以及它们的余弦相似度。

我知道,函数gensim提供了model.docvecs.most_similar。然而,这样做的结果也包括电影(这不是我的本意)。是否可以在 gensim 中执行此操作(我假设文档向量是按照我们提供的文档列表的顺序创建的)。

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

最佳答案

所有标签对于Doc2Vec来说都是不透明的标识符。因此,如果您的数据存在内部差异,您需要自己对其进行建模和过滤。

因此,我的主要建议是请求比您需要的大得多的 topn,然后丢弃那些您不想要的类型的结果,或者超出您实际需要的数量的结果.

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

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

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

关于python - 如何在python中的gensim中单独识别doc2vec实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56897173/

相关文章:

python - 使用word2vec对类别中的单词进行分类

python - 如何在 Pyramid 中通过 POST 提交请求?

Python:从另一个子目录导入文件

python - 访问gensim字典中的键值对

python - 文档与 doc2vec 的相似度

nlp - 我们可以以分布式方式构建 word2vec 模型吗?

python - 包装器的 Gensim 模块属性错误

python - 请求库 GET 方法重定向所有带有 header 位置的响应,还是仅重定向状态代码为 300 的响应?

python - 纪元纳秒到正常时间

Python 列表范围访问作为环形缓冲区