基于内容和协同过滤混合推荐电影的 Python 算法,使用 LDA 提取主题词
下面是一个基于内容和协同过滤混合推荐电影的 Python 算法,使用 LDA 提取主题词。算法分为以下几个步骤:
- 导入必要的库
- 加载数据集
- 数据预处理
- 使用 LDA 提取电影的主题词
- 构建用户-电影评分矩阵
- 计算电影之间的相似度
- 实施混合推荐算法
- 测试算法
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
from sklearn.metrics.pairwise import cosine_similarity
# 1. 导入必要的库
# 2. 加载数据集
movies = pd.read_csv('movies.csv')
users = pd.read_csv('users.csv')
# 3. 数据预处理
# 处理电影类型字段
movies['genres'] = movies['genres'].str.split('|')
movies['genres'] = movies['genres'].fillna("").astype('str')
# 处理电影评论字段
movies['comments'] = movies['comments'].fillna("").astype('str')
# 处理地区字段(假设地区字段为region)
movies['region'] = movies['region'].fillna("").astype('str')
# 处理用户的电影评分数据
user_ratings = users[['userid', 'movieid', 'rating']]
# 4. 使用 LDA 提取电影的主题词
# 将电影评论字段转换为文本特征向量
vectorizer = CountVectorizer(stop_words='english')
X = vectorizer.fit_transform(movies['comments'])
# 使用 LDA 提取主题词
lda = LatentDirichletAllocation(n_components=10, random_state=42)
lda.fit(X)
# 获取主题词
feature_names = vectorizer.get_feature_names()
topics = []
for topic_idx, topic in enumerate(lda.components_):
topic_words = [feature_names[i] for i in topic.argsort()[:-10 - 1:-1]]
topics.append(topic_words)
# 将主题词添加到 movies 数据集中
movies['topics'] = [topics[i] for i in lda.transform(X).argmax(axis=1)]
# 5. 构建用户-电影评分矩阵
ratings_matrix = user_ratings.pivot(index='userid', columns='movieid', values='rating').fillna(0)
# 6. 计算电影之间的相似度
movie_similarity = cosine_similarity(ratings_matrix.T)
# 7. 实施混合推荐算法
def hybrid_recommendation(user_id, num_recommendations):
# 获取用户已评分的电影
user_movies = user_ratings[user_ratings['userid'] == user_id]['movieid'].tolist()
# 计算电影的相似度分数
scores = movie_similarity[movies[movies['movieid'].isin(user_movies)].index].sum(axis=0)
# 获取相似度最高的电影
similar_movies = sorted(list(enumerate(scores)), key=lambda x: x[1], reverse=True)
similar_movies = [movies.loc[i[0]] for i in similar_movies]
# 过滤掉用户已评分的电影
similar_movies = [movie for movie in similar_movies if movie['movieid'] not in user_movies]
# 获取与用户电影主题相关的电影
user_topics = set(movies[movies['movieid'].isin(user_movies)]['topics'].sum())
topic_movies = movies[movies['topics'].apply(lambda x: bool(set(x) & user_topics))]
# 合并电影推荐结果
recommendations = similar_movies + topic_movies
# 去除重复的电影
recommendations = pd.DataFrame(recommendations).drop_duplicates(subset='movieid')
return recommendations.head(num_recommendations)
# 8. 测试算法
user_id = 1
num_recommendations = 10
recommendations = hybrid_recommendation(user_id, num_recommendations)
print(recommendations)
请确保将数据集文件名和路径与代码中的文件名和路径匹配。此算法将基于用户的历史评分和电影的内容特征进行推荐。
原文地址: https://www.cveoy.top/t/topic/qfUl 著作权归作者所有。请勿转载和采集!