当前位置: 首页 > news >正文

浅谈AI落地 - 文章推荐 - 混合推荐模型

前言

曾在游戏世界挥洒创意,也曾在前端和后端的浪潮间穿梭,如今,而立的我仰望AI的璀璨星空,心潮澎湃,步履不停!愿你我皆乘风破浪,逐梦星辰!

项目介绍:个性化推荐系统

这个推荐系统项目旨在通过多种技术和方法提供 个性化的文章推荐,主要适用于文章类平台或信息服务平台。推荐系统结合了 深度协同过滤(NCF)增量学习(SGDRegressor),同时融合了 内容推荐(基于文章的关键词、情感分析、互动数据等特征)与 协同过滤 结果,以实现更加精准和个性化的推荐。

项目功能

  • 文章内容特征提取:通过 TF-IDF 提取文章关键词,利用 TextBlob 进行情感分析,并计算文章长度、阅读时间等特征。

  • 基于协同过滤的推荐:通过 深度协同过滤(NCF) 模型学习用户和文章之间的潜在关系,进行个性化推荐。

  • 增量学习:通过 SGDRegressor 实现实时学习和模型更新,使得推荐系统能够根据新数据进行增量更新。

  • 混合推荐:结合 基于内容的推荐协同过滤 结果,进一步优化推荐结果的准确性。

  • 分布式计算:使用 PySpark 对大规模用户行为数据进行分布式处理,提高系统的可扩展性。

项目架构

项目采用了模块化设计,代码划分为多个功能模块,方便维护和扩展。以下是项目的文件架构:

recommender_system/
│
├── data/
│   ├── __init__.py
│   ├── preprocess.py                # 数据预处理和特征工程
│   └── feature_engineering.py       # 提取文章特征,计算关键词、情感分析等
│
├── models/
│   ├── __init__.py
│   ├── ncf_model.py                # NCF模型定义(深度协同过滤)
│   ├── sgd_regressor.py            # 增量学习模型
│   └── hybrid_model.py             # 混合推荐模型
│
├── utils/
│   ├── __init__.py
│   ├── spark_utils.py              # PySpark相关的分布式计算辅助函数
│   └── logger.py                   # 日志记录功能
│
├── main.py                         # 主程序入口,执行推荐任务
├── config.py                       # 配置文件
└── requirements.txt                # 项目依赖包

文件与功能说明

1. data/ 文件夹

该文件夹用于存放所有与数据相关的操作,包括数据加载、预处理和特征提取。

  • preprocess.py

    • 负责加载用户行为数据和文章数据。

    • 函数:

      • load_user_data(file_path)

      • load_article_data(file_path)

  • feature_engineering.py

    • 提取文章的各种特征,包括关键词(TF-IDF)、情感分析、文章长度、互动数据等。

    • 函数:

      • extract_keywords(article_summaries)

      • get_sentiment(text)

      • get_article_length(article_summaries)

      • estimate_reading_time(article_lengths, average_reading_speed=300)

      • extract_article_features()

      • calculate_content_similarity(article_summaries)

2. models/ 文件夹

该文件夹用于存放所有与推荐模型相关的代码。

  • ncf_model.py

    • 定义 深度协同过滤(NCF) 模型。

    • 包含用户和物品的嵌入层、隐藏层和前向传播。

  • sgd_regressor.py

    • 定义 增量学习(SGDRegressor) 模型,用于实时更新用户评分预测。

    • 包含 fitpartial_fit 方法来处理增量学习。

  • hybrid_model.py

    • 实现 混合推荐 模型,结合了 NCFSGDRegressor 的预测结果,以及内容推荐结果。

    • 包含 hybrid_recommendation() 方法来计算最终的推荐分数。

3. utils/ 文件夹

该文件夹用于存放工具类,包含日志记录和 PySpark 分布式计算相关功能。

  • spark_utils.py

    • 提供与 PySpark 相关的工具方法,如创建 Spark 会话和计算用户平均评分。

    • 函数:

      • create_spark_session()

      • calculate_user_avg_rating(spark, user_data_df)

  • logger.py

    • 提供日志记录功能,方便调试和监控。

    • 函数:

      • setup_logger()

