当前位置:文档之家› 电子商务智能推荐服务

电子商务智能推荐服务

实现如下目标•按地域研究用户访问时间、访问内容和访问次数等分析主题,深入了解用户对访问网站的行为和目的及关心的内容。

•借助大量用户访问记录,发现用户的访问行为习惯,对不同需求的用户进行相关的服务页面的推荐分析本案例的目标是对用户进行推荐,即以一定的方式将用户与物品之间(本案例指网页)之间建立联系。

为了更好地帮助用户从海量的数据中快速发现感兴趣的网页,在目前相对单一的推荐系统上进行补充,采用协同过滤算法进行推荐。

由于用户访问网站的数据记录很多,如果对数据不进行分类处理,对所有记录直接采用推荐系统进行推荐,必然出现如下问题。

数据量太大意味着物品数与用户数很多,在模型构建用户与物品的稀疏矩阵时,出现设备内存空间不够的情况,并且模型计算需要消耗大量的时间。

用户区别很大,不同的用户关注的信息不一样,因此,即使能够得到推荐结果,其推荐效果也不会很好。

为了避免出现上述问题,需要进行分类处理与分析。

正常的情况下,需要对用户的兴趣爱好以及需求进行分类。

因为在用户访问记录中,没有记录用户访问网页时间的长短,因此不容易判断用户的兴趣爱好。

因此,本文根据用户浏览的网页信息进行分类处理,主要采用以下方法处理:以用户浏览网页的类型进行分类,然后对每个类型中的内容进行推荐。

整个分析过程可以分为如下过程从系统中获取用户访问网站的原始记录。

对数据进行多维度分析,包括用户访问内容,流失用户分析以及用户分类等分析。

对数据进行预处理,包含数据去重、数据变换和数据分类等处理过程。

以用户访问html后缀的网页为关键条件,对数据进行处理。

对比多种推荐算法进行推荐,通过模型评价,得到比较好的智能推荐模型。

通过模型对样本数据进行预测,获得推荐结果。

处理过程数据获取因为本案例是以协同过滤算法为主导,其他的推荐算法为辅助,而协同过滤算法的特点就是通过历史数据找到相似的用户或者网页。

因此,在数据抽取的过程中,尽可能选择大量的数据,这样可以降低推荐结果的随机性,提高推荐结果的准确性,能更好地发掘长尾网页中用户感兴趣的网页。

以用户的访问时间为条件,选取三个月内(2015-02-21~2015-04-29)用户的访问数据作为原始数据集。

每个地区的用户访问习惯以及兴趣爱好存在差异性,本案例抽取广州地区数据进行分析,共837453条记录,所含属性见数据集。

处理过程为:建立数据库—>导入数据(导入方法自行查阅,一般使用mysql的source 命令)—>搭建Python的数据库操作环境—>对数据进行分析—>建立模型。

其中,数据库为mariaDB(免费版本的MySQL)。

安装数据库后导入案例的原始数据文件raw.sql就成功配置好了数据库平台。

# 访问MySQL数据库示例程序# 加载RMySQL包require(RMySQL)# 建立R与数据库的连接con <- dbConnect(MySQL(), host = "127.0.0.1", port = 3306, dbname = "new",user = "root", password = "root")# 修改成自己数据库名称、用户名、密码、端口等# 修改此连接的编码为中文,只针对此连接有效。

dbSendQuery(con, "set character_set_results = gbk")dbSendQuery(con, "set character_set_connection = gbk")dbSendQuery(con, "set character_set_database = gbk")dbSendQuery(con, "set character_set_client = gbk")# R通过连接对表按条件查询,查询fullurl中带有_的并且fullurlid为107001的数据(即知识类型页面)con_query <- dbSendQuery(con, "select * from all_gzdata where fullurlid = 107001")# 提取查询到的数据,n=-1代表提取所有数据,n=100代表提取前100行data <- dbFetch(con_query, n = -1)# 以下命令将本地的数据写入数据表中,name表示写入的表名# value表示需要写入的数据# dbWriteTable(con, name="info", value=info_d, append = T, s = T)# 关闭连接dbDisconnect(con)# 如果需要通过R的连接进行中文查询,可能需要修改下面的编码# set character_set_client = gbk;客户端编码方式# set character_set_connection = gbk;建立连接使用的编码# set character_set_database = gbk;数据库的编码# set character_set_results = gbk;结果集的编码# set character_set_server = gbk;数据库服务器的编码数据探索•网页类型分析•作为第一步,针对原始数据中用户点击的网页类型进行统计,网页类型是指“网址类型”的前三位数字(本身有6-7位数字)。

前面已经提到过,此处处理的要义在于“分块进行”,必要时可以使用多线程或者分布式计算。

可以发现点击“咨询相关”(网页类型101的)最多,其次是“其他类型”(网页类型199的),然后是“知识相关”。

可以得到用户点击页面类型的排行榜为:咨询相关、知识相关、其他方面的网页、法规(301)、律师相关(102)。

可以初步得出相对于长篇的知识,用户更加偏向于查看咨询或者进行咨询。

对咨询类别内部进行统计分析,可以发现咨询内容页(101003)记录最多,其次是咨询列表页(101002)和咨询首页(101001)。

综合上述初步结论,可以得出用户都喜欢通过浏览问题的方式找到自己需要的信息而不是以提问的方式或者查看长篇知识的方式得到所需信息。

对知识相关进行分析,因为只有一种类型(107001),所以利用网址进行分类,主要利用正则表达式进行匹配。

对其他方面进行分析,其中网址带有“?”的占了32%左右,其他咨询相关与法规专题占比达到43%,地区和律师占比26%。

