国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

基于Tags的簡(jiǎn)單內(nèi)容推薦的實(shí)現(xiàn)

邱勇 / 2491人閱讀

摘要:原來(lái)為了簡(jiǎn)單方便,自己小網(wǎng)站上的文章頁(yè)的相關(guān)內(nèi)容推薦就是從數(shù)據(jù)庫(kù)里隨機(jī)抽取數(shù)據(jù)來(lái)填充一個(gè)列表,所以一點(diǎn)相關(guān)性都沒(méi)有,更本沒(méi)有辦法引導(dǎo)用戶(hù)去訪(fǎng)問(wèn)推薦內(nèi)容。

原來(lái)為了簡(jiǎn)單方便,自己小網(wǎng)站上的文章頁(yè)的相關(guān)內(nèi)容推薦就是從數(shù)據(jù)庫(kù)里隨機(jī)抽取數(shù)據(jù)來(lái)填充一個(gè)列表,所以一點(diǎn)相關(guān)性都沒(méi)有,更本沒(méi)有辦法引導(dǎo)用戶(hù)去訪(fǎng)問(wèn)推薦內(nèi)容。

算法選擇

如何能做到相似內(nèi)容的推薦呢,礙于小網(wǎng)站還跑在虛擬主機(jī)上(對(duì)的,連一個(gè)自己完整可控的服務(wù)器都沒(méi)有),所以可以想的辦法不多,條件限制在 只能用PHP+MySql。所以我想到的辦法就是通過(guò)Tags來(lái)匹配相似文章進(jìn)行推薦。如果兩篇文章的TAGS 比較相似

比如:文章A 的TAGS為: [A,B,C,D,E]
文章B 的 TAGS 為:[A,D,E,F,G]
文章C 的 TAGS 為:[C,H,I,J,K]

通過(guò)眼睛我們能很方便的發(fā)現(xiàn),文章B和文章A更為相似,因?yàn)樗鼈冇腥齻€(gè)關(guān)鍵字相同分別為:[A,D,E],哪如何用計(jì)算機(jī)來(lái)判斷它們的相似度呢,這里我們用jaccard相似度的最基本應(yīng)用來(lái)計(jì)算它們的相似度

jaccard相似度

給定兩個(gè)集合A,B,Jaccard 系數(shù)定義為A與B交集的大小與A與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更為相似,有了這個(gè)算法,計(jì)算機(jī)就可以來(lái)判斷兩篇文章的相似度了。

具體的推薦思想

給定一篇文章,獲取該文章的關(guān)鍵字TAGS,然后通過(guò)以上算法去數(shù)據(jù)庫(kù)比對(duì)所有文章的相似度,獲取最相似的N篇文章進(jìn)行推薦。

實(shí)現(xiàn)過(guò)程 第一 TAGS的獲取

文章的TAGS是通過(guò)TF-IDF算法,提取文章中的高頻詞,選取N個(gè)作為T(mén)AGS,對(duì)于中文的文章來(lái)說(shuō)還涉及到一個(gè)中文分詞的問(wèn)題,因?yàn)槭翘摂M主機(jī)的關(guān)系,這步的工作我用python(為什么用Python ,jieba分詞,真香)在本地寫(xiě)了一個(gè)程序,完成所有文章的分詞,詞頻統(tǒng)計(jì),生成TAGS,并寫(xiě)回服務(wù)器的數(shù)據(jù)庫(kù)。由于本文是寫(xiě)推薦的算法,所以分詞和建立TAGS的部分就不具體展開(kāi)了,而且不同的系統(tǒng)有不同的TAGS建立方式。

第二 TAGS的存儲(chǔ)

建立兩張表,用于存儲(chǔ)TAGS
tags,用于存所有tag的名稱(chēng)

+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| tag   | text       | YES  |     | NULL    |       |
| count | bigint(20) | YES  |     | NULL    |       |
| tagid | int(11)    | NO   | PRI | 0       |       |
+-------+------------+------+-----+---------+-------+

tag_map 建立tag和文章的映身關(guān)系。

+-----------+------------+------+-----+---------+-------+
| Field     | Type       | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+-------+
| id        | bigint(20) | NO   | PRI | 0       |       |
| articleid | bigint(20) | YES  |     | NULL    |       |
| tagid     | int(11)    | YES  |     | NULL    |       |
+-----------+------------+------+-----+---------+-------+

tag_map存的數(shù)據(jù)類(lèi)似如下:

+----+-----------+-------+
| id | articleid | tagid |
+----+-----------+-------+
|  1 |       776 |   589 |
|  2 |       776 |   471 |
|  3 |       776 |  1455 |
|  4 |       776 |  1287 |
|  5 |       776 |    52 |
|  6 |       777 |  1386 |
|  7 |       777 |   588 |
|  8 |       777 |   109 |
|  9 |       777 |   603 |
| 10 |       777 |  1299 |
+----+-----------+-------+

其實(shí)做相似推薦的時(shí)候,只需要用到tag_map表就可以了,因?yàn)閠agid和tag name 是一一對(duì)應(yīng)的。

具體編碼 1.獲取所有文章對(duì)應(yīng)的TAGID
mysql> select articleid, GROUP_CONCAT(tagid) as tags from tag_map GROUP BY articleid;
+-----------+--------------------------+
| articleid | tags                     |
+-----------+--------------------------+
|        12 | 1178,1067,49,693,1227    |
|        13 | 196,2004,2071,927,131    |
|        14 | 1945,713,1711,2024,49    |
|        15 | 35,119,9,1,1180          |
|        16 | 1182,1924,2200,181,1938  |
|        17 | 46,492,414,424,620       |
|        18 | 415,499,153,567,674      |
|        19 | 1602,805,691,1613,194    |
|        20 | 2070,1994,886,575,1149   |
|        21 | 1953,1961,1534,2038,1393 |
+-----------+--------------------------+

通過(guò)以上SQL,可以一次性查詢(xún)所用文章,極其對(duì)應(yīng)的所有tag
在PHP,我們可以把tags變成數(shù)組。

public function getAllGroupByArticleId(){
        //緩存查詢(xún)數(shù)據(jù),因?yàn)檫@個(gè)是全表數(shù)據(jù),而且不更新文章不會(huì)變化,便是每次推薦都要從數(shù)據(jù)庫(kù)里獲取一次數(shù)據(jù),對(duì)性能肯定會(huì)有影響,所以做個(gè)緩存。
        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數(shù)組。
            $result[$value["articleid"]] = explode(",",$value["tags"]);
        }

        CacheHelper::setCache($result, 86400);

        return $result;

    }

有了這個(gè)的返回結(jié)果,就比較好辦了,接下去的工作就是去應(yīng)用jaccard相似度這個(gè)算法了,具體就看代碼吧。

/**
     * [更據(jù)指定文章返回相似的文章推薦]
     * @param  $articleid 指定的文章ID
     * @param  $top       要返回的推薦條數(shù)
     * @return Array      推薦條目數(shù)組
     */
function getArticleRecommend($articleid, $top = 5){
        if($cache = CacheHelper::getCache()){
            return $cache;
        }
        try{
            $articleid = intval($articleid);
            $m = new TagMapModel();
            $all_tags = $m->getAllGroupByArticleId();//調(diào)用上面的函數(shù)返回所有文章的tags
            $finded = $all_tags[$articleid];//因?yàn)樯厦媸前形恼铝耍钥隙ò水?dāng)前文章。

            unset($all_tags[$articleid]);//把當(dāng)前文章從數(shù)組中刪除,不然自己和自己肯定是相似度最高了。

            $jaccard_arr = []; //用于存相似度
            foreach ($all_tags as $key => $value) {
                $intersect =array_intersect($finded, $value); //計(jì)算交集
                $union = array_unique(array_merge($finded, $value)); //計(jì)算并集

                $jaccard_arr[$key] = (float)(count($intersect) / count($union));
            }

            arsort($jaccard_arr); //按相似度排序,最相似的排最前面

            $jaccard_keys = array_keys($jaccard_arr);//由于數(shù)組的key就是文章id,所以這里把key取出來(lái)就可以了
            array_splice($jaccard_keys, $top);//獲取前N條推薦

            //到這里我們就已經(jīng)得到了,最相似N篇文章的ID了,接下去的工作就是通過(guò)這幾個(gè)ID,從數(shù)據(jù)庫(kù)里把相關(guān)信息,查詢(xún)出來(lái)就可以了
    
            $articleModels = new ApiModelArticleModel();
            $recommendArticles = $articleModels->getRecommendByTag($jaccard_keys);
            CacheHelper::setCache($recommendArticles, 604800); //緩存7天
            return $recommendArticles;
        } catch (Exception $e) {
            throw new Exception("獲取推薦文章錯(cuò)誤");
        }
    }

雖然簡(jiǎn)單,短短幾條代碼,但是效果還是可以的,推薦的文章有了一定的相似度,肯定可以帶來(lái)更好的用戶(hù)體驗(yàn),實(shí)例 ,你們可以看看 https://www.wx2share.com/Arti...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/62030.html

相關(guān)文章

  • 基于Tags簡(jiǎn)單內(nèi)容推薦實(shí)現(xiàn)

    摘要:原來(lái)為了簡(jiǎn)單方便,自己小網(wǎng)站上的文章頁(yè)的相關(guān)內(nèi)容推薦就是從數(shù)據(jù)庫(kù)里隨機(jī)抽取數(shù)據(jù)來(lái)填充一個(gè)列表,所以一點(diǎn)相關(guān)性都沒(méi)有,更本沒(méi)有辦法引導(dǎo)用戶(hù)去訪(fǎng)問(wèn)推薦內(nèi)容。 原來(lái)為了簡(jiǎn)單方便,自己小網(wǎng)站上的文章頁(yè)的相關(guān)內(nèi)容推薦就是從數(shù)據(jù)庫(kù)里隨機(jī)抽取數(shù)據(jù)來(lái)填充一個(gè)列表,所以一點(diǎn)相關(guān)性都沒(méi)有,更本沒(méi)有辦法引導(dǎo)用戶(hù)去訪(fǎng)問(wèn)推薦內(nèi)容。 算法選擇 如何能做到相似內(nèi)容的推薦呢,礙于小網(wǎng)站還跑在虛擬主機(jī)上(對(duì)的,連一個(gè)自...

    CrazyCodes 評(píng)論0 收藏0
  • 基于droneCI/CD,對(duì)接kubernetes,見(jiàn)證靈活與自由,CI/CD對(duì)接kubernet

    摘要:所以我們選一個(gè)倉(cāng)庫(kù)倉(cāng)庫(kù)比較多,我這里選用,都行,根據(jù)需求自行選擇訪(fǎng)問(wèn)端口,然后就沒(méi)有然后了功能沒(méi)有那么強(qiáng)大,不過(guò)占用資源少,速度快,我們穩(wěn)定運(yùn)行了幾年了。 kubernetes集群三步安裝 CI 概述 用一個(gè)可描述的配置定義整個(gè)工作流 程序員是很懶的動(dòng)物,所以想各種辦法解決重復(fù)勞動(dòng)的問(wèn)題,如果你的工作流中還在重復(fù)一些事,那么可能就得想想如何優(yōu)化了 持續(xù)集成就是可以幫助我們解決重復(fù)的代碼...

    iOS122 評(píng)論0 收藏0
  • Node項(xiàng)目Gitlab自動(dòng)部署實(shí)踐(基于Docker)

    摘要:只要的項(xiàng)目有提交,相關(guān)就根據(jù)來(lái)決定是否跑自動(dòng)部署的命令。項(xiàng)目的自動(dòng)部署添加執(zhí)行的注冊(cè)命令,按照說(shuō)明進(jìn)行參數(shù)配置。至此,和服務(wù)都已經(jīng)自動(dòng)部署完成。 準(zhǔn)備工作 說(shuō)明 公司最近準(zhǔn)備了一臺(tái)新的開(kāi)發(fā)服務(wù)器,正好用以實(shí)踐docker的基本應(yīng)用。docker的好處不再贅述,詳情可參考阮一峰的這篇入門(mén)。(關(guān)于Docker最好的中文介紹,沒(méi)有之一)。 公司目前主要使用了EggJs + ReactJS的技...

    oysun 評(píng)論0 收藏0
  • 使用hexo+github搭建免費(fèi)個(gè)人博客詳細(xì)教程

    摘要:如果實(shí)在不會(huì)安裝可以去網(wǎng)上找教程。打開(kāi),跳轉(zhuǎn)到剛剛創(chuàng)建的文件夾位置,運(yùn)行命令然后會(huì)在你的文件夾中搭建好了環(huán)境配置配置修改一些你的博客名字描述作者等。基于我的個(gè)人經(jīng)驗(yàn),建議都開(kāi)啟開(kāi)啟標(biāo)簽頁(yè)命令,在博客目錄添加元數(shù)據(jù)開(kāi)啟分類(lèi)頁(yè)命令,在博 Windows環(huán)境下Git安裝、配置SSH key、安裝node.js npm、安裝Hexo及配置、發(fā)布博客 前言 使用github pages服務(wù)搭建博客的...

    番茄西紅柿 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<