python - 如何在python的gensim中分别识别doc2vec实例
问题描述
我有一个包含 1000 个文档的列表,其中前 500 个属于(即列表索引 from to )中的文档,其余 500 个属于文档movies
(即列表索引 from to )中的0
文档。499
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)
现在对于每个movie
,我想得到最接近的 5tv series
以及它们的余弦相似度。
我知道,gensim 提供的功能model.docvecs.most_similar
。然而,这个结果也包括电影(这不是我的意图)。是否可以在 gensim 中执行此操作(我假设文档向量是按照documents list
我们提供的顺序创建的)。
如果需要,我很乐意提供更多详细信息。
解决方案
所有这些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
在那里更有用,因为通常只有具有最强向量的最常见单词的结果才是最有趣的。)
推荐阅读
- postgresql - 在 Postgreql 中,如何确定 postgres 表中的列是否为 LOB 类型,然后如何找到模式中最大 LOB 值的大小?
- json - 为什么我得到更新的 json 字段转换的信息 ZoneAwarePromise 数据
- flutter - 如何在一个选项卡中向另一个选项卡显示/隐藏浮动操作按钮?
- javascript - 身体和图像的大小差异
- python - 在同一行上的 pytorch-ignite ProgressBar 上编写验证指标
- flutter - Navigator of 和 Navigator pop 的区别
- flutter - 无法生成颤振 apk 文件
- java - 如何检查java字节大小是否超过数据库列大小
- python - 如何在 Python 中使用 OpenCV 删除绘制的对象?
- objective-c - Sprite Kit 中跨设备的缩放点