예제 #1
0
   /**
    * 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'));
   }