Maison  >  Article  >  cadre php  >  Comment utiliser Workerman pour mettre en œuvre un système de recommandation de films basé sur un filtrage collaboratif

Comment utiliser Workerman pour mettre en œuvre un système de recommandation de films basé sur un filtrage collaboratif

PHPz
PHPzoriginal
2023-11-07 15:39:16985parcourir

Comment utiliser Workerman pour mettre en œuvre un système de recommandation de films basé sur un filtrage collaboratif

Avec le développement continu de la technologie Internet, de plus en plus de sites Web et d'applications commencent à se concentrer sur l'expérience utilisateur et les recommandations personnalisées. Le système de recommandation en constitue un élément extrêmement important. Il peut recommander le contenu qui correspond le mieux aux intérêts de l'utilisateur en fonction de son comportement historique et de ses préférences. Cet article présentera comment utiliser le framework Workerman pour implémenter un système de recommandation de films basé sur un filtrage collaboratif.

1. Algorithme de filtrage collaboratif

Le filtrage collaboratif est l'un des algorithmes les plus couramment utilisés dans les systèmes de recommandation. Il prédit l'évaluation des éléments inconnus par l'utilisateur ou s'il aimera cet élément en fonction du comportement et des préférences historiques de l'utilisateur. L'idée de base de l'algorithme de filtrage collaboratif est de découvrir les similitudes entre les utilisateurs et les similitudes entre les éléments. Parmi eux, la similarité entre les utilisateurs peut être réalisée en calculant la similarité des notes historiques des utilisateurs, et la similarité entre les éléments peut être réalisée en calculant les notes de différents utilisateurs sur différents éléments.

2. Introduction au framework Workerman

Workerman est un framework de communication réseau hautes performances développé en PHP pur. Il adopte un modèle d'E/S asynchrone non bloquant et présente les caractéristiques d'une concurrence élevée, de hautes performances, d'une faible consommation d'énergie, etc. ., et peut gérer un grand nombre de tâches de longue durée à haute concurrence. La connexion peut être utilisée pour réaliser une messagerie instantanée distribuée, des jeux en ligne, l'Internet des objets et d'autres scénarios.

3. Utilisez Workerman pour implémenter un système de recommandation de films basé sur un filtrage collaboratif

  1. Préparation des données

Tout d'abord, nous devons préparer l'ensemble de données de classification du film. L'ensemble de données contient l'ID de l'utilisateur, l'ID du film et la note de l'utilisateur du film. film. L'ensemble de données peut être téléchargé à partir du site Web MovieLens, par exemple, téléchargez le package ml-100k.zip. Après décompression, vous pouvez obtenir le fichier u.data, qui contient 100 000 enregistrements de notation. Le format de l'ensemble de données est le suivant :

UserID | MovieID | Rating | Timestamp
---------------------------------------
   196  |    242  |      3 | 881250949
   186  |    302  |      3 | 891717742
   196  |    377  |      1 | 878887116
...
  1. Créer un modèle d'évaluation des utilisateurs

Selon l'ensemble de données de classification des films, nous pouvons créer un modèle d'évaluation des utilisateurs, qui peut interroger les évaluations de l'utilisateur pour tous les films en fonction du ID de l'utilisateur. Voici un exemple de modèle simple d'évaluation des utilisateurs :

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;
    }
}
  1. Créer un modèle de filtrage collaboratif

Sur la base du modèle d'évaluation des utilisateurs établi, nous pouvons créer un modèle de filtrage collaboratif, qui peut prédire l'évaluation des films inconnus par l'utilisateur en fonction sur le score de notation historique de l'utilisateur. Voici un exemple simple de modèle de filtrage collaboratif :

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);
    }
}
  1. Créer un service de système de recommandation

Sur la base du modèle de filtrage collaboratif ci-dessus, nous pouvons créer un service de système de recommandation qui peut recevoir l'ID utilisateur et l'ID de film comme paramètres et renvoyer le utilisateur Note prévue pour ce film. Voici un exemple simple de service de système de recommandation :

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();
  1. Test d'un service de système de recommandation

Enfin, on peut tester le service de système de recommandation en envoyant une requête HTTP, par exemple :

http://localhost:8888?userId=1&movieId=1

La requête renverra une réponse au format JSON, contient la note prévue par l'utilisateur pour le film.

IV.Résumé

Cet article présente comment utiliser le framework Workerman pour implémenter un système de recommandation de films basé sur un filtrage collaboratif. Ce système peut prédire la note de l'utilisateur sur les films inconnus en fonction de son comportement historique et de ses préférences. L'exemple de code n'est qu'une simple implémentation. Dans les applications réelles, de nombreux facteurs doivent être pris en compte, tels que la taille des données, l'optimisation de l'algorithme, la formation du modèle, etc. J'espère que cet article pourra aider les lecteurs à comprendre et à mettre en œuvre des systèmes de recommandation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn