/** * Show the form for editing the specified resource. * * @param int $id * @return Response */ public function search() { //video recommendation //maybe is better to have a middleware applied only to search $user = Auth::user()->mecanex_user; if (empty($user)) { return Redirect::route('profile.create')->with('message', 'You have to create your profile first'); } else { $user_id = $user->id; //only for online experiments //calculation of DCG $dcg = DB::select(DB::raw('select mecanex_user_id ,SUM((POWER(2,explicit_rf)-1)/log2(rank+1)) as dcg_score from dcgs where mecanex_user_id=?'), [$user_id]); if (count($dcg[0]->dcg_score) > 0) { DB::table('users_dcg')->insert(['mecanex_user_id' => $user_id, 'dcg' => $dcg[0]->dcg_score]); } DB::table('dcgs')->where('mecanex_user_id', $user_id)->delete(); //parameter for the experiment $neighs = '3'; $list_neighs = []; //content_based recommendation -- using the view $results_content = DB::select(DB::raw('select video_id, title, similarity, euscreen_id FROM user_item_similarity where user=? GROUP BY video_id, title ORDER BY similarity DESC LIMIT 10'), [$user_id]); //collaborative recommendation // //multiplies vector of user i with every one of its neighbors and sorts them in descending order $results_neighs = DB::select(DB::raw('select neighbor FROM user_neighbor_similarity where user=(?) ORDER BY similarity DESC LIMIT ?'), [$user_id, $neighs]); foreach ($results_neighs as $neigh) { array_push($list_neighs, $neigh->neighbor); } if (count($list_neighs) < 3) { //content recommendation if no neighbors $results_recommendation = $results_content; } else { $string_neighs = implode(',', $list_neighs); $results_recommendation = DB::select(DB::raw(' SELECT a.user,a.video_id,user_item_similarity.title,user_item_similarity.euscreen_id, (0.5*user_item_similarity.similarity+0.5*a.score) as total_score from (SELECT user_neighbor_similarity.user,user_item_similarity.video_id, SUM(user_neighbor_similarity.similarity+user_item_similarity.similarity) as score FROM user_neighbor_similarity INNER JOIN user_item_similarity on user_neighbor_similarity.neighbor=user_item_similarity.user and user_item_similarity.user IN(' . $string_neighs . ') GROUP BY user_neighbor_similarity.user,user_item_similarity.video_id) as a INNER JOIN user_item_similarity on a.video_id = user_item_similarity.video_id and a.user=user_item_similarity.user where a.user=(?) ORDER BY total_score DESC LIMIT 10'), [$user_id]); } } //used for online experiments - creation of dcg table $index = 0; foreach ($results_recommendation as $result) { $index++; $video_id = $result->euscreen_id; // $video_id=$result->video_id; $dcg = Dcg::firstOrNew(['mecanex_user_id' => $user_id, 'video_id' => $video_id]); $dcg->rank = $index; $dcg->save(); } return view('video.recommendation', compact('results_recommendation')); }