标签如何实现内容推荐

分类:编程技术 时间:2024-02-20 15:18 浏览:0 评论:0
0
小编跟大家分享一下Tags是如何实现内容推荐的。相信大多数人对此还不是很了解,所以分享这篇文章供大家参考。希望您读完这篇文章后能有所收获。咱们一起去吧。查出!

原来,为了简单方便,我的小网站上的文章页面的相关内容推荐都是从数据库中随机抽取数据来填充一个列表,所以不存在相关性全部,并且没有办法引导用户访问。推荐内容。

算法选择

我们如何推荐相似的内容?由于小型网站还是运行在虚拟主机上(是的,连完全可控的服务器都没有),所以能想到的办法并不多,条件也仅限于使用PHP+MySql。所以我想到的办法就是利用Tags来匹配相似的文章进行推荐。如果两篇文章的TAGS相似

例如:TAG文章 A 的 S 为:[A,B,C,D,E]
文章 B 的 TAGS 为:[A,D,E ,F,G]
文章 C 的 TAGS 为: [C,H,I,J,K]

通过我们的眼睛,我们很容易发现文章B和文章A更相似。 ,因为它们有三个相同的关键词:[A,D,E],如何用计算机判断它们的相似度?这里我们使用杰卡德相似度最基本的应用来计算它们的相似度

杰卡德相似度

给定两个集合A和B ,杰卡德系数定义为A与B的交集大小以及A与B B的并集大小之比,定义如下:

文章A与文章B的交集为[A,D,E],大小为3,并集为[A,B,C,D, E, F, G],大小为7,3/7=0.4285...

文章A和文章C的交集为[C],大小为1,并集为[A,B,C,D,E,H,I,J,K],大小为9 ,1/9=0.11111...

这样可以得出A、B两篇文章比较重要或者比文章A和C相似度高,通过这个算法,计算机可以判断两篇文章的相似度。

具体推荐思路

给定一篇文章,获取该文章的关键词TAGS,然后利用上述算法比较数据库中所有文章的相似度,得到最相似的那些。推荐N篇文章。

实现过程

获取第一个TAGS

文章的TAGS是通过TF-IDF算法从文章中的高频词中提取出来的,并且选择N个词作为TAGS,对于中文文章来说,还涉及到一个中文分词的问题,因为是虚拟主机这一步的工作,我是用Python(为什么用Python,jieba分词,太好吃了)来写的本地一个程序完成所有文章的分词、词频统计、生成TAGS,并写回服务器数据库。由于这篇文章是关于推荐a算法、分词和建立TAGS部分不再详细讨论,不同的系统建立TAGS的方式也不同。

第二个TAGS的存储

创建两个表来存储TAGS
标签,并存储所有标签的名称

+--------+------------+-----+-----+-------- --- +--------+|领域 |类型 |空|关键|默认 |额外 |+--------+------------+--- ---+-----+---------+--- ----+|标签|文字|是 | |空| ||计数|大整数(20) |是 | |空| ||标签|整数(11)|否 |优先原则 | 0 | |+--------+------------+------+--- --+---------+---- ---+

tag_map建立tag和article之间的映射关系。

+------------+------------+-------- +-----+---------+--------+|领域 |类型 |空|关键|默认 |额外 |+------------ +----------------+------+-----+----- ----+--------+|编号 | bigint( 20 ) |否 |优先原则 | 0 | ||文章编号 |大整数(20) |是 | |空| ||标签|整数(11)|是| |空| |+------------+----------------+----------------+-----+------ ---+--------+

tag_map中存储的数据类似如下:

+- ---+ -----------+-----+|编号 |文章编号 | tagid |+----+------------+----- --+| 1 | 776 | 776第589章2 | 776 | 776第471章3 | 776 | 776第1455章4 | 776 | 776第1287章5 | 776 | 776 52|| 6 | 777 | 777第1386章7 | 777 | 777第588章8 | 777 | 777 109 || 9 | 777 | 777第603章10 | 10 777 | 777 1299 |+----+------------+--------+

其实,做类似推荐的时候,只需要使用tag_map即可表,因为tagid和标签名是一一对应的。

具体编码

1.获取所有文章对应的TAGID

mysql> selectarticleid, GROUP_CONCAT(tagid ) as Tags from tag_map GROUP BYarticleid;+------- ---+--------------------------+|文章编号 |标签 |+------------+--------------------------+| 12 | 12 1178,1067,49,693,1227 || 13 | 196,2004,2071,927,131 || 14 | 14 1945,713,1711,2024,49 || 15 | 15 35,119,9,1,1180 || 16 | 16 1182,1924,2200,181,1938 || 17 | 17 46,492,414,424,620 || 18 | 18 415,499,153,567,674 || 19 | 19 1602,805,691,1613,194 || 20 | 2070,1994,886,575,1149 || 21 | 21 1953,1961,1534,2038,1393 |+------------------------+--------------------- -----+ 

通过上面的SQL,可以一次性查询出所有文章以及所有对应的标签
在PHP中,我们可以将标签转为数组。

public function getAllGroupByArticleId(){ //缓存查询数据,因为这是全表数据,文章不更新也不会改变,所以建议每次数据都要从数据库获取一次,这肯定会对性能有影响,所以做缓存。 if($cache = CacheHelper::getCache()){ 返回 $cache; $query_result = $this->query('选择articleid, GROUP_CONCAT(tagid) 作为 tag_map GROUP BYarticleid 中的标签'); $结果 = [] ; foreach($query_result as $key => $value){ //使用文章eid为key,value为该id下所有tagID的数组。 $result[$value['articleid']] =explode(",",$value['tags']); CacheHelper::setCache($结果, 86400);返回$结果; }

有了这个返回结果,就更容易处理了。下一步是应用杰卡德相似度算法。让我们看一下代码来了解详细信息。

/** * 【根据指定文章返回相似文章推荐】 * @param $articleid 指定文章ID * @param $top 要返回推荐商品数量* @return Array 推荐商品数组*/function getArticleRecommend($articleid, $top = 5){ if($cache = CacheHelper::getCache()){ return $cache; } } } 尝试{ $articleid = intval($articleid); $m = new TagMapModel(); $all_tags = $m->getAllGroupByArticleId();//调用上面函数返回所有文章的标签 $finded = $all_tags[$articleid];//因为上面包含了所有文章,所以必须包含当前文章。未设置($全部_tags[$articleid]);//从数组中删除当前文章,否则一定是和自己最相似的。 $jaccard_arr = []; //用于存储相似度 foreach ($all_tags as $key => $value) { $intersect =array_intersect($finded, $value); //计算交集 $union = array_unique(array_merge($found, $value)); //计算并集 $jaccard_arr[$key] = (float)(count($intersect) / count($union)); } asort($jaccard_arr); //按照相似度排序,最相似的排在前面 $jaccard_keys = array_keys($jaccard_arr); //由于数组的key是文章id,所以这里取出key即可 array_splice($jaccard_keys, $top);//获取前N个推荐//此时我们就得到了最相似的ID N 篇文章。接下来的工作就是通过这几个ID,从数据库中查询相关信息即可 $articleModels = new \Api\Model\ArticleModel(); $recommendArticles = $articleModels->getRecommendByTag($jaccard_keys); CacheHelper::setCache($recommendArtic)莱斯,604800); //缓存7天 return $recommendArticles; } catch (\Exception $e) { throw new \Exception("获取推荐文章时出错"); } }

以上就是标签实现内容推荐的方法的全部内容,感谢您的阅读!相信大家都有一定的了解,希望分享的内容对大家有所帮助。如果您想了解更多知识,请关注行业资讯频道!

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

用户评论