使用PHP?MySQL實現(xiàn)數(shù)據(jù)量小的內(nèi)容推薦方法
前言
當(dāng)下,只要是一個初具規(guī)模的內(nèi)容應(yīng)用都具備個性化推薦系統(tǒng)。比如購物類的會有推薦商品模塊,搜索條下有個性化的搜索關(guān)鍵詞或詞條補全詞,社交類的有博主推薦,視頻或文章推薦等等。這些功能除了要有龐大的數(shù)據(jù)量,還要有健全的數(shù)據(jù)存儲倉庫建設(shè)方案,以及后面對數(shù)據(jù)的清洗,排序,訓(xùn)練后的推薦模型算法?! ?/p>
但是,對于小公司或者說是小項目,在想法還未真正落地就設(shè)計大數(shù)據(jù)存儲,推薦算法和一系列大型架構(gòu)的方案,顯然是不符合業(yè)務(wù)型產(chǎn)品開展的正常規(guī)律的。我想那些大廠早期開發(fā)應(yīng)該也沒有這么成熟的技術(shù)結(jié)構(gòu),都是不斷迭代或者推倒重來一步步走過來的?! ?/p>
那么,在小項目早期安排了有關(guān)于推薦功能的那要如何解決呢? 如何做到下一次迭代在不重構(gòu)的基礎(chǔ)上添加協(xié)同過濾推薦? 下面就從視頻推薦和用戶推薦兩個功能展開,用PHP和MySQL進(jìn)行代碼實現(xiàn)。
視頻推薦
這里主要通過一個內(nèi)容熱度值進(jìn)行排序推薦,熱度由內(nèi)容質(zhì)量和發(fā)布時間差決定,時差越長,熱度越低,內(nèi)容質(zhì)量越高熱度越高。而內(nèi)容質(zhì)量由視頻點贊數(shù),收藏數(shù)和評論數(shù)外帶權(quán)重決定,總體就是單位時間內(nèi)點贊,收藏,評論越高,熱度提升,視頻就越往前靠。相對的就是發(fā)布時間越久,熱度就會逐步降低,視頻越往后靠。
另外我們還要設(shè)計兩個參數(shù)用于手動調(diào)節(jié)視頻的熱度,提高就只需要增加內(nèi)容質(zhì)量,所以額外加一個數(shù)可以說是初始值。降低可以對時間差添加一個指數(shù),也就是時間差的次方,可以理解是重力,也就是隨著時間拉長,重力增加則熱度成倍降低。
1. 公式
1.1. ”H“:視頻熱度值
1.2. ”W“:視頻質(zhì)量,質(zhì)量值自定(點贊數(shù)權(quán)重,收藏數(shù)權(quán)重之和,或者點贊率(點贊量/閱讀量),收藏率(收藏量/閱讀量)之和)等。
1.3. ”I“:初始值,可以手動調(diào)節(jié)熱度或者用于后期用戶賬號的權(quán)重。比如系統(tǒng)已經(jīng)有了成長體系,賬號發(fā)育規(guī)則基本完善了,用于實時計算賬號的權(quán)重分配的流量池,權(quán)重提升,則后面發(fā)布的視頻推薦力度大。
1.4. ”T“:時間差,由當(dāng)前時間 - 發(fā)布時間產(chǎn)生,加一的原因是防止時間差為0(分母為零),不過有審核機制下,這種情況并不存在。
1.5. ”G":熱度衰減重力,這個也是用于手動調(diào)節(jié)熱度設(shè)置的控制參數(shù)。不過后期如果添加了舉報或者智能復(fù)審等環(huán)節(jié),再隨著諸如點贊和賬戶權(quán)重評估失控?zé)岫蕊j升的情況下,對視頻違規(guī)或不良表現(xiàn)或臨時情況進(jìn)行減小推薦。默認(rèn)值最好是1,這種情況就是在同等質(zhì)量下新發(fā)布的越往前。
2. 表結(jié)構(gòu)
CREATE TABLE `hhyp_short_video` ( `id` int(11) NOT NULL AUTO_INCREMENT, `hsvn` varchar(255) DEFAULT '' COMMENT '短視頻編號', `type` tinyint(1) DEFAULT '0' COMMENT '類型:1. 視頻 2.圖文', `user_id` int(11) DEFAULT '0', `video_url` varchar(255) DEFAULT '', `img_url` json DEFAULT NULL, `content` text COMMENT '內(nèi)容', `market_goods_id` int(11) DEFAULT '0', `address_id` int(11) DEFAULT '0' COMMENT '地址ID', `lat` decimal(4,0) DEFAULT '0' COMMENT '緯度', `lng` decimal(4,0) DEFAULT '0' COMMENT '經(jīng)度', `ip` varchar(100) CHARACTER SET utf8 DEFAULT '' COMMENT 'IP', `channel` tinyint(1) DEFAULT '0' COMMENT '渠道', `read_count` int(11) DEFAULT '0' COMMENT '瀏覽數(shù)', `like_count` int(11) DEFAULT '0' COMMENT '點贊數(shù)', `collect_count` int(11) DEFAULT '0' COMMENT '收藏數(shù)', `comment_count` int(11) DEFAULT '0' COMMENT '評論數(shù)', `share_count` int(11) DEFAULT '0' COMMENT '分享數(shù)', `is_top` tinyint(1) DEFAULT '0' COMMENT '是否置頂:0.否 1.是', `status` int(11) DEFAULT '0' COMMENT '0. 審核中 10. 推薦 20. 下架', `hot_int` int(11) DEFAULT '1' COMMENT '熱度初始值', `gravity` int(11) DEFAULT '1' COMMENT '熱度重力衰減值', `audit_time` int(11) DEFAULT '0' COMMENT '審核時間', `remark` text, `create_time` int(11) DEFAULT '0' COMMENT '創(chuàng)建時間', `delete_time` int(11) DEFAULT '0', `update_time` int(11) DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=107 DEFAULT CHARSET=utf8mb4;
3. 代碼
public static function getList($map, $page = 1, $size = 20) { // 數(shù)據(jù)指標(biāo)權(quán)重配置 $wcfg = [ 'like_weight' => 4, 'collect_weight' => 3, 'comment_weight' => 1 ]; $timeUnit = 3600; // 單位小時 $where[] = ['delete_time', '=', 0]; $map = array_merge($where, $map); // 單位小時內(nèi),點贊/收藏/評論越多熱度越高,發(fā)布越久熱度越低 $alog = "(like_count*%s+collect_count*%s+comment_count*%s+hot_int)/pow((UNIX_TIMESTAMP(NOW())-create_time)/%s, gravity)"; $hotIndex = sprintf($alog, $wcfg['like_weight'], $wcfg['collect_weight'], $wcfg['comment_weight'], $timeUnit); $field = ["id, hsvn,type,user_id,video_url,img_url,content,market_goods_id, like_count,collect_count,address_id,comment_count,share_count,create_time, $hotIndex as hot_index"]; $list = self::field($field) ->json(['img_url'], true) ->with([ 'user' => function ($query) { $query->withField('id, nickname, mobile, avatar'); }, 'marketGoods' => function ($query) { $query->withField('id, content,freight,user_id'); }, 'address' => function ($query) { $query->withField('id, mername'); } ]) ->where($map) ->page($page, $size) ->order("hot_index desc") ->select(); return $list; }
用戶推薦
推薦用戶,大部分是放在App里的個人中心感興趣用戶模塊。有的是給用戶推薦授權(quán)的通訊錄好友,有的是根據(jù)行為數(shù)據(jù),通過給用戶打標(biāo)簽,再推薦與自己標(biāo)簽相似的用戶等等方式。而我這里的用戶推薦是放在發(fā)布視頻的用戶面板里,本來我想通過協(xié)同過濾的相似用戶來做,由于數(shù)據(jù)太有限,加之我們業(yè)務(wù)本身就不能查看用戶關(guān)注列表和粉絲列表,所以就暫時用了一個折中的方法,給用戶推薦創(chuàng)作者關(guān)注的關(guān)注?! ?/p>
根據(jù)當(dāng)前面板用戶關(guān)注的用戶里挑出粉絲數(shù)最多的前十個,然后再從這十個里分別挑出他們關(guān)注用戶里粉絲最多的前十,最后合并去重,也就是給自己推薦打開用戶關(guān)注的關(guān)注里粉絲最多的那批人。
1. 表結(jié)構(gòu)
CREATE TABLE `hhyp_user_attention` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL DEFAULT '0' COMMENT '用戶id', `comcemed_user_id` int(11) NOT NULL DEFAULT '0' COMMENT '關(guān)注的用戶id', `create_time` int(11) DEFAULT '0' COMMENT '創(chuàng)建時間', `status` smallint(3) NOT NULL DEFAULT '0' COMMENT '關(guān)注狀態(tài) 0未關(guān)注 1已關(guān)注', `update_time` int(11) DEFAULT '0' COMMENT '更新時間', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=352 DEFAULT CHARSET=utf8mb4;
2. 代碼
通過查詢子查詢里指定用戶里粉絲最多的前十人(分組排序),然后遞歸往前查詢就形成關(guān)注鏈條,最后再合并查詢結(jié)果。其實這個也很看數(shù)據(jù)的,當(dāng)我真正把這個方法放上去的時候,會發(fā)現(xiàn)很多面板里沒有用戶推薦的數(shù)據(jù),因為很多用戶根據(jù)就沒關(guān)注幾個人。
所以通過深度學(xué)習(xí)或者協(xié)同過濾做用戶推薦可能要等待一段時間,等用戶行為數(shù)據(jù)產(chǎn)生差不多的時候,我再出一下協(xié)同過濾的用戶相似度推薦吧。
// 關(guān)注鏈列表 public static function grandadList($userIds = [], &$allList = [], &$level = 1) { $field = ["comcemed_user_id, count(*) as fans_count, {$level} as level"]; $list = self::field($field) ->where('comcemed_user_id', 'in', function ($query) use ($userIds) { $query->table('hhyp_user_attention') ->where('user_id', 'in', $userIds) ->where('status', '=', 1) ->field('comcemed_user_id'); }) ->where('status', '=', 1) ->group('comcemed_user_id') ->order('fans_count desc') ->limit(10) ->select() ->toArray(); if ($list && $level < 4) { $level++; $comcemedUserIds = array_column($list, 'comcemed_user_id'); $list = self::grandadList($comcemedUserIds, $list, $level); } $list = array_merge($allList, $list); return $list; }
以上就是使用PHP MySQL實現(xiàn)數(shù)據(jù)量小的內(nèi)容推薦方法的詳細(xì)內(nèi)容,更多關(guān)于PHP MySQL內(nèi)容推薦的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHP 獲取MSN好友列表的代碼(2009-05-14測試通過)
感謝druggo提供代碼 放到首頁只是覺得值得大家研究 等有機會把這代碼裝成jsp的2009-09-09php 升級到 5.3+ 后出現(xiàn)的一些錯誤,如 ereg(); ereg_replace(); 函數(shù)報錯
這篇文章主要介紹了php 升級到 5.3+ 后出現(xiàn)的一些錯誤,如 ereg(); ereg_replace(); 函數(shù)報錯 的相關(guān)資料,需要的朋友可以參考下2015-12-12PHP+FastCGI+Nginx配置PHP運行環(huán)境
Nginx不支持對外部程序的調(diào)用,所以必須通過FastCGI接口實現(xiàn)對外部程序的調(diào)用從而實現(xiàn)對客戶端動態(tài)頁面請求的處理。2014-08-08PHP編實現(xiàn)程動態(tài)圖像的創(chuàng)建代碼
只要安裝一些第三方的庫文件并具有一定的幾何知識,就可以利用PHP來創(chuàng)建和處理圖像了。利用PHP創(chuàng)建動態(tài)圖像是相當(dāng)容易的一件事情。下面,筆者將詳細(xì)介紹如何實現(xiàn)。2008-09-09