CoolFace
Apppublic

Shuyi/movie-content-filtering

sourceHugging Faceupdated 4mo agoView on Hugging Face
0likes
App README

基于内容的电影推荐(Gradio 6 现代版)

机器学习课程演示项目:用 MovieLens 100K 的类型特征做基于内容的电影推荐,按 Gradio 6.x 新范式构建。

  • 数据:MovieLens 100K(movie_lens_100K_demo/u.item,1682 部电影)
  • 特征:19 个类型(genre)0/1 列
  • 算法:余弦相似度,返回最相似的 k 部电影

用到的 Gradio 6 新能力

特性在本应用中的体现
gr.HTML 模板组件推荐结果用 html_template(Handlebars 循环)+ css_template(自动 scoped CSS)渲染为卡片 UI:排名徽章、类型 chips、相似度渐变条
mcp_server=Truerecommend 函数自动暴露为 MCP 工具,Claude 等 AI Agent 可直接调用
gr.api()注册干净的 REST 端点 /recommend,支持电影名模糊匹配
@gr.cache缓存确定性推荐函数,重复查询零计算
实时响应gr.on([demo.load, movie.change, k.change], ...),无 Submit 按钮
api_visibility="private"UI 内部更新事件不污染对外 API 文档
launch(theme=..., css=...)Gradio 6 规范:主题/样式参数移到 launch();Ocean 主题
pwa=True可安装为桌面/移动应用
footer_links页脚仅保留 API 和 Gradio 标识

本地运行

bash
pip install -r requirements.txt   # gradio[mcp]>=6.16
python app.py

浏览器访问 <http://127.0.0.1:7860>。

作为 MCP 服务使用

启动后 MCP 端点为 http://127.0.0.1:7860/gradio_api/mcp/。 在 Claude Code 等 MCP 客户端中配置:

json
{
  "mcpServers": {
    "movie-recommender": {
      "url": "http://127.0.0.1:7860/gradio_api/mcp/"
    }
  }
}

之后 Agent 即可直接调用 recommend(movie="Star Wars", k=5)

已知问题(为什么结果区不用 gr.Dataframe)

Gradio 6.16.0 的 gr.Dataframe 存在前端 bug:事件更新只会 patch 单元格内容,行数被冻结在首次渲染的值(k 从 5 调到 10 时表格始终 5 行;已用最小用例确认与触发组件、Styler、 show_progress 均无关)。本应用改用 gr.HTML 模板渲染结果, 既绕开该 bug,视觉效果也更好。若未来版本修复,可重新评估。

文件结构

content-filtering-v6/
├── app.py                  # 数据加载、相似度、卡片模板、UI、API/MCP
├── requirements.txt
└── movie_lens_100K_demo/
    ├── u.item              # 电影元数据 + 类型特征(本应用使用)
    └── u.data              # 评分数据(未使用,保留备扩展)

部署到 Hugging Face Spaces

app.py + requirements.txt 即 Spaces 标准结构,新建 Gradio 类型 Space 后上传整个目录即可;MCP 端点在 Spaces 上同样可用。