我参与了一个电影推荐项目。我们使用gensim开发了一个doc2vec模型。如果需要,可以查看gensim的文档。https://radimrehurek.com/gensim/models/keyedvectors.html#gensim.models.keyedvectors.WordEmbeddingsKeyedVectors.most_similar
训练了模型后,当我根据演员阵容查找某部电影的前10部相似电影时,返回的都是年代久远的电影,发行年份为1960年、1950年等。因此,我尝试将发行年份作为参数加入gensim模型,但仍然显示旧电影。我该如何解决发行年份差异问题呢?我希望在查看某部电影的前10个推荐时,这些电影的发行年份差异较小(比如过去10年的电影,而不是更早的)。我该如何实现这一点?
doc2vec模型的代码
def d2v_doc(titles_df): tagged_data = [TaggedDocument(words=_d, tags=[str(titles_df['id_titles'][i])]) for i, _d in enumerate(titles_df['doc'])] model_d2v = Doc2Vec(vector_size=300,min_count=10, dm=1) model_d2v.build_vocab(tagged_data) model_d2v.train(tagged_data,epochs=100,total_examples=model_d2v.corpus_count) return model_d2v
titles_df数据框包含以下列(id_titles, title, release_year, actors, director, writer, doc)
col_names = ['actors', 'director','writer','release_year']titles_df['doc'] = titles_df[col_names].apply(lambda x: ' '.join(x.astype(str)), axis=1).str.split()
前10部相似电影的代码
def titles_lookup(similar_doc,titles_df): df = pd.DataFrame(similar_doc, columns =['id_titles', 'simialrity']) df = pd.merge(df, titles_df[['id_titles','title','release_year']],on='id_titles',how='left') print(df)def demo_d2v_title(model,titles_df, id_titles): similar_doc = model.docvecs.most_similar(id_titles) titles_lookup(similar_doc,titles_df)def demo(model,titles_df): print('hunt for red october') demo_d2v_title(model,titles_df, 'tt0099810')
电影 – “hunt for red october” 的前10部相似电影的输出
id_titles similarity title release_year0 tt0105112 0.541722 Patriot Games 1992.01 tt0267626 0.524941 K19: The Widowmaker 2002.02 tt0112740 0.496758 Crimson Tide 1995.03 tt0052151 0.471951 Run Silent Run Deep 1958.04 tt1922685 0.464007 Phantom 2013.05 tt0164184 0.462187 The Sum of All Fears 2002.06 tt0058962 0.459588 The Bedford Incident 1965.07 tt0109444 0.456760 Clear and Present Danger 1994.08 tt0063121 0.455807 Ice Station Zebra 1968.09 tt0146309 0.452572 Thirteen Days 2001.0
从输出中可以看到,我仍然得到了旧电影。请帮助我解决这个问题。提前感谢。
回答:
Doc2Vec
只知道文本相似性;它没有其他字段的概念。
因此,如果您想根据文本相似性之外的某些标准来筛选匹配结果,这些标准仅在Doc2Vec
模型外部表示,您需要在单独的步骤中进行操作。
所以,您可以使用.most_similar()
,并设置topn=len(model.docvecs)
参数 – 以获取所有排名的电影。然后,根据年份与您期望的年份相差过大的电影筛选结果集。最后,将结果集修剪到您真正想要的前N个电影。