Как справиться с разницей в год выпуска в рекомендации mov ie - PullRequest
0 голосов
/ 07 апреля 2020

Я был частью проекта рекомендации mov ie. Мы разработали модель doc2ve c с использованием Gensim. Вы можете взглянуть на документацию Gensim, если это необходимо. https://radimrehurek.com/gensim/models/keyedvectors.html#gensim .models. 1960, 1950, ...). Поэтому я попытался включить release_yr в качестве параметра для модели gensim, но все равно он показывает мне старые фильмы. Как я могу решить эту разницу release_yr? Когда я вижу топ-10 рекомендаций для фильма, мне нужны те фильмы, чья разница в release_yr меньше (например, фильмы последних 10 лет не более того). Как я могу это сделать?

код для doc2ve c модель

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

заголовки_df dataframe содержит столбцы (id_titles, title, release_year, актеры, режиссер, писатель, do c)

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 лучших похожих фильмов для фильма - «Охота за красным октябрем»

   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

Вы можете видеть из вывода, что я все еще получаю старые фильмы. Пожалуйста, помогите мне, как решить это. Заранее спасибо.

1 Ответ

0 голосов
/ 08 апреля 2020

Doc2Vec знает только текстовое сходство; у этого нет идеи других областей.

Таким образом, если вы хотите отбросить совпадения в соответствии с некоторыми критериями, отличными от сходства текста, которые представлены только вне модели Doc2Vec, вам придется сделать это на отдельном шаге.

Таким образом, вы можете использовать .most_similar() с параметром topn=len(model.docvecs) - чтобы вернуть все видеофильмы, ранжированные. Затем отфильтруйте этот набор результатов, отбросив любой, чей год слишком далек от желаемого. Затем обрежьте этот набор результатов до вершины N, которую вы действительно хотите.

...