4. main.py
  • 主程序入口,执行推荐任务。

  • 加载数据,进行特征提取和模型训练,最终执行推荐计算。

  • 示例代码:

    • 加载数据并提取特征

    • 创建和训练模型

    • 调用混合推荐模型,获取推荐结果

5. config.py
  • 存储项目的配置文件,如数据路径、模型超参数等。

6. requirements.txt
  • 存储项目的依赖库,如 torchtransformerssklearnpyspark 等。


所有文件

data/preprocess.py
import pandas as pd# 读取用户行为数据和文章数据
def load_user_data(file_path):return pd.read_csv(file_path)def load_article_data(file_path):return pd.read_csv(file_path)
data/feature_engineering.py
import numpy as np
from textblob import TextBlob
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity# 提取文章的关键词
def extract_keywords(article_summaries):vectorizer = TfidfVectorizer(stop_words='english')tfidf_matrix = vectorizer.fit_transform(article_summaries)feature_names = vectorizer.get_feature_names_out()return tfidf_matrix, feature_names# 计算情感分析
def get_sentiment(text):sentiment = TextBlob(text).sentiment.polarityreturn sentiment# 计算文章长度
def get_article_length(article_summaries):return [len(summary.split()) for summary in article_summaries]# 估算文章的阅读时间
def estimate_reading_time(article_lengths, average_reading_speed=300):return [length / average_reading_speed for length in article_lengths]# 提取文章特征
def extract_article_features(article_summaries, article_engagement, article_multimedia, article_update_frequency):article_lengths = get_article_length(article_summaries)reading_times = estimate_reading_time(article_lengths)sentiments = [get_sentiment(summary) for summary in article_summaries]# Combine all features into one arrayextra_features = np.array([[sentiments[i], article_lengths[i], reading_times[i], article_multimedia[i], article_engagement['likes'][i], article_engagement['comments'][i], article_engagement['shares'][i], article_update_frequency[i]]for i in range(len(article_summaries))])return extra_features# 计算内容相似度
def calculate_content_similarity(article_summaries):vectorizer = TfidfVectorizer(stop_words='english')tfidf_matrix = vectorizer.fit_transform(article_summaries)similarity_matrix = cosine_similarity(tfidf_matrix)return similarity_matrix
models/ncf_model.py
import torch
import torch.nn as nnclass NCF(nn.Module):def __init__(self, n_users, n_articles, embedding_dim=10):super(NCF, self).__init__()self.user_embedding = nn.Embedding(n_users, embedding_dim)self.article_embedding = nn.Embedding(n_articles, embedding_dim)self.fc1 = nn.Linear(embedding_dim * 2 + 8, 128)self.fc2 = nn.Linear(128, 64)self.fc3 = nn.Linear(64, 1)def forward(self, user_id, article_id, extra_features):user_embed = self.user_embedding(user_id)article_embed = self.article_embedding(article_id)x = torch.cat([user_embed, article_embed, extra_features], dim=1)x = torch.relu(self.fc1(x))x = torch.relu(self.fc2(x))return self.fc3(x)
models/sgd_regressor.py
from sklearn.linear_model import SGDRegressor
import numpy as npclass SGDModel:def __init__(self):self.model = SGDRegressor()def fit(self, user_article_data, ratings):self.model.fit(user_article_data, ratings)def partial_fit(self, user_article_data, ratings):self.model.partial_fit(user_article_data, ratings)def predict(self, user_article_data):return self.model.predict(user_article_data)
models/hybrid_model.py
from .ncf_model import NCF
from .sgd_regressor import SGDModelclass HybridRecommendation:def __init__(self, n_users, n_articles, ncf_model, sgd_model, alpha=0.7):self.ncf_model = ncf_modelself.sgd_model = sgd_modelself.alpha = alphadef hybrid_recommendation(self, user_id, article_id, content_similarity, extra_features, user_avg_ratings):cf_score = self.ncf_model(user_id, article_id, extra_features)content_score = content_similarity[article_id, article_id]sgd_score = self.sgd_model.predict([[user_id, article_id]])[0]user_avg_rating = user_avg_ratings.get(user_id, 3.0)adjusted_cf_score = cf_score + (user_avg_rating - 3.0)final_score = self.alpha * adjusted_cf_score + (1 - self.alpha) * content_score + sgd_scorereturn final_score
main.py
from data.feature_engineering import extract_article_features, calculate_content_similarity
from models.ncf_model import NCF
from models.sgd_regressor import SGDModel
from models.hybrid_model import HybridRecommendation# 假设我们已经加载了文章数据和用户行为数据
article_summaries = ["Learn the basics of Python programming for machine learning and AI.","Understanding neural networks and how they power AI applications.","A beginner's guide to artificial intelligence and its impact on society.","Data science is the key to unlocking value from big data."
]
article_engagement = {'likes': [150, 200, 180, 220],'comments': [30, 40, 35, 50],'shares': [20, 15, 25, 30]
}
article_multimedia = [1, 0, 1, 0]
article_update_frequency = [3, 5, 2, 6]# 提取文章特征
extra_features = extract_article_features(article_summaries, article_engagement, article_multimedia, article_update_frequency)# 计算内容相似度
content_similarity = calculate_content_similarity(article_summaries)# 初始化模型
n_users = 4  # 假设有4个用户
n_articles = 4  # 假设有4篇文章
ncf_model = NCF(n_users, n_articles, embedding_dim=10)
sgd_model = SGDModel()# 训练增量学习模型(假设我们已经有用户行为数据)
sgd_model.fit(user_data[['user_id', 'article_id']].values, user_data['rating'].values)# 创建混合推荐模型
hybrid_model = HybridRecommendation(n_users, n_articles, ncf_model, sgd_model, alpha=0.7)# 假设每个用户的平均评分
user_avg_ratings = {0: 4.5, 1: 4.0, 2: 4.2, 3: 3.8}# 测试混合推荐模型
user_id = 0  # 假设用户1
article_id = 1  # 假设文章2final_score = hybrid_model.hybrid_recommendation(user_id, article_id, content_similarity, extra_features, user_avg_ratings)
print(f"Final recommendation score for user {user_id} and article {article_id}: {final_score}")

