• 关于数据挖掘推荐系统实现


    先说一说问题,不知道大家有没有这样的经验,反正我是经常碰到。

    举例1,某些网站每隔几天就发邮件给我,每次发的邮件内容都是一些我根本不感兴趣的东西,我不甚其扰,对其深恶痛绝。
    举例2,添加具有某功能的一个msn机器人,每天都有几次突然蹦出一个窗口,推荐一堆我根本不想知道的内容,烦不烦啊, 我只好将你阻止掉。

    每一个观众只想看他感兴趣的东西,而不是一下与之无关的事物,那么如何才能知道观众的兴趣所在呢,还是数据挖掘,经过一番思考,终于有点思路,即根据用户以往的浏览历史来预测用户将来的行为,也就是基于内容的推荐。
    基于内容的推荐(Content-based Recommendation)是信息过滤技术的延续与发展,它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机 器学习的方法从关于内容的特征描述的事例中得到用户的兴趣资料。在基于内容的推荐系统中,项目或对象是通过相关的特征的属性来定义,系统基于用户评价对象 的特征,学习用户的兴趣,考察用户资料与待预测项目的相匹配程度。用户的资料模型取决于所用学习方法,常用的有决策树、神经网络和基于向量的表示方法等。 基于内容的用户资料是需要有用户的历史数据,用户资料模型可能随着用户的偏好改变而发生变化。

    基于内容推荐方法的优点是:
    1)不需要其它用户的数据,没有冷开始问题和稀疏问题。
    2)能为具有特殊兴趣爱好的用户进行推荐。
    3)能推荐新的或不是很流行的项目,没有新项目问题。
    4)通过列出推荐项目的内容特征,可以解释为什么推荐那些项目。
    5)已有比较好的技术,如关于分类学习方面的技术已相当成熟。

    缺点是要求内容能容易抽取成有意义的特征,要求特征内容有良好的结构性,并且用户的口味必须能够用内容特征形式来表达,不能显式地得到其它用户的判断情况。

    要实现内容推荐系统总体来说要经过4个大的步骤:
    1 搜集数据,即搜集用户的行为资料,其中也包括很多方法,根据我找到的资料与以往的经验来看,web日志可以作为我们的切入点,即我们的数据来源。

    2 过滤数据,web日志中有很多无用的信息,我们要把这些无用的信息排除掉,而且要区分出用户和日志数据之间的联系。

    3 分析数据,利用分类聚类技术分析出这些日志数据之间的关联性,以及这些日志数据和用户之间的关联性,这也是最重要的一步。

    4 输出结果。

    有了这个思路之后,我们可以着手做第一步,即日志数据的收集
    我们知道,大多数的web服务器都是有自己的日志记录的,比如说apache安装之后有一个logs目录,其中就有它的日志文件,一般说来它有自己的一个格式,比如说:
    1浏览器所在主机的 IP 地址(ip); 2访问日期和时间(date-time);3客户机与服务器通信所用的方法(methed,get or post); 4客户机请求访问页面的 URL; 5服务器返回的状态(status); 6客户端浏览器的类型;

    但是这个日志文件有一些不能克服的问题,或者我不知道如何克服,那么我先说说我的疑问,首先,这个日志文件中记录的是ip地址,据了解,网络中有很 多计算机的ip地址是相同的,因为他们在一个统一的路由后面,这个比例可能达到25%。那么我们就无法根据ip地址来唯一确定一个用户。其次,一般的 web服务器中都会用多个应用,那么其他应用的访问信息对我们来说有可能是多余的。再者,web服务器的日志形式比较单一,灵活性不大,可定制的余地很 小,在日志数据中有效数据所占的比例较小。还有,一些静态文件的请求也会被web服务器记录下来,比如说js文件,css文件,还有图片文件,等等这些东 西对内容推荐来说都是无用的资源。

    基于上面3点原因,我认为可以自定义日志数据。为了解决用户唯一性,我们让应用为每一个浏览器生成一个clientId保存在对应的浏览器上,这样 该浏览器只要访问网站,我们就可以确定这个浏览器的唯一性,当然我们仍然不能确定浏览器使用者的唯一性,但是我们可以更进一步,如果浏览器的使用者登陆网 站的话,我们就可以使用用户id来确定用户的唯一性,不过大多数网站用户可能在使用网站的时候并不会登陆,我也是这样,没有关系,即使使用 clientId问题也不会太大,随着社会的发展,计算机的拥有量逐渐增加,一般来说一个人只会使用一台固定的电脑,在公司里尤其是这样。所以我认为 clientId的方案是可行的,也许有人要问,别人的浏览器禁止了cookie怎么办,那么我只能说没有办法,不过还好事实是绝大多数人都没有这样做。

    接下来我们可以定义一下我们所需要的日志数据的格式,比如这样,
    ip,clientId,userId,url,datetime,get or post等等。
    这样数据有效性会大大提高。

    在得到较为有效的数据之后,我们还需要对这些数据进行再次过滤:
    1 去掉一些非内容的url,这些数据也是无效数据,这些非内容的url需要我们自己手工的统计出来,然后和日志数据中的数据进行比对,将这些非内容数据从日志数据中清除出去。
    2 同时我们也需要把post请求从日志数据中清除出去,或者我们在记录日志的时候根本不应该把post请求记录下来。

    经过以上步骤之后我们就可以开始第3个阶段了,统计每个用户的访问的url,对这些url进行访问,得到对应的html中所包含的数据,这些数据都是文本,将有用的文本提取出来,然后对这些有用的文本进行聚类。这样就可以得到每个用户喜欢的几个类别。

    聚类完成之后我们就可以开始分类了,即把最新的文章或者内容和对应的类别进行匹配,匹配成功之后,我们可以认为这个新文章或者内容可以推荐给对应的用户。

    问题:以上的流程只适用于没有使用缓存的系统,但是一般大型的网站都会使用varnish,squid等等,使用它们之后我们就无法得到用户访问的日志数据了,所以如果使用了varnish或者squid,我们不得不再次面对web服务器的日志数据。

    在不考虑varnish或者squid的情况下,使用lucene+jamon+htmlparse基本就可以实现以上推荐系统。

  • 相关阅读:
    PHP中require()文件包含的正确用法
    Android Studio开发环境的配置
    卡宴
    Android Studio 简单介绍和使用问题小结
    android:ToolBar详解(手把手教程)
    Android --- 读取系统资源函数getResources()小结
    Android Studio 提示Error running app: No Android facet found for app
    iOS开发之-- 抢购、距活动结束,剩余时间倒计时
    iOS开发之--实现倒计时显示时分秒
    iOS开发之--获取验证码倒计时及闪烁问题解决方案
  • 原文地址:https://www.cnblogs.com/Jerry-blog/p/5044572.html
Copyright © 2020-2023  润新知