6.1 KiB
6.1 KiB
广场作品排序推荐算法说明
📊 当前排序算法(简单版)
1. 最新排序 (latest)
ORDER BY pw.create_time DESC
- 逻辑: 按发布时间倒序
- 优点: 简单直接,新作品优先展示
- 缺点: 忽略作品质量,优质老作品难以被发现
2. 热门排序 (hot)
ORDER BY pw.like_count DESC, pw.create_time DESC
- 逻辑: 先按点赞数倒序,再按时间倒序
- 优点: 高质量作品排前面
- 缺点:
- 老作品积累点赞多,新作品难出头
- 没有时间衰减,不符合"热度"概念
- 只考虑点赞,忽略浏览、评论等互动
🚀 优化方案:智能推荐算法
方案一:时间衰减热度算法(推荐)
热度公式
热度分 = (点赞权重 × 点赞数 + 浏览权重 × 浏览数) / (发布时间距今小时数 + 2)^衰减系数
参数设置:
- 点赞权重: 10
- 浏览权重: 1
- 衰减系数: 1.5
- 时间基数: 2 (避免除零,新作品有初始优势)
示例计算:
作品A: 100赞, 1000浏览, 发布24小时
热度 = (10×100 + 1×1000) / (24 + 2)^1.5 = 2000 / 132.3 ≈ 15.1
作品B: 50赞, 500浏览, 发布2小时
热度 = (10×50 + 1×500) / (2 + 2)^1.5 = 1000 / 8 = 125
作品B虽然数据少,但因为新鲜度高,热度分更高!
SQL实现
SELECT pw.*,
(10 * pw.like_count + 1 * pw.view_count) /
POW(TIMESTAMPDIFF(HOUR, pw.create_time, NOW()) + 2, 1.5) as hot_score
FROM plaza_work pw
WHERE pw.status = 'published' AND pw.audit_status = 'approved'
ORDER BY hot_score DESC
方案二:威尔逊得分算法(适合评分系统)
如果未来加入评分功能,可使用威尔逊得分:
威尔逊下界 = (p + z²/2n - z × √(p(1-p)/n + z²/4n²)) / (1 + z²/n)
其中:
- p = 好评率 (点赞数 / (点赞数 + 踩数))
- n = 总投票数
- z = 置信度系数 (95%置信度时 z=1.96)
方案三:多维度评分算法
综合评分公式
总分 = 质量分 × 40% + 热度分 × 30% + 新鲜度分 × 20% + 互动分 × 10%
各维度计算:
-
质量分 (0-100):
质量分 = MIN(点赞率 × 100, 100) 点赞率 = 点赞数 / MAX(浏览数, 1) -
热度分 (0-100):
热度分 = MIN((点赞数 × 10 + 浏览数) / 平台平均热度 × 50, 100) -
新鲜度分 (0-100):
新鲜度分 = MAX(100 - 发布小时数 × 2, 0) -
互动分 (0-100):
互动分 = MIN((点赞数 + 评论数 × 3) × 2, 100)
🎯 推荐的实施方案
第一阶段:实现时间衰减热度算法
修改 PlazaWorkMapper.java:
@Select("<script>" +
"SELECT pw.*, u.nickname, u.avatar_url, " +
" <choose>" +
" <when test='sortBy == \"hot\"'>" +
" (10 * pw.like_count + 1 * pw.view_count) / " +
" POW(TIMESTAMPDIFF(HOUR, pw.create_time, NOW()) + 2, 1.5) as score " +
" </when>" +
" <otherwise>" +
" UNIX_TIMESTAMP(pw.create_time) as score " +
" </otherwise>" +
" </choose>" +
"FROM plaza_work pw " +
"LEFT JOIN user u ON pw.user_id = u.id " +
"WHERE pw.status = 'published' AND pw.audit_status = 'approved' " +
" AND pw.is_public = 1 AND pw.is_deleted = 0 " +
"<if test='taskType != null and taskType != \"\"'>" +
" AND pw.task_type = #{taskType} " +
"</if>" +
"ORDER BY score DESC " +
"LIMIT #{offset}, #{size}" +
"</script>")
List<Map<String, Object>> findPublicWorksList(
@Param("taskType") String taskType,
@Param("sortBy") String sortBy,
@Param("offset") int offset,
@Param("size") int size
);
第二阶段:添加智能推荐排序
增加新的排序方式 recommend:
// DTO中添加
public enum SortType {
LATEST, // 最新
HOT, // 热门(时间衰减)
RECOMMEND, // 智能推荐(多维度)
QUALITY // 高质量(点赞率)
}
第三阶段:个性化推荐
基于用户历史行为(浏览、点赞的作品类型)推荐相似作品:
- 统计用户最喜欢的任务类型(task_type)
- 统计用户最喜欢的模型(model_name)
- 提取用户点赞作品的标签
- 计算作品与用户偏好的匹配度
📝 实施建议
立即实施(基础优化)
✅ 实现时间衰减热度算法
✅ 添加高质量排序(按点赞率)
✅ 优化数据库索引
短期计划(1-2周)
🔄 添加多维度评分算法
🔄 实现推荐排序
🔄 添加排序参数配置化
长期计划(1-2个月)
⏳ 个性化推荐系统
⏳ 机器学习推荐模型
⏳ A/B测试不同算法效果
🔧 审核接口补充说明
当前审核接口功能
- ✅ 查询待审核列表
- ✅ 单个审核
- ✅ 批量审核
- ✅ 审核统计
- ✅ 审核历史
可能需要的补充接口
1. 撤销审核(管理员误操作)
POST /admin/plaza/audit/revoke
{
"workNo": "WORK-xxx",
"reason": "误操作,需要重新审核"
}
2. 审核详情查询(含完整上下文)
GET /admin/plaza/audit/detail/{workNo}
// 返回:作品信息 + 作者信息 + 历史审核记录
3. 快捷审核(一键通过前N个)
POST /admin/plaza/audit/quick-approve
{
"count": 10, // 通过最早的10个待审核作品
"taskType": "text_to_image" // 可选:指定类型
}
4. 违规关键词检测(AI辅助审核)
GET /admin/plaza/audit/keyword-check/{workNo}
// 返回:敏感词检测结果,辅助人工审核
5. 审核员工作量统计
GET /admin/plaza/audit/admin-stats?adminId=1&startTime=xxx&endTime=xxx
// 返回:某审核员的审核数量、通过率等
💡 是否需要补充以下功能?
请告诉我您需要:
- 优化排序算法 - 实现时间衰减热度算法?
- 补充审核接口 - 需要哪些额外的审核功能?
- 个性化推荐 - 是否需要基于用户行为的推荐?
- 违规检测 - 是否需要AI辅助审核(敏感词过滤)?
我可以立即为您实现!