Rumah  >  Artikel  >  rangka kerja php  >  Cara menggunakan Workerman untuk melaksanakan sistem pengesyoran filem berdasarkan penapisan kolaboratif

Cara menggunakan Workerman untuk melaksanakan sistem pengesyoran filem berdasarkan penapisan kolaboratif

PHPz
PHPzasal
2023-11-07 15:39:16995semak imbas

Cara menggunakan Workerman untuk melaksanakan sistem pengesyoran filem berdasarkan penapisan kolaboratif

Dengan pembangunan berterusan teknologi Internet, semakin banyak tapak web dan aplikasi mula memfokuskan pada pengalaman pengguna dan pengesyoran yang diperibadikan. Sistem pengesyoran adalah bahagian yang sangat penting daripadanya. Ia boleh mengesyorkan kandungan yang paling sesuai dengan minat pengguna berdasarkan gelagat sejarah dan pilihan pengguna. Artikel ini akan memperkenalkan cara menggunakan rangka kerja Workerman untuk melaksanakan sistem pengesyoran filem berdasarkan penapisan kolaboratif.

1. Algoritma penapisan kolaboratif

Penapisan kolaboratif ialah salah satu algoritma yang paling biasa digunakan dalam sistem pengesyoran. Ia meramalkan penilaian pengguna bagi item yang tidak diketahui atau sama ada mereka akan menyukai item ini berdasarkan gelagat dan pilihan sejarah pengguna. Idea asas algoritma penapisan kolaboratif adalah untuk menemui persamaan antara pengguna dan persamaan antara item. Antaranya, persamaan antara pengguna boleh direalisasikan dengan mengira persamaan penilaian sejarah pengguna, dan persamaan antara item boleh direalisasikan dengan mengira penilaian pengguna yang berbeza pada item yang berbeza. . ., dan boleh mengendalikan sebilangan besar tugasan jangka panjang yang serentak tinggi Sambungan boleh digunakan untuk merealisasikan pemesejan segera, permainan dalam talian, Internet Perkara dan senario lain.

3. Gunakan Workerman untuk melaksanakan sistem pengesyoran filem berdasarkan penapisan kolaboratif

Penyediaan data

    Pertama, kami perlu menyediakan set data rating filem filem. Set data boleh dimuat turun dari tapak web MovieLens, contohnya, muat turun pakej ml-100k.zip Selepas penyahmampatan, anda boleh mendapatkan fail u.data, yang mengandungi 100,000 rekod penilaian. Format set data adalah seperti berikut:
  1. UserID | MovieID | Rating | Timestamp
    ---------------------------------------
       196  |    242  |      3 | 881250949
       186  |    302  |      3 | 891717742
       196  |    377  |      1 | 878887116
    ...
    
Bina model rating pengguna

    Mengikut set data rating filem, kami boleh membina model rating pengguna, yang boleh menanyakan rating pengguna untuk semua filem berdasarkan ID pengguna. Berikut ialah contoh model penarafan pengguna mudah:
  1. class UserModel
    {
        public static function getRatings($userId)
        {
            $ratings = array();
            $file = fopen('u.data', 'r');
            while (($line = fgets($file)) !== false) {
                $data = explode("    ", trim($line));
                if ($userId == $data[0]) {
                    $ratings[$data[1]] = $data[2]; // 记录该用户对该电影的评分
                }
            }
            fclose($file);
            return $ratings;
        }
    }
    
