• JavaWeb_(视频网站)_七、推荐模块1


    推荐算法

      基于内容的推荐算法

      基于概率论,用户喜欢一个视频概率和不喜欢一个视频概率,工具类RecommendByContentUtils.java

    package com.Gary.betobe.recommend;
    
    import java.util.Set;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import com.Gary.betobe.domain.Tag;
    import com.Gary.betobe.domain.User;
    import com.Gary.betobe.domain.Video;
    import com.Gary.betobe.service.TagService;
    import com.Gary.betobe.service.UserService;
    
    @Component
    public class RecommendByContentUtils {
    
        @Autowired
        private TagService tagService;
        
        @Autowired
        private UserService userService;
    
        //喜欢
        
        // 用户喜欢一个视频的概率
        public Double PUserLikeVideo(String userId)
        {
            //用户喜欢视频个数/(用户喜欢视频个数+用户不喜欢视频个数)(视频的总个数)
            //拿到用户
            User user = userService.findUserById(userId);
            int likeVideo = user.getAgreeVideos().size();
            int dislikeVideo = user.getDisagreeVideos().size();
            if(likeVideo+dislikeVideo == 0 || likeVideo == 0)
            {
                return 0.5D;
            }
            else
            {
                return 1.0 * likeVideo / (likeVideo + dislikeVideo);
            }
        }
        
        // 获得用户喜欢一个标签的概率 p(Gary|喜欢)
        public Double PUserTargetLike(String userId,String target)
        {
            //套公式
            Double answer = 1.0*((CountTermsUserLike(userId,target)) + 1)
                        /(AllTermsUserLikeCount(userId) + getAllTagsCount());
            //answer = 1.0*(CountTerms+1)/AllTerms + |V|
                
            return answer;
        }
        
        //|V|
        private Long getAllTagsCount() {
            //select count(*) from tag
            Long size = (long) tagService.findAllTag().size();
            return size;
        }
        
        // AllTerms返回这c类文档中所有的词数量,
        private Long AllTermsUserLikeCount(String userId) {
            
            return userLikeDocsCount(userId);
        }
        
        // CountTerms返回词i在c类文档中出现的次数
        private Long CountTermsUserLike(String userId, String target) {
            
            return targetInLikeDocsCount(userId,target);
        }
        
        //返回改用户喜欢的文档中所有的词的数量(标签)
        public Long userLikeDocsCount(String userId)
        {
            
            Long target = 0L;
            //用户->喜欢的视频->标签
            //拿到用户
            User user = userService.findUserById(userId);
            //拿到用户下面的所有喜欢的视频
            Set<Video> videos = user.getAgreeVideos();
            //遍历视频
            for(Video video : videos)
            {
                Set<Tag> tags = video.getVideoTags();
                //重复的也要计算
                for(Tag tag :tags)
                {
                    target++;
                }
            }
            
            return target;
        }
        
        // 返回该字符串在用户喜欢的文档中出现的次数
        public Long targetInLikeDocsCount(String userId, String target)
        {
            Long count = 0L;
            //拿到用户
            User user = userService.findUserById(userId);
            // 拿到用户喜欢的视频的集合
            Set<Video> videos = user.getAgreeVideos();
            // 遍历集合,拿到用户喜欢的视频中所有的标签
            for(Video video:videos)
            {
                Set<Tag> tags = video.getVideoTags();
                // 如果标签中的tag和传入的target相同,计数器++
                for(Tag tag : tags)
                {
                    if(tag.getTag().toUpperCase().equals(target.toUpperCase()))
                    {
                        count++;
                        continue;
                    }
                }
                
            }
            
            return count;
            
        }
            
        //不喜欢
            
        //用户不喜欢一个标签的概率P(Gary|不喜欢)
        public Double PUserTargetDislike(String userId,String target)
        {
            Double answer = 1.0* (CountTermsUserDislike(userId,target) + 1)
                    /(AllTermsUserDislikeCount(userId) + getAllTagsCount());
            
            //answer = 1.0*(CountTerms+1)/AllTerms + |V|
            return answer;
        }
        
        // AllTerms返回这c类文档中所有的词数量,
        public Long AllTermsUserDislikeCount(String userId) {
            // 不喜欢的文档中所有的词数量
            return userDislikeDocsCount(userId);
        }
        
        // CountTerms返回词i在c类文档中出现的次数
        public Long CountTermsUserDislike(String userId,String target) {
            // target在不喜欢的文档中出现的次数
            
            return targetInDislikeDocsCount(userId,target);
        }
        // 返回该字符串target在用户不喜欢的文档中出现的次数
            public Long targetInDislikeDocsCount(String userId, String target) {
                Long count = 0L;
                // 拿到用户
                User user = userService.findUserById(userId);
                // 拿到用户不喜欢的视频的集合
                Set<Video> videos = user.getDisagreeVideos();
                // 遍历集合,拿到用户不喜欢的视频中所有的标签
                for(Video video : videos)
                {
                    Set<Tag> tags = video.getVideoTags();
                    // 遍历所有标签
                    for(Tag tag : tags)
                    {
                        // 如果标签中的tag和传入的target相同,计数器++
                        if(tag.getTag().toUpperCase().equals(target.toUpperCase()))
                        {
                            count++;
                            continue;
                        }
                    }
                    
                }
                return count;
            }
    
            // 不喜欢的文档中所有的词数量
            public Long userDislikeDocsCount(String userId) {
                
                Long target = 0L;
                // 拿到用户
                User user = userService.findUserById(userId);
                // 拿到用户下面的所有不喜欢的视频
                Set<Video> videos = user.getDisagreeVideos();
                // 遍历视频
                for(Video video : videos)
                {
                    Set<Tag> tags = video.getVideoTags();
                    // 遍历视频下的标签
                    for(Tag tag:tags)
                    {
                        target++;
                    }
                }
                
                return target;
            }
            
    }
    RecommendByContentUtils.java
  • 相关阅读:
    Cesium 中的图形变换:局部平移、缩放、旋转思路及代码实现
    Cesium中的图形技术:Fabric —— 材质JSON规范
    【Cesium 历史博客】多视锥体优化:使用对数深度缓存
    Cesium中的图形技术:Primitive API 高级
    Cesium中的图形技术:Primitive API 简介
    【Cesium 历史博客】Cesium 中的图形技术:顶点压缩
    【Cesium 历史博客】Cesium 中的图形技术:图形结构
    【Cesium 历史博客】Cesium 中的图形技术:渲染体系结构
    Excel筛选后复制单元格提示无法对合并单元格执行操作解决方法
    plsql导入sql脚本时提示逗号等字符错误或遗失不匹配问题处理方法
  • 原文地址:https://www.cnblogs.com/1138720556Gary/p/12164440.html
Copyright © 2020-2023  润新知