在网页分类中,已经存在了律师等分类,为什么还会存在于其他类别中呢,这是由于网页地址没有匹配到这种格式。

通过对这三种分析,用户的一般使用情况为:咨询内容页、知识内容页、法规专题页、咨询经验(在线咨询页)。

因此,在后续分析中选取占比最多的两类(咨询内容页和知识内容页)进行模型分析。

点击次数分析统计分析原始数据用户浏览网页次数(以“真实IP”区分)的情况可以看出,大约80%的用户(不超过3次)只提供了大约30%的浏览量(几乎满足二八定律)。

在数据中,点击次数最大值为42790次,对其进行分析,发现是律师的浏览信息(通过律师助手进行判断)。

对浏览次数达到7次以上的情况进行分析,大部分用户浏览8-100次。

对浏览次数为1次的用户进行分析,问题咨询页占比78%,知识页占比15%,而且这些记录基本上是通过搜索引擎进入的。

由此可以猜测两种可能:1)用户为流失用户,没有找到自己的需要;2)用户找到了自己想要的信息,因此直接退出。

可以归结为跳出率,需要对这些网页进行针对用户的个性化推荐,帮助用户发现其感兴趣或者需要的网页,针对点击一次的用户浏览的网页进行统计分析,发现排名靠前的都是知识与咨询页面,因此可以猜测大量用户的关注都在知识和咨询上。

网页排名通过查看各个页面的点击率,和通过搜索引擎进入后翻页的概率,从而决策。

数据预处理数据清洗去除无用数据。

require(plyr)# 利用R对数据进行处理,去除多余的属性列,保留用户ip,与访问网址列info <- data[,c(1,11)]# 亦可采用下列方法去除多余属性列# info <- data.frame(cbind(realIP = data$realIP, fullURL = data$fullURL), stringsAsFactors = F)# 处理info类型中存在带有“?”的网址info[,2] <- gsub("\\?.*", "", info[, 2], perl = T)detach("package:RMySQL")# 这里采用sqldf包里的sqldf命令,通过SQL进行删选翻页与不翻页的网页。

info_d <- sqldf::sqldf("select * from info where fullurl like '%!_%' escape '!'")info_q <- sqldf::sqldf("select * from info where fullurl not like '%!_%' escape '!' ")# 读入ask类型的数据,并删选用户与项目属性ask_data <- read.csv(file = "g:/ask02.csv", header = T, stringsAsFactors = F)askitem <- ask_data[, c(1, 2)]# 将ask数据去重处理item_ask <- ddply(askitem, .(realIP,FULLURL), tail, n = 1)数据变换识别翻页,对翻页进行还原。

# 采用正则匹配那些带有翻页的网址,匹配网址的特点为:数字_页数.html的形式stri_p <- regexec("(^.+/\\d+)_\\d{0,2}(.html)", info_d[, 2])# 去除list_1.html形式的网页,以及与其类似的网页infol <- info_d[-(which(sapply(stri_p, length) != 3)), ]# 提取正则匹配到的数据,并将数据进行粘接parts <- do.call(rbind, regmatches(info_d[, 2], stri_p))pas <- paste0(parts[, 2], parts[, 3])# 或者采用命令paste(parts[,2],parts[,3],collapse = NULL)# 将数据进行列组合,并且重新命名,对比处理前后的数据combine <- cbind(parts, pas)colnames(combine) <- c("fullurl", "temp1", "temp2", "new")do.data <- data.frame((combine[, c(1, 4)]), stringsAsFactors = F)# 如果不加stringsAsFactors参数,可能会将其中的数据类型转换为factor型# 可以通过下列命令进行转换处理# do.data[,1] <- as.character(do.data[, 1])# do.data[,2] <- as.character(do.data[, 2])# 判断处理前后的两列数据以及数据位置是否相同?all.equal(infol[, 2], do.data[, 1])# 如果返回为TRUE,两种数据集的连接采用如下方式condata <- data.frame(cbind(infol[, 1], do.data[, 2]), stringsAsFactors = F)colnames(condata) <- names(info_q)# 如果判断结果为FALSE,可以采用如下方法# 找到原始数据在处理后的数据集中的位置,将两种数据集进行连接# pn <- data.frame(cbind(infol[,2], do.data[match(infol[, 2], do.data[, 1]), ]), stringsAsFactors = F) # 如果pn中存在因子型,需要将其转换字符型# for(i in 1:dim(pn)[2]) pn[,i] <- as.character( pn[, i]) all.equal(pn[, 1], pn[, 2])# condata <- cbind(infol[, 1], pn[, 3])# colnames(condata) <- names(info_q)# 采用行连接将处理翻页后的数据与没有翻页的数据综合item_info <- rbind(info_q, condata)# 去重数据,以IP和网址划分数据集,选择其相同数据中的最后一条数据user_info <- ddply(item_info, .(realIP,fullURL), tail, n = 1)# 对网址进行处理,以/ 符合划分网址,获得其类别,结果为list型web <- strsplit(user_info[,2], "/", fixed = TRUE)# 对每个LIST型的数据,将其组合成数据框的格式bine <- ldply(web, rbind)# 获取知识列表中婚姻类别的数据以及在原始数据中的位置hunyi <- bine[which(bine[,5] == "hunyin"), ]item_hunyi <- user_info[s(hunyi), ]# 或者采用更简单的办法,用SQL语句查询包含婚姻知识的关键字# item_hunyi <- qldf::sqldf("select * from user_info where fullurl like '%info/hunyin%' ")属性规约本案例需要的是用户与用户访问的网页,因此,删除其他属性。

相关主题