MovieLens数据集处理
有一个定律,对于内容的访问遵循80/20原则,也就是20%的内容,会占有80%的访问量。就是zipf分布[1]。
根据MovieLens的数据集中的ratings.dat,我做了数据处理,获取得分最高的2000个条目。
ml-pro.py
import os
import heapq
from datetime import datetime
kMonthInSecond=30*24*60*60
def getUserInfo(filename,id,col,sep='::'):ret=[]with open(filename,'r') as f:for line in f.readlines():lineArr= line.strip().split(sep)if int(lineArr[0])==id:ret.append(lineArr[col])return ret
def unixTime2date(ts):return datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
def getStartAndEnd(filename,col,sep='::'):minV=0maxV=0with open(filename,'r') as f:for line in f.readlines():lineArr= line.strip().split(sep)v=int(lineArr[col])if minV==0 and maxV==0:minV=maxV=velse:if v<minV:minV=vif v>maxV:maxV=vreturn minV,maxV
class Score(object):def __init__(self,id,v=0,c=0):self.id=idself.v=vself.count=cdef __lt__(self, other):if self.v<other.v:return Trueelse:return False
def processTopKRate(filename,dst,K,sep='::'):rate_dict={}heap=[]maxV=0poll_num=0with open(filename,'r') as f:for line in f.readlines():lineArr= line.strip().split(sep)id=int(lineArr[1])score=int(lineArr[2])obj=rate_dict.get(id)poll_num=poll_num+1if obj is None:rate_dict.update({id:Score(id,score,1)})else:obj.v=obj.v+scoreobj.count=obj.count+1if maxV is 0 or obj.v>maxV:maxV=obj.vif K>len(rate_dict):K=len(rate_dict)for item in rate_dict.items():heapq.heappush(heap, item[1])if len(heap)>K:heapq.heappop(heap)heap.sort(reverse=True)print(maxV)with open(dst,'w') as f:i=1accum=0for s in heap:accum=accum+s.countratio=100.0*accum/poll_numf.write(str(i)+"\t"+str(s.id)+"\t"+str(s.v)+"\t"+str(ratio)+"\n")i=i+1return heap
def processMovieTime(filename,movieId,col=3,sep='::'):minV=0maxV=0with open(filename,'r') as f:for line in f.readlines():lineArr= line.strip().split(sep)index=int(lineArr[1])v=int(lineArr[col])if index==movieId:if minV==0 and maxV==0:minV=maxV=velse:if v<minV:minV=vif v>maxV:maxV=vif maxV>minV:dst="movie_"+str(movieId)+".txt"slot=(maxV-minV+kMonthInSecond-1)/kMonthInSecondcount=[]for i in range(slot):count.append(0)with open(filename,'r') as f:for line in f.readlines():lineArr= line.strip().split(sep)index=int(lineArr[1])v=int(lineArr[col])if index==movieId: i=(v-minV)/kMonthInSecondcount[i]=count[i]+1with open(dst,'w') as f:i=1for v in count:f.write(str(i)+"\t"+str(v)+"\n")i=i+1return minV,maxV
if __name__=='__main__':filename="ratings.dat"data=getUserInfo(filename,1,3)minV,maxV=getStartAndEnd(filename,1)print(minV,maxV)res=processTopKRate(filename,"res.txt",2000)processMovieTime(filename,res[0].id)processMovieTime(filename,res[1].id)processMovieTime(filename,res[2].id)processMovieTime(filename,res[3].id)processMovieTime(filename,res[4].id)
绘图脚本score-plot.sh:
#! /bin/sh
file1=res.txt
output=out
gnuplot<<!
set xlabel "index"
set ylabel "score"
set xrange [0:2000]
set yrange [0:15000]
set term "png"
set output "${output}.png"
plot "${file1}" u 1:3 title "flow1" with lines lw 2 lc 1
set output
exit
!
结果out.png:
大概有4000个电影id。上图中,当index为1200时,已经累计有80%的用户打分。内容占据比例:1200/4000=30%。
函数processMovieTime处理用户对电影的打分时间,unix时间转化成月份序号。
绘图脚本,req-plot.sh
#! /bin/sh
file1=movie_260.txt
file2=movie_1196.txt
file3=movie_1210.txt
file4=movie_2028.txt
file5=movie_2858.txt
output=req
gnuplot<<!
set xlabel "index"
set ylabel "score"
set xrange [0:40]
set yrange [0:800]
set term "png"
set output "${output}.png"
plot "${file1}" u 1:2 title "movie1" with lines lw 2 lc 1,\
"${file2}" u 1:2 title "movie2" with lines lw 2 lc 2,\
"${file3}" u 1:2 title "movie3" with lines lw 2 lc 3,\
"${file4}" u 1:2 title "movie3" with lines lw 2 lc 4,\
"${file5}" u 1:2 title "movie3" with lines lw 2 lc 5
set output
exit
!
结果:
Reference
[1]Zipf分布
[2]推荐系统–MovieLens数据集
MovieLens数据集处理相关推荐
- movielens数据集下载
movielens数据集下载 主要是原网站下载速度太慢 百度云: 复制这段内容后打开百度网盘App,操作更方便哦. 链接:https://pan.baidu.com/s/1QO99QeUa-GEacl ...
- 使用文本卷积神经网络,并使用MovieLens数据集完成电影推荐的任务
使用文本卷积神经网络,并使用MovieLens数据集完成电影推荐的任务 import pandas as pd from sklearn.model_selection import train_te ...
- Movielens数据集详细介绍
MovieLens数据集包含多个用户对多部电影的评级数据,也包括电影元数据信息和用户属性信息.下载地址为:http://files.grouplens.org/datasets/movielens/ ...
- movielens数据集导入mysql_GitHub - Colaplusice/movielens_recommend: 基于movielens数据集的电影推荐系统...
毕业设计--基于Django的电影推荐系统和论坛 说明 注册普通用户通过web界面来设置,创建创建用户通过creeatsuperuser创建.下文有详细命令 导入电影信息通过insert_movies ...
- python亲和性分析法推荐电影论文_数据挖掘-MovieLens数据集_电影推荐_亲和性分析_Aprioro算法...
#!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Feb 7 14:38:33 201 ...
- grouplens上的movielens数据集_ItemCF算法的Python实现,数据基于MovieLens
数据从 MovieLens数据下载地址 https://grouplens.org/datasets/movielens/ 下载. 我选的是1MB版本,大约10W+评分,9K+电影,600+用户. 使 ...
- movielens数据集导入mysql_我来做数据--如何对数据进行处理以满足机器学习技术(一):MovieLens数据...
标签(空格分隔): 数据分析 python 数据挖掘 MovieLens 1M数据集 一组从20世纪90年末到21世纪初由MovieLens用户提供的电影评分数据.这些数据中包括电影评分.电影元数据( ...
- Learning: 利用Python进行数据分析 - MovieLens 数据集的探索
MovieLens 1M数据集含有来自6000名用户对4000部电影的100万条评分数据,分为三个表,movies.ratings.users 数据处理 通过pandas.read_table将各表转 ...
- 《Spark机器学习》笔记——基于MovieLens数据集使用Spark进行电影数据分析
1.数据集下载 https://grouplens.org/datasets/movielens 2.数据集下文件格式 u.user用户属性文件 包含user.id用户ID gender性别 ...
最新文章
- Symfony2 学习笔记之命令app/console
- /bin/bash: jar: command not found
- centos7下安全访问远程服务器
- Java JUC工具类--CyclicBarrier
- 多态应用-打印商品价格案例
- GNUstep 运行gui程序
- 关于appium的下载安装及环境配置(含nodejs下载安装)
- 如何将国际音标插入到Word中? | 怎么打48个国际音标?
- 阿里云主要产品及功能介绍,阿里云产品分为6大分类:云计算基础/安全/大数据/人工智能/企业应用/物联网
- 新知实验室 TRTC在线上教育场景中的一种应用实践
- muma很可能在陪你玩游戏
- python爬虫概述及简单实践
- CentOS8 编译安装tsar nagios + nagios-plugins + nsca
- Oracle 19C 下载和安装
- sql基础_SQL基础
- 机器学习从零到一的基础知识总集篇
- 【mysql入门笔记01 2022.9.27】
- WOE(Weight of Evidence)证据权重
- 汽车零部件行业应用APS的必要性
- 点阵LCD12864的显示原理(不带字库)
热门文章
- 小学计算机程序竞赛,25届宁波市中小学计算机程序设计竞赛初赛试题
- 公钥密码学中的公钥和私钥
- AdminLTE入门使用
- 微信小程序图片空白问题处理
- 为什么我要用GoEasy替代WebSocket
- 网络编程 网络地址点分十进制和二进制之间的转换
- python大神代码_求python大神写一个windows可运行的代码,学习学习。
- 安卓下的c语言ide,C语言编译器IDE安卓版下载-C语言编译器IDE下载v1.7 最新版-腾牛安卓网...
- 阿里巴巴的 eclipse 代码检查工具如何安装?
- windows server 2003的驱动