示例#1
0
    def AgregationStrategies(self, estrategia, canciongrupo, usuarios):
        cancionesscore = []
        if (estrategia == 1):
            for c in canciongrupo:
                score = []
                evaluado = 0
                for y in usuarios:
                    resp = next(
                        (l
                         for l in y.CancionRecomendar if l.SongId == c.SongId),
                        None)
                    if resp is not None:
                        score.append(resp.SongPred)
                minval = min(score)
                newcancion = cs.Cancion(c.SongId, "title", minval)
                newcancion.SongPred = minval
                cancionesscore.append(newcancion)

        if (estrategia == 3):
            for c in canciongrupo:
                score = []
                evaluado = 0
                for y in usuarios:
                    resp = next(
                        (l
                         for l in y.CancionRecomendar if l.SongId == c.SongId),
                        None)
                    if resp is not None:
                        score.append(resp.SongPred)
                meanval = statistics.mean(score)
                newcancion = cs.Cancion(c.SongId, "title", meanval)
                newcancion.SongPred = meanval
                cancionesscore.append(newcancion)

        if (estrategia == 2):
            for c in canciongrupo:
                score = []
                evaluado = 0
                for y in usuarios:
                    resp = next(
                        (l
                         for l in y.CancionRecomendar if l.SongId == c.SongId),
                        None)
                    if resp is not None:
                        score.append(resp.SongPred)
                maxval = max(score)
                newcancion = cs.Cancion(c.SongId, "title", maxval)
                newcancion.SongPred = maxval
                cancionesscore.append(newcancion)

        return cancionesscore
示例#2
0
def RecommendSongsEvalAlgorithm(user, predictions, model):
    cancion = []
    cancionrecomendar = []
    for c in user.CancionRecomendar:
        result = predictions[predictions['song_id'] == c.SongId]
        resp = next((l for l in user.Canciones if l.SongId == c.SongId), None)
        if (len(result.values) > 0):
            cnscoren = cs.Cancion(c.SongId, "title",
                                  result["listen_count"].values.flat[0])
            cnscoren.SongPred = result["prediction"].values.flat[0]
            cancionrecomendar.append(cnscoren)
            if (resp != None):
                canew = cs.Cancion(c.SongId, "title",
                                   result["listen_count"].values.flat[0])
                canew.ListenCount = result["listen_count"].values.flat[0]
                cancion.append(canew)
        else:
            result = model.predict(user.UsuarioId, iid=c.SongId)
            cnscoren = cs.Cancion(c.SongId, "title", result.est)
            cnscoren.SongPred = result.est
            cancionrecomendar.append(cnscoren)
    user.CancionRecomendar = cancionrecomendar
    user.Canciones = cancion
示例#3
0
def RecommendNumSongs(model, userid, songs, numrecommend):

    cancionusuario = []
    for index, row in songs.iterrows():

        songid = (row["song_id"])
        result = model.predict(userid, iid=songid)
        cancion = cs.Cancion(row["song_id"], str(row["title"]), result.est)
        cancion.ArtistName = str(row["artist_name"])
        cancion.Release = str(row["release"])
        cancion.Year = row["year"]
        cancion.SongPred = result.est
        cancionusuario.append(cancion)

    cancionusuario = sorted(cancionusuario,
                            key=lambda cancionuser: cancionuser.ListenCount,
                            reverse=True)
    cancionusuario = cancionusuario[:numrecommend]
    newuser = cs.Usuario(userid, cancionusuario)
    return newuser
