如何处理电影推荐中的发行年份差异

How to handle release year difference in movie recommendation

我参与了电影推荐项目。我们使用 gensim 开发了一个 doc2vec 模型。 如果需要,您可以查看 gensim 文档。 https://radimrehurek.com/gensim/models/keyedvectors.html#gensim.models.keyedvectors.WordEmbeddingsKeyedVectors.most_similar

训练了模型,当我根据演员阵容为一部电影选出前 10 部相似的电影时,它让老电影回归 release_yr 为(1960 年、1950 年,...)。所以我尝试将 release_yr 作为 gensim 模型的参数包含在内,但它仍然给我看老电影。我该如何解决这个 release_yr 差异?当我看到电影的前 10 名推荐时,我需要那些 release_yr 差异较小的电影(比如过去 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、标题、release_year、演员、导演、作家、文档)

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')

前 10 部类似电影的输出 - "hunt for red october"

   id_titles    similarity               title             release_year
0  tt0105112    0.541722             Patriot Games           1992.0
1  tt0267626    0.524941       K19: The Widowmaker           2002.0
2  tt0112740    0.496758              Crimson Tide           1995.0
3  tt0052151    0.471951       Run Silent Run Deep           1958.0
4  tt1922685    0.464007                   Phantom           2013.0
5  tt0164184    0.462187      The Sum of All Fears           2002.0
6  tt0058962    0.459588      The Bedford Incident           1965.0
7  tt0109444    0.456760  Clear and Present Danger           1994.0
8  tt0063121    0.455807         Ice Station Zebra           1968.0
9  tt0146309    0.452572             Thirteen Days           2001.0

你可以从输出中看到我仍在获取旧电影。请帮我解决这个问题。 提前致谢。

Doc2Vec 只知道文本相似度;它没有其他领域的想法。

因此,如果您想根据文本相似性以外的某些标准丢弃匹配项,这仅在 Doc2Vec 模型外部表示,则必须在单独的步骤中执行此操作。

因此,您可以使用带有 topn=len(model.docvecs) 参数的 .most_similar() - 返回 all 电影,排名。然后,通过丢弃任何年份与所需年份相差太远的结果集来过滤该结果集。然后,trim 将结果集设置为您真正想要的前 N ​​个。