如何处理电影推荐中的发行年份差异
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 个。
我参与了电影推荐项目。我们使用 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 个。