示例#4
0
    def EvalAlgorithm(self, numrecomendation, usuarioId):
        db = GrupoService()
        grupousuario = db.getGrupoByUsuario(usuarioId)
        usuarios = []
        for u in grupousuario.users:
            usuarios.append(u.id)
        model = self.mn.SvdAlgorithm(self.k)
        Listgrupos = []
        usuariogrupo = []
        usuariorecommend = []
        cancionesscore = []
        listcanciones = []
        cancionesprohibidas = []
        songid = self.mn.UserRating["song_id"]
        songid = songid.unique()
        datasearcheable = self.mn.UserRating.set_index('user_id')
        ud = datasearcheable[datasearcheable.index == (usuarioId)]
        songescuchadaid = ud["song_id"].unique()
        cancionescuchada = self.canciones[self.canciones.song_id.isin(
            songescuchadaid)]
        canciones = []
        for index, row in cancionescuchada.iterrows():
            cancion = cs.Cancion(row["song_id"], str(row["title"]), 0)
            cancion.ArtistName = str(row["artist_name"])
            cancion.Release = str(row["release"])
            cancion.Year = row["year"]
            canciones.append(cancion)

        for y in usuarios:
            user_data = datasearcheable[datasearcheable.index == (y)]
            user_data = user_data["song_id"]
            for c in user_data:
                cancionesprohibidas.append(c)
        cancionesprohibidas = list(set(cancionesprohibidas))
        self.canciones = (self.canciones[self.canciones.song_id.isin(songid)])
        self.canciones = (
            self.canciones[~self.canciones.song_id.isin(cancionesprohibidas)])
        cancionusuario = []
        for y in usuarios:
            usuario = bg.RecommendNumSongs(model, y, self.canciones, 200)
            usuariogrupo.append(usuario)
            for c in usuario.Canciones:
                cancionusuario.append(c.SongId)
                listcanciones.append(c)

        cancionusuario = list(dict.fromkeys(cancionusuario))

        for c in cancionusuario:
            score = []
            for y in usuariogrupo:
                resp = next((l for l in y.Canciones if l.SongId == c), None)
                if resp is not None:
                    score.append(resp.ListenCount)
                else:
                    result = model.predict(y.UsuarioId, iid=c)
                    score.append(result.est)
            scoref = min(score)
            cancion = next((l for l in listcanciones if l.SongId == c), None)
            cancion.Score = scoref
            cancionesscore.append(cancion)
        cancionesscore = sorted(
            cancionesscore,
            key=lambda cancionuser: cancionuser.ListenCount,
            reverse=True)
        cancionrecomendar = cancionesscore[0:numrecomendation]
        recomend = cs.Recomendacion(canciones, cancionrecomendar)
        return recomend
示例#5
0
def ArmarGruposDefAleatorioEval(df1, songs, traindata, datarating):
    usergroups = []
    a = []
    test_searcheable = datarating.set_index('user_id')
    m = 1
    totalcomun = 0
    while (len(df1) > 0):
        userlist = []
        cancionrecomendar = []
        n = random.randint(3, 5)
        listcanciones = []
        dictcanciones = {}
        userlistid = []
        cancionprohibida = []
        for x in range(0, n):
            if len(df1) > 0:
                user = df1[0]
                df1 = df1[df1 != user]
                userlistid.append(user)
                userInnerId = traindata.to_inner_uid(user)
                trainset = traindata.ur[userInnerId]
                for s in trainset:
                    innerid = s[0]
                    c = traindata.to_raw_iid(innerid)
                    cancionprohibida.append(c)

        for x in userlistid:

            usuariocancionlst = []
            cancionusuario = []
            if 1 > 0:
                user = x
                user_data = test_searcheable[test_searcheable.index == (user)]
                if len(user_data) > 0:
                    user_data = user_data["song_id"]
                    for uc in user_data:
                        if (uc not in cancionprohibida):
                            newcancion = cs.Cancion(uc, "title", 0)
                            cancionusuario.append(newcancion)
                            usuariocancionlst.append(uc)
                        """if(uc in dictcanciones):
                            dictcanciones[uc] = dictcanciones[uc]+1
                        else:
                            dictcanciones[uc]=1"""

                newuser = cs.UsuarioArmarGrupo(user, len(user_data))
                newuser.Canciones = cancionusuario
                listcanciones.append(usuariocancionlst)
                userlist.append(newuser)
        listcancionrecomendar = []
        cancionesgrupo = []

        listcancionrecomendar = set(listcanciones[0])
        for s in listcanciones[1:]:
            listcancionrecomendar.intersection_update(s)

        if (listcancionrecomendar != set()):
            for i in listcancionrecomendar:

                newcancion = cs.Cancion(i, "title", 0)
                cancionesgrupo.append(newcancion)
            for u in userlist:
                u.CancionRecomendar = cancionesgrupo
                u.Canciones = cancionesgrupo
            newgroup = cs.GrupoUsuario(userlist, cancionesgrupo)
            newgroup.Identificador = "g" + str(m)
            if (len(userlist) > 1):
                usergroups.append(newgroup)
                m = m + 1
        else:
            listcancionrecomendar = []
            for u in userlist:
                for c in u.Canciones:
                    listcancionrecomendar.append(c.SongId)
            listcancionrecomendar = list(set(listcancionrecomendar))
            for i in listcancionrecomendar:
                newcancion = cs.Cancion(i, "title", 0)
                cancionesgrupo.append(newcancion)
            for u in userlist:
                u.CancionRecomendar = cancionesgrupo
            newgroup = cs.GrupoUsuario(userlist, cancionesgrupo)
            newgroup.Identificador = "g" + str(m)
            if (len(userlist) > 1):
                usergroups.append(newgroup)
                m = m + 1

    return usergroups
