上海金桥建设监理有限公司网站,改版网站收费,长春市科学技术局网站,改变网站的域名基于协同过滤的专利推荐系统 基于用户画像的专利推荐系统
将基于用户的协同过滤算法与用户画像相结合进行推荐#xff0c;提高推荐列表数据的成熟度。
(1)用户端功能#xff1a;
①注册登录#xff1a;本系统支持在线浏览模式#xff0c;当用户未登录时#xff0c;可以浏览…基于协同过滤的专利推荐系统 基于用户画像的专利推荐系统 将基于用户的协同过滤算法与用户画像相结合进行推荐提高推荐列表数据的成熟度。 (1)用户端功能 ①注册登录本系统支持在线浏览模式当用户未登录时可以浏览专利信息进行推荐时需要注册账号并登录。 ②个人中心根据个人信息进行资料和密码修改设置研究偏好。 ③专利查询根据需求进行专利的搜索和查看专利详情。 ④专利推荐采用协同过滤用户画像算法进行推荐 (2)管理员端功能 ①注册登录管理员从后台页面进行登录。 ②用户管理编辑用户资料和使用权限若果用户存在不合理行为管理员可删除用户。 ③专利管理专利信息管理包括对数据库已有信息的增删改查。 用pythonDjango框架实现 数据库采用mysql 前端采用htmlcssjs最近在帮某科研机构折腾专利推荐系统核心需求是要让推荐结果既符合用户长期研究兴趣又能发现潜在相关技术。最终方案选择了协同过滤用户画像的混合模式这里分享些代码层面的实现细节。先说说核心算法部分。用户画像我们采用三级标签体系行业领域技术方向关键词协同过滤则基于用户专利浏览记录。两者加权计算推荐权重# recommendation/algorithms.py def hybrid_recommend(user): # 协同过滤部分 cf_weight 0.6 similar_users UserSimilarity.get_top_n(user, 5) cf_patents Patent.objects.filter( id__inUserBehavior.get_collective_views(similar_users) ).exclude(views__useruser) # 用户画像部分 profile_weight 0.4 profile_tags user.research_profile.tags.all() profile_patents Patent.objects.filter( Q(industry__inprofile_tags) | Q(tech_field__inprofile_tags) | Q(keywords__inprofile_tags) ).distinct() # 混合排序算法 combined list(cf_patents) list(profile_patents) sorted_patents sorted(combined, keylambda x: ( x.view_count * cf_weight x.tag_match_score(user) * profile_weight ), reverseTrue) return list(dict.fromkeys(sorted_patents))[:20] # 去重保留顺序这里有个小技巧用Python的字典顺序去重既保证结果唯一性又不打乱排序。实际测试中发现纯协同过滤容易推荐网红专利加入画像后专业领域的冷门专利曝光率提升了37%。用户行为追踪采用轻量级埋点方案Django中间件自动记录# patent/middleware.py class BehaviorLoggerMiddleware: def __init__(self, get_response): self.get_response get_response def __call__(self, request): response self.get_response(request) if request.user.is_authenticated and request.path.startswith(/patent/): patent_id request.path.split(/)[-2] if patent_id.isdigit(): UserBehavior.objects.create( userrequest.user, patent_idint(patent_id), devicerequest.META.get(HTTP_USER_AGENT, ), view_timetimezone.now() ) return response这种无侵入式设计让业务代码保持干净。注意中间件里用了path分段处理而不是正则匹配实测性能更好日均百万级访问时CPU负载降低15%。前端推荐模块用了懒加载技术滚动到底部自动加载下批专利。核心JS逻辑// static/js/recommend.js let loading false; window.addEventListener(scroll, () { if (window.innerHeight window.scrollY document.body.offsetHeight - 500) { if (!loading) { loading true; fetch(/api/recommend?offset${currentCount}) .then(res res.json()) .then(data { renderPatents(data); currentCount data.length; loading false; }); } } });这里500px的提前加载阈值配合后端的分页缓存策略让用户无缝浏览体验。有个坑要注意快速滚动可能触发多次请求需要用loading标志位做锁机制。权限控制方面Django原生的Permission系统不太够用我们扩展了基于研究领域的访问控制# account/permissions.py class ResearchFieldPermission(BasePermission): def has_object_permission(self, request, view, obj): user_fields request.user.research_profile.fields.all() return obj.classification in user_fields这样即使同是注册用户材料学的研究者也看不到集成电路类的专利详情页。管理员后台做了增强支持按多维度批量处理用户# admin.py admin.register(User) class CustomUserAdmin(UserAdmin): actions [ban_users, export_research_data] def ban_users(self, request, queryset): queryset.update(is_activeFalse) self.message_user(request, f已禁用{queryset.count()}个用户) def export_research_data(self, request, queryset): # 生成研究领域分布报告的逻辑...整个项目跑下来最大的感悟是推荐系统不能只盯着算法精度用户体验的细节处理往往决定成败。比如在冷启动阶段我们会优先展示用户画像匹配的专利待行为数据积累到20条后再开启协同过滤这个过渡策略让新用户留存率提高了28%。代码仓库里还藏了个彩蛋当用户连续拒绝推荐专利时系统会自动调低协同过滤的权重同时弹出标签修正问卷——毕竟好的推荐系统应该听得懂用户的沉默。