基于标签Tags实现相关内容推荐的方法代码

分类:实用代码 时间:2021-08-26 21:52 浏览:0 评论:0
0

一、取出所有文章的tags,并组成数组

public function getAllGroupByArticleId(){
    //缓存查询数据,因为这个是全表数据,而且不更新文章不会变化,便是每次推荐都要从数据库里获取一次数据,对性能肯定会有影响,所以做个缓存。
    if($cache = CacheHelper::getCache()){
        return $cache;
    }
    $query_result = $this->query('select articleid, GROUP_CONCAT(tagid) as tags from tag_map GROUP BY articleid');
    $result = [];
    foreach($query_result as $key => $value){
        //用articleid 做key ,值是该id下的所有tagID数组。
        $result[$value['articleid']] = explode(",",$value['tags']);
    }
        CacheHelper::setCache($result, 86400);
    return $result;
}

二、利用返回结果,计算相似度,返回相关ID

/**
     * [更据指定文章返回相似的文章推荐]
     * @param  $articleid 指定的文章ID
     * @param  $top       要返回的推荐条数
     * @return Array      推荐条目数组
     */
function getArticleRecommend($articleid, $top = 5){
    if($cache = CacheHelper::getCache()){
        return $cache;
    }
    try{
        $articleid = intval($articleid);
        $m = new TagMapModel();
        $all_tags = $m->getAllGroupByArticleId();//调用上面的函数返回所有文章的tags
        $finded = $all_tags[$articleid];//因为上面是包含所有文章了,所以肯定包含了当前文章。
        unset($all_tags[$articleid]);//把当前文章从数组中删除,不然自己和自己肯定是相似度最高了。
        $jaccard_arr = []; //用于存相似度
    foreach ($all_tags as $key => $value) {
        $intersect =array_intersect($finded, $value); //计算交集
        $union = array_unique(array_merge($finded, $value)); //计算并集
        $jaccard_arr[$key] = (float)(count($intersect) / count($union));
    }
    arsort($jaccard_arr); //按相似度排序,最相似的排最前面
    $jaccard_keys = array_keys($jaccard_arr);//由于数组的key就是文章id,所以这里把key取出来就可以了
    array_splice($jaccard_keys, $top);//获取前N条推荐
    //到这里我们就已经得到了,最相似N篇文章的ID了,接下去的工作就是通过这几个ID,从数据库里把相关信息,查询出来就可以了
    $articleModels = new \Api\Model\ArticleModel();
    $recommendArticles = $articleModels->getRecommendByTag($jaccard_keys);
    CacheHelper::setCache($recommendArticles, 604800); //缓存7天
        return $recommendArticles;
        } catch (\Exception $e) {
        throw new \Exception("获取推荐文章错误");
        }
}


1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 实用代码 > 基于标签Tags实现相关内容推荐的方法代码

用户评论