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
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
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
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
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
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