示例#6
0
def ArmarGruposDefSimilaresEval(df1, songs, traindata, datarating, simMatrix):
    usergroups = []
    test_searcheable = datarating.set_index('user_id')
    m = 1
    k = 1
    while (len(df1) > 0):
        userlist = []
        userlstid = []
        cancionrecomendar = []
        dictcanciones = {}
        listcanciones = []
        n = random.randint(2, 4)
        user = df1[0]
        testuserInnerId = traindata.to_inner_uid(user)
        similarUsers = []
        similarityrow = simMatrix[testuserInnerId]
        df1 = df1[df1 != user]
        for innerid, score in enumerate(similarityrow):
            if (innerid != testuserInnerId):
                usersimilarid = traindata.to_raw_uid(innerid)
                if usersimilarid in df1:
                    similarUsers.append((usersimilarid, score))
        Kneighbors = heapq.nlargest(n, similarUsers, key=lambda t: t[1])
        userlstid.append(user)
        for similaruser in Kneighbors:
            innerid = similaruser[0]
            df1 = df1[df1 != innerid]
            userlstid.append(innerid)
        cancionprohibida = []
        for i in userlstid:
            userInnerId = traindata.to_inner_uid(i)
            trainset = traindata.ur[userInnerId]
            for s in trainset:
                innerid = s[0]
                c = traindata.to_raw_iid(innerid)
                cancionprohibida.append(c)

        for i in userlstid:
            user_data = test_searcheable[test_searcheable.index == (i)]
            user_data = user_data["song_id"]
            usuariocancionlst = []
            cancionusuario = []
            for uc in user_data:
                if (uc not in cancionprohibida):
                    newcancion = cs.Cancion(uc, "title", 0)
                    cancionusuario.append(newcancion)
                    usuariocancionlst.append(uc)
                    """if(uc in dictcanciones):
                        dictcanciones[uc] = dictcanciones[uc]+1
                    else:
                        dictcanciones[uc]=1"""

            newuser = cs.UsuarioArmarGrupo(i, len(user_data))
            newuser.Canciones = cancionusuario
            listcanciones.append(usuariocancionlst)
            userlist.append(newuser)

        listcancionrecomendar = []
        listcancionrecomendar = set(listcanciones[0])
        for s in listcanciones[1:]:
            listcancionrecomendar.intersection_update(s)

        #listcancionrecomendar=set.intersection(listcanciones)
        """lenuser=len(userlist)
        for (key, value) in dictcanciones.items():
            if(value>=lenuser):
                listcancionrecomendar.append(key)"""
        cancionesgrupo = []
        if (listcancionrecomendar != set()):

            for i in listcancionrecomendar:

                newcancion = cs.Cancion(i, "title", 0)
                cancionesgrupo.append(newcancion)
            for u in userlist:
                u.CancionRecomendar = cancionesgrupo
                u.Canciones = cancionesgrupo
            newgroup = cs.GrupoUsuario(userlist, cancionesgrupo)
            newgroup.Identificador = "g" + str(m)
            if (len(userlist) > 1):
                usergroups.append(newgroup)
                m = m + 1

        else:
            listcancionrecomendar = []
            for u in userlist:
                for c in u.Canciones:
                    listcancionrecomendar.append(c.SongId)
            listcancionrecomendar = list(set(listcancionrecomendar))
            for i in listcancionrecomendar:
                newcancion = cs.Cancion(i, "title", 0)
                cancionesgrupo.append(newcancion)
            for u in userlist:
                u.CancionRecomendar = cancionesgrupo

            newgroup = cs.GrupoUsuario(userlist, cancionesgrupo)
            newgroup.Identificador = "g" + str(m)
            if (len(userlist) > 1):
                usergroups.append(newgroup)
                m = m + 1

    return usergroups