3 数据预处理
用户(User):一个用户是通过浏览器访问一个或多个Web服务器的个体。 页面文件(Page File):一个页面文件是Web服务器通过HTTP请求发给用户的文件。页面文件往往在Web服务器上静态存在。
页面视图(Page View):一个用户请求的页面,如frame、图片和script等,它们在用户浏览器上同时显示。页面视图通常与一个用户的行为相关,如一次鼠标点击。
点击流(Click Stream):用户访问的一组连续的页面浏览的序列。 用户访问会话(User Session):是指由一个用户发出的对Web的一次连续HTTP请求序列。
服务器用户访问会话(Server Session):简称用户访问事务(UserTransaction)。是指一个用户对一个Web服务器的一次访问,由这次访问网络日志中用户兴趣的挖掘及利用中的请求页面序列组成。
访问片断(Episode):任何有意义的用户访问会话或用户访问事务的子集。
3.3 Web日志数据预处理过程(Web Log Data Preprocessing)
数据预处理是为了将日志文件转换成数据库文件而进行的工作,其目的就是把Web日志转换为适合进行数据挖掘的精确数据,它包括数据清理、用户识别、会话识别、路径完整等几个阶段[28] [29]。
具体处理过程如图3-2。
页面过滤Web服务器日志文件 数据清理用户识别时间阀值会话识别站点拓扑结构路径完整序列事务文件
图3-2 数据预处理过程
Figure 3-2 The process of data preprocessing
3.3.1数据清理
日志中记录的原始数据通常非常大,存在很多对于挖掘任务没有意义的数据记录和数据项。要删除以下几类[30]:
(1)、图片、音频、框架等非用户请求逻辑单位;HITP协议是一个无连接协议,用户请求的是一个整体页面,而服务器记录的是下传到客户端的一个个文件流,用户的一个HTML页面请求会产生几条日志记录,其中也包括非用户请求的若干图片、框架以及脚本。然而Web日志挖掘的目的是获得用户的行为模式,只有用户请求的HTML页面才一真正代表了用户的意图,不需要关心那些
21
工程硕士学位论文
用户没有显式请求的文件,所以通过检查URL的后缀删除不相关的数据。不相关的数据类型主要有:GIF , JPEG ,JPG, gif, jpg, jpeg, avi, rm, asf, rmvb,map等,应将后缀为这些的记录从原始数据库中删除,过滤掉的图片、动画等文件可能是原始数据的10%-30%,有的甚至更高。
(2)、搜索引擎,这些蜘蛛程序和其它蠕虫(bot)程序与人们在互联网上访问行为是不一样的,他们对于日志的路径分析影响很大。一些搜索引擎需要扩大其数据库,会自动去浏览站点。比如:Crawler,spider和Robot等。它们会在日志中留下一记录,如果不剔除这些项,那么将会影响挖掘的结果。最简单的处理代理访问方法是检查日志中每项的代理域,许多代理和爬虫会在这个域里申明自己,那么通过字符串匹配方法可以容易地删除这些项。另外一种方法是检查“robots.txt\文件,这样的蜘蛛表现在日志的(cs(User-Agent))中,通常含有字符串’bot’,’spider’,’slurp’,’crawler’,’checker’,我们要将日志中Agent项中包含如上字符串的记录删除。
(3)、用户请求访问失败的记录,虽然这些信息中可能包含着某些有用信息 (如测定网站内容的完整性,链接的正确性和统计异常等),但对浏览模式发现来说输入的信息必须是正确的。这类访问的返回代码为404(请求的页面没有找到)、301(永久删除)、500(内部服务器错误),将这类记录用SQL语句删除。
(4)、由GET 以外的方式完成的服务。常见的请求方法有GET , POST 和HEAD ,但是只有GET 方法反应了用户的访问行为,所以要清除GET以外的服务。
(5)、其他无关的日志。
以徐州市政府网站2008.12.01为例,对各部分数据清理的结果示例。
1.03%0.44%4.35%1.14%1.99%清理前图片网络蜘蛛失败非GET请求其他清理后41.05P.00%
图3-3 数据清理各部分所占比例
Figure 3-3 The various parts proportion of data cleaning
22
3 数据预处理
3.3.2用户识别
用户识别的目的是识别哪些用户访问了站点。在用户识别的过程中存在以下问题:单个IP对多个服务器会话,多个IP对单个服务器用户会话,多个IP地址单用户,多代理单用户以及单客户端多用户等等。基于以上情况,我们可以按照以下的规则来依次处理日志中的每条记录,从而有助于识别用户[31] [32]。
规则l:不同的IP代表不同的用户。
规则2:如果访问日志中两条记录的IP地址相同,但代理日志表明用户的操作系统或浏览器改变了,那么认为每个不同的代理就表示不同的用户。
规则3:如果访问日志中两条记录的IP地址相同,用户使用的操作系统和浏览器软件也相同,那么根据网站的拓扑结构对用户进行识别,如果用户请求的页面不能从已访问的任何页面到达,则判断这是一个新的用户。
根据上述规则确定用户识别的算法。
定义1:U={UserID,User_IP,User_Refer,User_agent},其中:UserID为用户的标识,User_IP、User_Refer、User_agent分别为用户的IP地址、引用地址和用户客户端的类型。
Log为日志文件;U为用户的集合;R为日志文件中的一条记录;R.user代表记录R 的用户;R.ip代表记录中的IP地址;R.agent为客户端浏览器的类型;R.referer用户浏览的上一页。
算法:用户识别 输入:日志Log 输出:用户集合U For 所有的记录R∈Log {
If (R.ip不同于User 中所有记录的IP)
U=U ∪
else if (R.agent不同于同一IP的记录)
U=U ∪
else if (当前页面的R.referer为空)
U=U ∪
继续下一日志R;
23
工程硕士学位论文
} return U End
为了识别用户,目前己有多种方法,如cookie和内嵌用户ID、客户端软件agent、注册使用等,但现实情况是用户可能因为安全方面的考虑而关闭。
表3-2常用的用户识别方法
Table 3-2 Recognition methods for common user 方法 IP地址和代理 嵌入会话ID 用户注册 描述 假定每一个IP或代理地址对应一个用户 使用动态的方法产生ID,并嵌入用户访问请求中 用户注册并且使用唯一ID登录 私密性 优点 所需数据均体最低 现在日志中,实现简单 较低 技术简单,脱离了IP限制 可以精确跟踪一个用户的访问情况 可以重复跟踪访问 可以得到一个网站的精确访问情况 可以获得用户的所有访问情况 缺点 不能保证用户与IP/代理一一对应 没有考虑短时间内用户重复访问的情形,只有在动态网站下适用 不是所有的用户都愿意注册,且每一次访问时都愿意登录 用户如果不打开Cookie选项就无法收集信息 只能用于一些特定场合 广泛程度 广泛 多用于个性化 较低 中 Cookie 在客户端写入唯一个标识 在客户端浏览器上嵌入插件,向服务器送回浏览的信息 由浏览器记录用户访问的数据 中高 较低 多用于个 性化方法 代理软件 高 修改浏览器 最高 必须在用户使用了这种修改的浏览器时才会发挥作用 很少使用 3.3.3会话识别
会话识别是指用户在同一时间段内(一般间隔时间是25.5分钟,业界一般取30分钟)访问的页面组成一个用户会话序列,有四种识别会话的模型:页面类型模型(Page Type Model)、参引长度模型(Reference Length Model)、最大前向参引模型(Maximal Forword Reference Model)和时间窗口模型(Time Window Model)。最常采用的是时间窗口模型,如果两个不同页面访问时间的差超过一个阈值,则认为用户开始了一个新的会话。
启发式会话识别算法是常用的会话识别算法,它基于上述四种会话识别模型,其主要思想是:对于每个用户活动L,首先将第一个请求加入到第一个打开
24
3 数据预处理
的会话中,依次对照每个请求时间,如果超过时间阈值θ,则关闭当前会话并打开一个新的会话并将其作为这个会话的开始。再根据用户的浏览特性和页面之间的连接结构确定最终的会话集:假设同一用户依次发出相邻的两个请求a和b(其中a属于会话S),ta 和tb分别表示页面请求a和b的时间戳(ta 定义2:假设某网站有n个不同的URI,表示为: URI={uri1,uri2,uri3,?urii} ,其中:1 式中,设L是用户访问日志集合,li∈L,urii = li.uri,为被存取页的超链接地址,则m个用户会话的集合就可以表示为: S={sl,s2,s3,?sj},1 jjjjjjsj ={ipj,(uri1j,time1j, refer1j),(uri2,time2, refer2),?,(urik,timek, referk)} 满足条件: (timei+1-time1)< θ,i=1,2,?,m (timei+1-timei)< δ,i=1,2,?,m j式中,ipj代表产生用户会话sj的用户所对应的客户端IP地址,urik代表用j户在用户会话sj中所访问的第k个uri,timek代表用户发出这次访问请求的时间, θ、δ是预先确定的时间阐值。 算法: 生成会话集合Generate_Session(L,SessionSet); 输入:经过用户识别后的Web服务器日志L,θ=30min,δ= lmin; 输出:会话集合SessionSet; Generate_ Session(L,SessionSet) { i=1; r1 ={ ip1,( while (i≤|L|) { 查找 ipi在SessionSet 是否存在? If 存在 If Timei-time1<θand (timei-timei-1<δ or urii与前面的refer相同) 25