总结

这个推荐系统项目使用了 深度协同过滤(NCF)增量学习(SGDRegressor)内容推荐(基于 TF-IDF情感分析)、分布式计算(PySpark),并结合了 混合推荐 模型来提高推荐质量。通过模块化设计,代码的可维护性和可扩展性得到了很好的保证,方便日后的扩展和修改。


http://www.mrgr.cn/news/97161.html

相关文章:

  • 【NLP 53、投机采样加速推理】
  • MySQL:库表操作
  • pat学习笔记
  • 【MySQL】01.MySQL环境安装
  • OpenVLA-OFT——微调VLA的三大关键设计:支持动作分块的并行解码、连续动作表示以及L1回归目标
  • 操作系统知识点(一)
  • [C++面试] new、delete相关面试点
  • 论文阅读笔记:Denoising Diffusion Implicit Models (4)
  • 从代码上深入学习GraphRag
  • YOLO 获取 COCO 指标终极指南 | 从标签转换到 COCOAPI 评估 (训练/验证) 全覆盖【B 站教程详解】
  • hi3516cv610通过menuconfig关闭的宏记录
  • 欧几里得算法求最大公约数、最小公倍数
  • UBUNTU编译datalink
  • 大模型学习四:‌DeepSeek Janus-Pro 多模态理解和生成模型 本地部署指南(折腾版)
  • 列表与列表项
  • 蓝桥杯 小明的背包1 小兰的神秘礼物 01背包问题 模板 C++
  • [GN] Python3基本数据类型 -- 与C的差异
  • 7.训练篇5-毕设
  • Koordinator-NodeInfoCollector
  • 优选算法的妙思之流:分治——快排专题