Bina model penapisan kolaboratif

    Berdasarkan model penarafan pengguna yang telah ditetapkan, kami boleh membina model penapisan kolaboratif, yang boleh meramalkan penarafan pengguna bagi filem yang tidak diketahui berdasarkan pada skor penilaian sejarah pengguna. Berikut ialah contoh model penapisan kolaboratif mudah:
  1. class CFModel
    {
        public static function predictRating($userId, $movieId)
        {
            $simUsers = array(); // 相似用户ID列表
            $simValues = array(); // 相似值列表
            $ratings1 = UserModel::getRatings($userId);
            if (empty($ratings1)) {
                return 0;
            }
            $file = fopen('u.data', 'r');
            while (($line = fgets($file)) !== false) {
                $data = explode("    ", trim($line));
                if ($userId != $data[0] && $movieId == $data[1]) { // 如果不是当前用户且电影相同
                    $ratings2 = UserModel::getRatings($data[0]);
                    if (!empty($ratings2)) { // 如果相似用户有评分记录
                        $sim = self::similarity($ratings1, $ratings2); // 计算相似度
                        if ($sim > 0) { // 如果相似度大于0
                            $simUsers[] = $data[0];
                            $simValues[] = $sim;
                        }
                    }
                }
            }
            fclose($file);
            if (empty($simUsers)) {
                return 0;
            }
            arsort($simValues); // 按相似度从高到低排序
            $simUsers = array_slice($simUsers, 0, 10); // 取相似度最高的10个用户
            $simValues = array_slice($simValues, 0, 10); // 取相似度最高的10个用户的相似度值
            $sum = 0;
            $weight = 0;
            foreach ($simUsers as $k => $simUser) {
                $rating = UserModel::getRatings($simUser)[$movieId]; // 获取相似用户对该电影的评分
                $sum += $simValues[$k] * $rating; // 计算评分总和
                $weight += $simValues[$k]; // 计算权重总和
            }
            return round($sum / $weight); // 计算平均评分
        }
    
        public static function similarity($ratings1, $ratings2)
        {
            $commonKeys = array_keys(array_intersect_key($ratings1, $ratings2));
            if (empty($commonKeys)) {
                return 0;
            }
            $diff1 = $diff2 = 0;
            foreach ($commonKeys as $key) {
                $diff1 += ($ratings1[$key] - $ratings2[$key]) ** 2;
                $diff2 += ($ratings1[$key] - $ratings2[$key]) ** 2;
            }
            return $diff1 / sqrt($diff2);
        }
    }
    
Bina perkhidmatan sistem pengesyoran

    Berdasarkan model penapisan kolaboratif di atas, kami boleh membina perkhidmatan sistem pengesyoran yang boleh menerima ID pengguna dan ID filem sebagai parameter dan mengembalikan Penilaian yang diramalkan pengguna untuk filem ini. Berikut ialah contoh mudah perkhidmatan sistem pengesyoran:
  1. use WorkermanProtocolsHttpRequest;
    use WorkermanProtocolsHttpResponse;
    use WorkermanWorker;
    
    require_once __DIR__ . '/vendor/autoload.php';
    
    $http_worker = new Worker("http://0.0.0.0:8888");
    
    $http_worker->onMessage = function(Request $request, Response $response) {
        $userId = $request->get('userId');
        $movieId = $request->get('movieId');
        $rating = CFModel::predictRating($userId, $movieId);
        $response->header('Content-Type', 'application/json');
        $response->end(json_encode(array('rating' => $rating)));
    };
    
    Worker::runAll();
    
Menguji perkhidmatan sistem pengesyoran

    Akhir sekali, kami boleh menguji perkhidmatan sistem pengesyoran dengan menghantar permintaan HTTP, sebagai contoh:
  1. http://localhost:8888?userId=1&movieId=1
    
  2. Permintaan akan mengembalikan balasan dalam format JSON, Mengandungi penilaian ramalan pengguna untuk filem itu.

IV. Ringkasan

Artikel ini memperkenalkan cara menggunakan rangka kerja Workerman untuk melaksanakan sistem pengesyoran filem berdasarkan penapisan kolaboratif Sistem ini boleh meramalkan penilaian pengguna bagi filem yang tidak diketahui berdasarkan gelagat sejarah dan pilihan pengguna. Contoh kod hanyalah pelaksanaan mudah Dalam aplikasi sebenar, banyak faktor perlu dipertimbangkan, seperti saiz data, pengoptimuman algoritma, latihan model, dll. Saya harap artikel ini dapat membantu pembaca memahami dan melaksanakan sistem pengesyoran.

Atas ialah kandungan terperinci Cara menggunakan Workerman untuk melaksanakan sistem pengesyoran filem berdasarkan penapisan kolaboratif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn