1 相关工作 互联网用户交互行为方式多样,传统的采集方式根据数据源的不同,当前的网站用户交互行为数据主要有4种采集方式:Web服务器日志、JavaScript页面标签、包嗅探器和代理服务器日志[1-3]。Web服务器日志方式中,用户发送页面请求到Web服务器,当Web服务器收到请求时,会将访问记录添加到日志中,获得不同客户端,不同用户的记录,但多个用户共享一个IP的情况下,则无法区分用户身份,当用户请求的信息缓存在本地,请求不会到达服务器,获取数据不完整。包嗅探器方式中,用户请求到达Web服务器之前,它先通过包嗅探器,然后嗅探器将请求发送到Web服务器,此过程无法获取缓存。不同于Web日志记录,JavaScript页面标签是基于前端的采集方法,当用户发起http请求时,JavaScript标记返回包含在页面显示时执行的特殊JavaScript代码,从访问者Cookie(包含访问时间、浏览器信息、工具供应商给予当前访问者的用户id等)检索详细信息,它们通过不同的服务器请求来传递,这使Cookie速度慢而且效率不高。一般在需要上报的位置组织数据、调用应用程序接口(API),将数据传给后端,比如百度统计、Google Analytics[4],但这种收集策略只能满足流量分析、来源分析等基础的分析。表 1对主流的4种采集方式进行了优缺点的对比分析。
表 1 四种采集方式的优缺点分析 Table 1 Advantage and disadvantage analysis of four collection methods
采集方式 | 优点 | 缺点 |
Web服务器日志 | 基本字段获取容易 半结构化数据,处理方便 能分析搜索引擎的爬虫记录 能体现文件下载内容 | 无法获取缓存 无法获取业务行为记录 只识别IP,识别用户不准确 跨域访问检测难 数据获取不完整 |
JavaScript页面标签 | 采集内容可自定义 记录前端用户行为数据 能处理Cookie缓存, 采集行为数据准确 | 用户的JavaScript设置影响数据收集 增加网站的脚本的负荷 无法获取文件下载记录 数据获取不完整 |
包嗅探器 | 获取数据实时性高 跨域访问检测容易 | 成本高 无法获取缓存,代理记录 用户隐私没保障 数据获取不完整 |
代理服务器日志 | 支持SSL的编码 支持Cookie的管理 支持JavaScript | 动态创建的链接不指向代理时,数据获取不完整 采集慢,效率低 |
表选项
由表 1可知,当前捕获用户数据的方式存在各种缺陷,通用的采集方法无法满足不同业务系统,分析用户数据本质是针对行业问题的不同场景,根据数据分析给予解决问题的辅助支持。不能完全获取所有的用户行为和数据,详细记录用户和网站的交互情况,在分析用户行为的过程中数据不完整,降低了用户偏好预测的准确性,得不到准确的用户分析[5]。为了解决面向互联网的用户交互痕迹捕获、存储和检索的问题,用户在访问网站的过程中,无需受限数据来源于服务端、代理端、客户端及所有和服务器交互的事件都会记录下来,并识别用户在此过程中的操作序列和操作的输入输出数据,前后台事件及时间等都能捕获并记录下来。用户数据可分为结构化数据和非结构化数据两类,数据类型的多样性和存储的差异性增加了数据的检索难度,数据的合理存储可以提高文件的访问效率,在云存储架构的基础上,实现各种数据采集、录入以及检索和应用。应用程序可以根据需求精确提取用户信息,对用户的操作,事件进行监听,捕获用户行为和操作序列,并记录在此操作过程中的相关数据,写入存储服务器,完成用户行为数据的采集。
2 用户访问行为建模 前端传过来的访问数据中,通过界面和API事件可以识别操作,将界面和控件以及事件名称进行关联映射[6],将相关的数据记录添加到上述的数据中,对后期做用户数据分析时来做事件聚合,前端记录带上事件名称。用户访问Web服务器过程中产生的交互/交易数据以及用户操作,采用界面窗口树来建模。用户在前端发起请求,服务器响应请求,进行一次API的调用,记录用户操作序列,界面的跳转即界面窗口树的边,界面作为界面窗口树的结点,精准捕捉用户行为,支持系统跟踪用户的偏好和访问习惯。数据采集是用户行为分析的前提[7],采集数据的准确性、完整性对后续分析有着至关重要的作用。每个用户访问的轨迹即为界面窗口树路径的一个实例。
定义1??界面结点元素用来描述网站上的某个控件的信息,界面结点元素Widgets定义为六元组(id, name, Type, Value, isVisible, isEditable),其中:id表示界面结点元素的编号;name表示界面结点元素名称;Type表示界面结点元素类型,Type:=Input|Output|getApi;Value表示界面结点元素当前取值;isVisible表示界面结点元素可见性,isVisible:=True|False; isEditable表示界面结点元素可修改性,isEditable:=True|False。
例如:登录界面输入文本框控件表示为(id,用户名,文本输入框,值,可见,可修改),初始时,第4个元素取值可为空。
定义2??菜单用来描述界面中菜单的信息,菜单Menu定义为(id, menuName, API序列),其中:id表示菜单的编号;menuName表示菜单的名称;API序列表示菜单Menu包含的API(功能)。
定义3?? API定义为一个六元组(id, APIName, Parmin, Parmout, Function, Widget序列),其中:id表示API的编号;APIName表示API的名称;Parmin={parm1, parm2, …, parmm}, m≥0,表示操作的输入参数序列,null表示输入参数序列为空;Parmout={parm1, parm2, …, parmn}, n≥0,表示该操作的输出参数序列,null表示输出参数序列为空;Function表示API对应的函数体;Widgets序列表示API对应的一组控件。
定义4??基本界面用来描述基本界面信息,基本界面BaseInterface定义为四元组(id, name, Menu, Widgets序列),其中:id表示基本界面的编号;name表示当前基本界面的名称;Menu表示基本界面中菜单,其中,菜单表示当前基本界面所包含的菜单,Menu可以为空;Widgets序列表示基本界面包含的界面元素,为当前基本界面所包含的界面元素,通常至少为一个或多个。
定义5??界面结点用来描述某个界面的信息,由基本界面或基本界面的叠加组合而成,基本界面是界面,界面叠加基本界面也是界面。界面结点InterfaceNode定义为四元组(id, name, BaseInterface, (Parent, Childs)),其中:id表示界面结点的编号;name表示界面的名称;BaseInterface序列表示当前界面结点包含的所有基本界面,即界面可以分解为若干个基本界面的叠加;(Parent, Childs)表示界面结点的直接父结点和直接子结点; Childs={InterfaceNode1, InterfaceNode2…, InterfaceNodem}(m≥0),目录结点的直接子结点的集合,其中InterfaceNodei(1≤i≤m)为界面结点,m=0时,Childs为空。
定义6??界面结点与基本界面关系vbRelation用来表示界面结点InterfaceNode和基本界面BaseInterface之间的二元关系,表示为:InterfaceNode→BaseInterface,如果InterfaceNode包含BaseInterface,则二元关系InterfaceNode→BaseInterface成立。
定义7??界面结点与界面结点关系vvRelation用来表示界面结点InterfaceNode1和界面结点InterfaceNode2之间的二元关系,表示为:InterfaceNode1
定义8??界面结点与界面结点元素关系vwRelation用来表示界面节点InterfaceNode和界面节点元素Widgets之间的二元关系,表示为:InterfaceNode
定义9??基本界面与菜单的关系bmRelation用来表示基本界面BaseInterface和菜单Menu之间的二元关系,表示为:BaseInterface
定义10??基本界面与界面结点元素的关系bwRelation用来表示基本界面BaseInterface和界面结点元素Widgets之间的二元关系,表示为:BaseInterface
定义11??菜单与API的关系maRelation用来表示菜单Menu和API之间的二元关系,表示为Menu→API,如果Menu包含一个API,则二元关系Menu→API成立。
定义12?? API与界面节点元素的关系awRelation用来表示API和界面节点元素Widgets之间的二元关系,表示为API
定义13?? (界面窗口树Tree)以界面结点InterfaceNode为根结点的界面窗口Tree(InterfaceNode)定义为:如果InterfaceNode.Childs=?,则Tree(InterfaceNode)=InterfaceNode。
1) 如果InterfaceNode.Childs={InterfaceNode1, InterfaceNode2, …, InterfaceNodem}, m≥1,则Tr-ee(InterfaceNode)是以InterfaceNode为根结点和m棵树Tree(InterfaceNode1), Tree(InterfaceNode2), …, Tree(InterfaceNodem)按从左到右顺序构成的树,称Tree(InterfaceNode1), Tree(InterfaceNode2), …, Tree(InterfaceNodem)为Tree(InterfaceNode)的m棵子树。
2) 用Tree(InterfaceNode).id表示界面窗口树的编号,则Tree(InterfaceNode).id=InterfaceNode.id。
说明:Tree(InterfaceNode)在根结点InterfaceNode下从左到右的第1棵树是Tree(InterfaceNode1),第m棵树是Tree(InterfaceNodem)。图 1表示了界面结点元素、菜单、API、基本界面和结点之间的关系。
图 1 节点关系图例 Fig. 1 Sample of node relationship |
图选项 |
算法1??控件触发。
用户每一个操作都有输入输出,对应着一组控件,用户的输入即为控件的输入值,作为API操作的输入参数。
function WidgCall(Widgets, InputValue)
Widgets.Value=InputValue return Widgets.Value end function
算法2?? API分解。
用户每一个操作的完成,都对应着一组控件序列,即该控件序列对应当前操作的API,每一个操作事件的输入参数值即为对应着的一组控件序列的输入值。
function APIDecom(API, InputValue)
API.Parmin=?
for i=1 to m do if isawRelation(Widgetsi, API)=True then
/*查表*/
WidgCall(Widgetsi, InputValuei)
API.Parmin=API.Parmin+Widgetsi.Value
end if
end for
return False
end function
算法3?? API触发算法。
用户和系统进行交互,用户在前端界面进行事件的触发,触发事件API,服务器接收到操作输入信息,响应前端,返回当前的系统时间,事件的触发时间用时间戳记录,并代入用户信息,作为用户痕迹记录。
function APICall(userId, API, InputValue)
APIDecom(API, InputValue)
API.Parmout=API.function(API.Parmin)
time Stamp=system Time
return API.Parmout, timeStamp
end function
算法4 ??窗口节点分解。
界面窗口树模型由界面节点及其之间的跳转关系组成。用户每一次操作都将触发API,并产生交互数据,数据和操作写入分布式存储检索系统中,记录用户痕迹。用户访问的界面和跳转可以通过用户痕迹检索,统计界面的访问频次和跳转。调用API即操作事件,该API属于某一菜单,这一菜单属于某一基本界面,通过遍历界面窗口树,确定窗口树中某一界面结点,并将该界面结点分解为若干基本界面,找到菜单属于的基本界面。系统监控事件API的触发,然后把API的输入和输出写入分布式存储检索系统,并返回触发的API的名称。一次交互/交易中,第1个API的名称在用户交互/交易检索时,作为起始API。
用户和系统进行交互,用户在前端界面进行事件的触发,触发事件API,服务器接收到操作输入信息,响应前端,返回当前的系统时间,事件的触发时间用时间戳记录,并代入用户信息,作为用户痕迹记录。
functionTreeNodeDecom(userId, API, Menu, timeStamp, InterfaceNode)
/*查表,找到菜单属于的基本界面,确定基本界面对应的某一界面结点*/
If isbmRelation(Menu, BaseInterface) & &
isvbRelation(BaseInterface, InterfaceNode=True then
/*触发API*/
APICall(userId, API, InputValue)
/*API的输入输出写入分布式存储检索系统*/
TreeInsert(userId, uploadTime, (fileName, FileType, Content)
/*返回触发的API的名称*/
return API.Name
end if
else return False
end function
算法5??窗口树路径生成。
以userId为根节点的用户行为树由m棵子树构成,窗口树路径即一次交互/交易行为的路径生成过程可以用递归过程实现。子树由界面节点构成,用户触发第1个API作为用户行为的起始操作,生成userId根节点,如果界面节点与给定的界面节点之间满足API触发的跳转关系,将该界面节点作为userId的子节点,并返回触发的第1个API的名称。在记录后面的每个界面节点时,先计算与上一个界面节点时间戳的时间间隔,若大于定义的最大时间间隔,则重新以userId为根节点生成一条新的有效访问路径,即直接将界面节点作为userId的子节点,若完成则生成一条用户交互/交易行为的窗口树路径,不断重复生成新的用户。
InterfaceNode==userId,userId作为特殊的节点,假设树Tree(userId)={Tree(InterfaceNode1), Tree(InterfaceNode2), …, Tree(InterfaceNodem)}, m≥1,若userId.Childs=?,则Tree(userId)=userId; 若userId.Childs={InterfaceNode1, InterfaceNode2, …, InterfaceNodem},则路径生成函数TreePath递归定义如下:
functionTreePath(userId, API, Menu, timeStamp, Tree)
TreeNodeDecom(userId,API,Menu,timeStamp,InterfaceNode1)
If i=1 then firstAPI=API.Name userId.Childs={InterfaceNode1}
end if
for i=1 to m do
/*比较时间戳,计算访问间隔*/
if InterfaceNodei.timestamp-
InterfaceNodei.parent.timestamp≥T_max then
/*以userId为根节点,生成用户访问路径*/
userId.Childs={InterfaceNodei}
end if
TreePath(userId, API, Menu, timeStamp,
Tree(InterfaceNodei))
end for
else return False
return firstAPI
end function
算法6 ??当前结点分解。
API对应着菜单,遍历界面结点,找到某一界面结点,确定它包含的某一基本界面,上述菜单属于该基本界面,则返回该界面结点,基本界面和菜单。这样,就可以确定API和菜单,基本界面,界面结点之间的对应。
functionNodeDecom(userId, API, Menu, InterfaceNode)
if isbmRelation(Menu, BaseInterface)&&
isvbRelation(BaseInterface, InterfaceNode)=True then
return InterfaceNode, BaseInterface, Menu
end if
return False
end function
算法7 ??当前结点检索。
检索用户交互/交易痕迹,输入用户信息和时间戳,通过已知的API事件操作,界面结点,可以在界面窗口树中检索到用户操作的界面节点,以及从分布式存储检索系统中检索到操作过程中产生的数据。
functionNodeQuery(userId, timeStamp, API, InterfaceNode)
uploadTime=timeStamp
/*当前结点分解, 确定API和菜单,基本界面,界面结点之间的对应*/
NodeDecom(userId, API, Menu, InterfaceNode)
ForestQuery(userId, uploadTime, distributeTrees)
end function
算法8??用户行为树检索。
在界面窗口树中检索用户交互/交易痕迹,通过检索起始API事件,检索对应的界面结点,再遍历此界面结点的子节点,找到满足此API调用跳转的界面结点,并对其进行以userId作为根结点的子树的递归检索。检索到在此API事件操作过程中相关的界面和数据。
设树Tree(InterfaceNode)={Tree(InterfaceNode1), Tree(InterfaceNode2), …, Tree(InterfaceNodem)}, m≥0,
若InterfaceNode.Childs=?,即m=0,则Tree(InterfaceNode)=InterfaceNode;
若InterfaceNode.Childs={InterfaceNode1, InterfaceNode2, …, InterfaceNodem},则
function TreeQuery(userId, timeStamp, Tree,
InterfaceNode)
/*获得历史行为中的第一个API*/
API=APIQuery(firstAPI)
NodeQuery(userId, timeStamp, InterfaceNode)
for i=1 to m do
/*查表*/
If vvRelation(InterfaceNode, InterfaceNodei,
APICall(userId, API, timeStamp)=True then
TreeQuery(userId, Tree, InterfaceNodei)
end if; end for
return Null
end function
设树Tree(userId)={ Tree(InterfaceNode1), Tree(InterfaceNode2), …, Tree(InterfaceNodem)},
m≥0,若userId.Childs=?,即m=0,则Tree(user-Id)=userId;
若userId.Childs={InterfaceNode1,
InterfaceNode2, …, InterfaceNodem},则
functionTreeQuery(userId, timeStamp, Tree,
InterfaceNode)
/*获得历史行为的第一个API */
API=APIQuery(firstAPI)
NodeQuery(userId, timeStamp, InterfaceNode);
for i=1 to m do
/*查表,满足跳转关系*/
If vvRelation(userId, InterfaceNodei,
APICall(userId, API, timeStamp))=True then Tree-Query(userId, InterfaceNodei)
end if; end for
return Null
end function
3 数据存储检索 传统的关系型数据库在存储数据时,采用的是行列二维结构来表示数据,每一行数据都具有相同的列字段,而这样的存储方式显示不适合上面的数据格式[8-9]。云存储中用户行为数据、日志数据都属于半结构化数据,所谓半结构化数据,就是结构变化的结构化数据,适合使用非关系型来做数据存储。一个实时的分布式搜索引擎和分析引擎,具有很强的数据搜索和聚合分析能力。通过识别数据类型,把存储系统建模为存储目录树,根据不同的数据类型存储到分布式云存储系统的不同位置中,数据分为结构化数据类型和非结构化数据类型[10-14]。分布式存储检索系统环境中文件系统模型由多棵存储目录树构成[15],每棵存储目录树包括:目录结点、服务器结点、叶子结点等。用户界面数据建模为界面窗口树,按照树的存储和界面结点之间的联系,存储在分布式数据库中,结构化的数据存储在数据库文件中,在存储目录树中找到存储位置的文件结点,即数据库文件所在的叶子结点,非结构化文件节点用来描述非结构化文件,按照动态目录树的规则存放在对应的位置,服务器日志存储在log日志文件中。结构化文件节点用来描述数据库文件,存储结构化数据,根据用户访问信息,存储在数据库中。存储目录结点用来描述存储服务器上的某个存储目录的信息,结构化数据文件作为叶子节点存在,应用程序传递参数指定存储位置创建数据库文件,通过统一的存储入口可以分类型,按要求存储用户数据。不同的文件存储在不同的位置,该方法使应用程序可以根据数据类型分类存储用户信息,自定义存储路径。
定义14??文件类型。文件分为结构化文件和非结构化文件,FileType::=StructFileUnStructFile,UnStructFile::=(Typename, FilePath),其中:Typename表示文件类型的名称,比如:jpg、mp3、txt、log、xml等;FilePath表示文件的存储目录结点与它的祖先结点之间的相对路径,StructFile∷=(Filename, DBServerNode.id, Data); Filename::=String; Filepath::=(ServerId,Property); DBServerNode.id为数据库服务器所在的服务器结点;Data::=(TableID, RecordID, keyName, Value)序列,其中,序列中四元组按时间排序;TableID::=String;RecordID::=String;KeyName∷=String;Value∷=IntegerStringArrayFloatDouble|BooleanObjectDate;用Last(Data)表示序列Data的最后一个四元组。
运行中产生的用户数据如果是非结构化文件数据,则通过如下接口进行用户数据的存储:
非结构化文件存储接口::=(userId, uploadTime, (fileName, UnStructFile, Content))。
运行中产生的用户数据如果是结构化文件数据,则通过如下接口进行用户数据的存储:
结构化文件存储接口::=(userId, uploadTime, (fileName, StructFile, API.Parmin, Content))
非结构化文件存储以单个文件形式存在于存储系统中,运行过程中产生的用户数据如果是非结构化文件数据,在存储目录树中找到存储位置的文件结点:TreeInsert1(userId, uploadTime, (fileName, UnStructFile, Content))=(fileName, UnStructFile, Content, property);其中property为(userId, uploadTime, directoryNodeId),表示文件的属性,directoryNodeId表示存储目录树模型分配给该文件作为叶结点UnStrfileNode的父结点编号,即UnStrfileNode.Parent=directoryNodeId, UnStrfileNode.Childs=?。
结构化的数据存储在关系型数据库文件中,产生的用户数据如果是结构化文件数据,在存储目录树中找到存储位置的文件结点,即数据库文件所在的叶子结点,即可写入用户数据:TreeInsert2(userId, uploadTime, (fileName, StructFile, API.Parmin, Content))=(fileName, StructFile, Content, property), 其中:property为((userId, uploadTime), directoryNodeId)表示文件的属性;directoryNodeId表示模型分配给该文件作为叶结点StrfileNode的父结点编号,即StrfileNode.Parent=directoryNodeId,StrfileNode.Childs=?。图 2为用户痕迹采集存储的流程图。
图 2 用户痕迹采集存储流程图 Fig. 2 Flowchart of user trace collection and storage |
图选项 |
算法9??用户痕迹存储算法。
分布式用户交互痕迹和数据的捕获,根据
用户在不同应用客户端的行为记录的日志,发送给存储服务器。依据产生的数据类型,如果是非结构化文件数据,则执行非结构化文件结点插入操作,如果是结构化文件数据,则执行结构化文件结点数据写入操作。
TreeInsert(userId, uploadTime, (fileName, FileType, Content))=if(FileType=UnStructFile)
{TreeInsert1(userId, uploadTime, (fileName,
UnStructFile, Content));
}else if(FileType=StructFile)
{TreeInsert2(userId, uploadTime, (fileName,
Struct File, Content));
}else
return False;
算法10??用户痕迹的检索算法。
用户行为痕迹数据存储在分布式存储检索系统中,检索时从树的根节点开始检索,根据已知的用户id和时间戳来查询用户痕迹记录,分布式存储检索系统由多棵树构成森林,检索用户痕迹数据,就是从森林中检索数据。森林可分解为多棵树,那么检索即从第1棵树开始检索,通过依次遍历每棵树完成检索。
检索接口::=Query(userId, uploadTime)
假设Forest=distributeTrees, distributeTrees={directoryTree(serverNode1), directoryTree(serverNode2), …, directoryTree(serverNodek)}(k≥1)
Query(userId, uploadTime)=ForestQuery(userId, uploadTime, distributeTrees);
图 3为用户痕迹检索的流程图。
图 3 用户痕迹检索流程图 Fig. 3 Flowchart of user trace querying |
图选项 |
算法11??森林检索算法。
森林由若干棵树构成,那么森林的遍历可以分解为树的遍历,从树的根节点开始遍历。
ForestQuery(userId, uploadTime, distributeTrees)=
(for(i=1, i≤k, i++){
TreeQuery(userId, uploadTime,
directoryTree(serverNodei)); }
return ?;)
算法12??树检索——叶子结点的匹配算法。
文件节点即为树的叶子结点,文件节点分为两类:结构化文件节点和非结构化文件节点。根据已知的用户信息,匹配叶子结点属性中的用户信息,如果比对成功,该叶子结点包含检索的用户信息,则返回该叶子结点的存储路径,以及检索到的用户历史行为数据。若失败,即该树中检索不到用户历史行为数据,则返回空集。
设Tree的叶结点集合为{LeafNode1, LeafNode2, …, LeafNoden},其中LeafNodei是结构化文件结点StrfileNode或者非结构化文件结点UnStrfileNode。
TreeQuery(userId, uploadTime, directoryTree)=
(for(i=1, i≤n, i++){
if(LeafNodei.property.userId=userId&LeafNodei.property.uploadTime=uploadTime)
return{/*返回绝对路径*/
getAbsolutePath(directoryNode.id,
directoryTree.id, Parm)/LeafNodei.fileName;
LeafNodei.Content; }
}else return ?;
4 实验结果与分析 为了评估界面窗口树模型数据采集的完整性和高效性,对提出的用户痕迹模型的存储和检索效率进行了实验。实验环境客户端1台,计算服务器1台,数据库服务器1台,非结构化数据存储服务器1台,配置均为Intel(R) Core(TM) i5-3210M CPU @ 2.50 GHz,内存为8 GB。
4.1 文件写入效率 文件写入效率(File Writing Efficiency, FWE)指标用来衡量访问文件的效率,计算公式为
(1) |
式中:S为存储的文件总大小;T为存储完用户数据总时间。FWE值越大,系统的写入效率越高。为了评估在采集用户数据情况下,系统的写性能,在用户信息上传界面,电商界面等多个页面进行了访问并操作,实验数据包括结构化数据和非结构化文件,因为网页数据多为小文件,点击多个按钮进行页面跳转,实验模拟生成了大量的小文件,做了200次实验,写磁盘的时间T为200次实验总时间的平均值。根据FWE指标计算方法,并与李慧莹[16]的OPT_HDFS系统做了对比,得出如图 4所示的FWE指标对比图,可以看出本文系统比OPT_HDFS系统有更高的访问效率,而且在文件数在10 000个以后,访问效率增加速度减小。
图 4 文件写入效率对比 Fig. 4 Comparison of file writing efficiency |
图选项 |
4.2 系统响应时间测试 为了评估本文系统的响应时间,实验过程中使用了大量内容不同的小文件,这些文件的平均大小为50 KB,北京理工大学的焦晨宇提出了一种可伸缩的分布式文件系统SDFS[17],本文对2个系统进行了对比实验。图 5显示了SDFS[17]和本文系统的响应时间的对比,包括读文件和写文件。
图 5 系统响应时间对比 Fig. 5 Contrast of system response time |
图选项 |
本文提出的系统仅仅需要0.083 s即可以完成查询,而SDFS则需要0.342 s。而在写文件方面,SDFS比本文系统多耗时0.02 s,实验显示本文系统提出的方法耗时远远低于SDFS,平均响应时间远低于SDFS,有更好的性能。
4.3 精确性测试 对系统进行测试,可以根据用户id和用户访问时间,检索采集存储系统,提取用户行为包括用户操作编号、IP、URL、API时间编号等基本参数,当前的访问页面等,访问内容的大小,若想对用户行为进行全面的记录与分析,还包括网页停留时间,点击数等参数。对用户的停留页面做了可视化的分析,对全部会话的界面停留总时间进行数据提取时,同样以单次会话的界面停留时间提取方法为基础。基于用户id进行数据库数据的提取,按照用户的会话编号依次进行用户跳转请求树结构的遍历,将节点时间信息的计算统计结果保存在对应界面各次会话停留时间的变量中,并计算出总时间。将计算出的各界面停留总时间数据返回前端,前端根据返回数据进行饼图的可视化流程,可视化效果图。图 6为根据采集到的用户浏览界面生成的界面节点访问统计,图中百分比表示界面节点访问次数占总访问次数的比重,面积大的表示访问量大的页面。
图 6 界面节点访问统计 Fig. 6 Interface node access statistics |
图选项 |
4.4 完整性测试 通过对以上用户操作进行磁盘存储文件和前端采集到行为事件的统计分析,数据主要包括用户访问ID、页面请求类型、请求URL、请求的资源数据大小、会话信息、用户操作的时间序列,用户点击,用户操作的事件,用户操作的控件或者链接,用户输入和请求的数据字段,用户页面的停留时间,下载的文件。从单个用户单次会话的有效访问路径可视化的效果图中,可以直观地看出某一名用户在某一次会话中的具体访问过程。图 7为一棵用户行为树。经过多个页面跳转生成的访问路径,用户生成树没有闭环。完整的采集到了用户路径,根据用户信息,时间戳,能检索到用户访问的当前页面,并对用户在页面的点击或者浏览进行兴趣行为分析。某用户需要频繁经过一系列的跳转操作到达某一界面时,可以判断该界面的层级需要进行调整。
图 7 用户行为树生成图 Fig. 7 User behavior tree generation |
图选项 |
5 应用实例 作为一个案例研究, 本文采用笔者参与研发的国家殡葬文化与科技公共服务网络平台以验证该模型。该公共服务网络平台面向社会公众及殡葬行业相关机构用户,提供一站式服务,由主站和政务信息、殡葬文化、科技公益、新闻动态、网络祭祀5个子系统组成。平台的部分资源无需用户登录即可查看访问,但在未登录状态下所产生的行为,却无法直接识别用户,若直接将未登录行为信息舍弃将会失去许多潜在的可分析资源,为了解决这个问题采用以下步骤:
每条用户行为记录都有唯一编号标识。
步骤1??每产生一条行为记录,将记录的标识返回,并放置于Cookie中。
步骤2??当用户登录,获取用户客户端Cookie中所有行为记录编号,并将用户id及所有行为记录编号输入至另一类日志文件/unloginUBInfo/userBehaviorIDLog中。
步骤3??日志处理,获取/unloginUBInfo /userBehaviorIDLog所包含编号对应的日志记录中,将用户id字段变更成用户id。
系统架构图如图 8所示,分布式数据存储服务器分为用户数据服务器S3,非结构化数据存储服务器S1、S2及界面窗口存储服务器S4。
图 8 系统架构 Fig. 8 System architecture |
图选项 |
最顶层是业务逻辑层,该层的主要工作是由负载均衡服务器把用户访问请求进行分流,发送给不同的应用服务器,再由应用程序去调用云存储管理层提供的服务接口去管理用户数据和操作数据。业务逻辑层中的应用程序可以根据分布式存储目录建模方案自定义存储目录的层级结构。中间层是云存储管理层,它负责管理云存储平台并向应用程序提供云存储服务,该层由存储接口管理子系统、集群管理子系统和存储管理子系统构成。存储接口管理子系统给应用程序提供数据类型识别,分类存储管理操作相关接口和目录操作等接口。该层还负责管理应用程序自定义的存储目录树,生成文件的存储路径和访问路径,当存储服务器的存储负荷达到一定阈值之后,该层会向集群管理子系统请求对相应的存储目录进行逻辑扩容。
在用户数据库中建立对应数据表,主要包括用户基本信息表、界面窗口数据表Window、API数据表、操作记录数据表Operation、用户访问数据表userAccesslog,将预先设计的界面模型存储至数据库中。userAccesslog中的每一条记录都对应着用户的一条操作行为,而对于用户行为非结构化数据(比如图片、视频、音频文件等),则经由非结构化用户数据文件云存储系统进行分布式存储。只需要userID,时间戳就可检索到用户的一条操作记录。数据表设计如表 2和表 3所示。有效捕获的用户行为轨迹是用户在浏览器端的点击操作,系统选择在前端页面的点击函数中添加数据发送函数,将本次操作所对应的ApiId、OperationId以及其他用户输入值发送到后台,用户行为结构化数据存储至关系型数据库,其他请求资源存入非结构化数据云存储系统中。
表 3 Operation关键字段 Table 3 Key field of Operation
字段 | 类型 | 说明 |
operationId | varchar | 操作事件编号 |
interfaceNodeID | varchar | 所属界面 |
menuID | varchar | 菜单操作编号 |
apiID | varchar | API编号 |
userOperation | varchar | 用户操作 |
eventType | varchar | 事件类型 |
relativity | varchar | 前后台相关性 |
inparam | varchar | 输入参数 |
inparamType | varchar | 输入参数类型 |
outparam | varchar | 输出参数 |
outparamType | varchar | 输出参数类型 |
timeStamp | timestamp | 记录事件发生的时间 |
表选项
表 2 userAccesslog关键字段 Table 2 Key field of userAccesslog
字段 | 类型 | 说明 |
userID | varchar | 用户id |
OperationId | varchar | 用户操作事件编号 |
timeStamp | timestamp | 记录事件发生的时间 |
IP | varchar | 当前IP地址 |
表选项
例1用户在网络祭祀首页发起登录操作,登录界面由控件序列:用户名文本框,密码文本框,登录按钮组成,用户输入用户名和密码,点击登录按钮loginBtn,界面结点LoginNode经过用户触发事件login跳转到界面结点SacrificesNode。满足界面节点LoginNodeSacrificesNode,vvRelation∷(LoginNode, SacrificesNode, login),login调用登录控件对应的API:loginAPI。
1) 网络祭祀首页界面节点表示为SacrificesNode,登录界面节点表示为LoginNode。
2) 用户在登录界面中用户名输入文本框控件表示为(idUser001, username, Input, alice, True, True)。
3) 密码输入文本框控件表示为(idPwd001, password, Input, pwd123456, True, True)。
4) 按钮控件表示为(idbtn0000002, loginBtn, getApi, null, True, False)。
前端向后台发起登录处理请求,逻辑处理层收到请求后,经过数据库校验,返回响应数据包括用户身份编号userID和其他的输出数据,记录此时的系统时间,前端提示登录成功,展示用户登
录后的界面SacrificesNode。系统储存以上的控件序列的信息,输入的参数,返回的结果,并记录当前登录用户的身份user0001,作为生成的用户行为树的根节点,写入UserData数据库的userAccesslog表和Operation表。
界面节点LoginNode作为第一个子树的根节点,界面节点SacrificesNode作为LoginNode的子节点,若用户在界面SacrificesNode停留的时间超过定义的时间T_max=5 min,跳转到个人缅怀专题页面界面节点PersonalAlbumNode,则PersonalAlbumNode作为user0001的第2个子节点,生成新的用户访问路径。若用户在界面SacrificesNode停留的时间小于T_max=5 min,界面节点PersonalAlbumNode则作为节点SacrificesNode的子节点,用户访问路径则为LoginNode-SacrificesNode-PersonalAlbumNode,即为访问的界面顺序。用户访问时间、请求类型、请求URL、请求数据大小、http协议、http状态码等信息通过服务器日志获取,也一并作为访问过程数据存储,生成的用户行为树存入UIModel界面数据库,树的节点编号即为界面节点的编号,非结构化数据,如视频或者图片数据则存入分布式存储目录树(系统)中。单个用户的单次会话,用户的完整访问路径,从UIModel界面数据库中提取各类节点相关信息添加到树结构中,完成树的构建。
当需要使用存储的数据时,则根据idUser0001和时间戳检索用户行为树中的界面节点,匹配到后从分布式存储检索系统提取需要的精准的用户痕迹数据,分析用户经常访问路径,用户感兴趣的界面等数据。
系统调用算法9,写入存储系统,记录数据见表 4。
表 4 用户行为记录数据项及格式说明 Table 4 User behavior record data items and format specification
数据项 | 格式 | 说明 | ||
时间 | time | 2018-03-20 17:13:13 | 日志记录生成时间 | |
日志编号 | logID | [95C4C3AE62D41E3213C3007F3] | 为每条日志设定唯一编号,用[]标识,可供后续搜索 | |
操作行为 信息 | Input | requestURL | “requestURL”:“http://10.2.8.166:11680/portal/login” | 访问者请求URL |
IP | “IP”:“10.2.8.171” | 访问者真实IP地址 | ||
varchar | alice,pwd123456 | 输入值为用户名,密码 | ||
Output | Json格式,用{}标识,属性间用“,”分隔 | {“userID”:idUser0001,“status”:200,“msg”:“注册成功”} | 返回用户id,注册成功状态和提示信息 | |
界面信息 | window | 界面窗口 | LoginNode,SacrificesNode | LoginNode的孩子节点是SacrificesNode |
widgets | 控件序列 | 用户名文本框(idUser0001,username,Input,alice,True,True)密码文本框(id0000001,password,Input,pwd123456,True,True)注册按钮(id0000002,registerBtn,getApi,null,True,False)用户头像框(headImg) | 控件编号;控件名称;控件类型;控件当前取值;控件的可见性;控件的可修改性 | |
menuID | varchar | login | 登录注册菜单 | |
apiID | varchar | loginApi | 操作对应的API |
表选项
TreeInsert(userId, uploadTime,
(fileName, FileType, Content))=
if(FileType=UnStructFile){
TreeInsert1(userId, uploadTime,
(fileName, UnStructFile, Content));
}else if(FileType=StructFile){
TreeInsert2(userId, time, (userdata.mdb,
StructFile, (input, output, windows, widgets, api));
}else return Error;
系统调用算法10,Query(userId, uploadTime)=Query(idUser0001, timeStamp),用户行为树按用户的ID编号为根节点进行树形存储,检索时遍历数据库中用户行为记录,进行用户行为的检索,通过检索第一个API,即loginApi,检索到界面结点LoginNode,再遍历此界面结点的子节点,找到满足此loginApi调用跳转的界面结点SacrificesNode,并对其进行以LoginNode作为根结点的子树的递归检索,构成行为树,并根据数据库表检索在此过程中的所有相关数据。
例2 ??用户在科技公益平台上的个人缅怀专题页面中,用户可以上传与自己亲人相关的图片和视频等多媒体文件。用户idUser0001为他自己亲人建立的缅怀专题页面上传了一张照片img1,云存储系统会调用算法9把img1保存到idUser0001的私有存储空间,图 9所示显示了idUser0001访问到的图片来自他的私有存储空间。同理,系统调用算法12,TreeQuery(userId, uploadTime, directoryTree),检索用户idUser0001存储的信息,其中userId=“idUser0001”,uploadTime=“20170105”,directoryTree=10.2.8.188:80/”。
图 9 存储非结构化文件示例 Fig. 9 Sample of unStructFile storage |
图选项 |
6 结论 1) 本文提出了一种面向互联网的用户交互痕迹捕获、存储和检索模型,通过界面窗口树和用户行为树的建立,实现了互联网用户行为数据的采集,支持不同的Web数据存储到分布式存储系统中并可以检索,改善了由于网络信息化信息繁多且数据源多样化而无法精确采集用户行为痕迹的问题,完成用户行为数据较完整的采集。
2) 分布式存储服务给应用程序提供统一的分布式的存储接口,根据不同的数据类型,自动分类存储在不同的位置,并能随存储变化动态调整磁盘存储空间大小,克服了单结点存储服务器磁盘存储空间的限制。采用界面窗口树模型检索,提高了界面节点增删改查的效率,完善了分布式用户痕迹采集过程中存取的过程。
3) 模型的建立为后续的用户行为分析奠定了数据采集的基础,以数据为核心驱动业务的发展。
参考文献
[1] | SRIVASTAVA J, COOLEY R, DESHPANDE M, et al. Web usage mining:Discovery and applications of usage patterns from Web data[J]. ACM SIGKDD Explorations Newsletter, 2000, 1(2): 12-23. DOI:10.1145/846183.846188 |
[2] | 张玉芳, 张艳华, 熊忠阳. 一种高效的用户浏览行为采集方法[J]. 计算机工程与应用, 2013, 49(3): 126-129. ZHANG Y F, ZHANG Y H, XIONG Z Y. Efficient method for collecting user browsing behaviors[J]. Computer Engineering and Applications, 2013, 49(3): 126-129. DOI:10.3778/j.issn.1002-8331.1108-0269 (in Chinese) |
[3] | CATLEDGE L D, PITKOW J E. Characterizing browsing strategies in the world-wide web[J]. International World Wide Web Conference, 1995, 27(95): 1065-1073. |
[4] | 董志安, 吕学强. 基于百度搜索日志的用户行为分析[J]. 计算机应用与软件, 2013, 30(7): 17-20. DONG Z A, LYU X Q. User behavior analyses based on baidu search logs[J]. Computer Applications and Software, 2013, 30(7): 17-20. DOI:10.3969/j.issn.1000-386x.2013.07.006 (in Chinese) |
[5] | THORAT S S, MORE P.User oriented approach to website navigation concept using mathematical model[C]//International Conference on Computational Intelligence and Communication Networks.Piscataway, NJ: IEEE Press, 2016: 1431-1435. |
[6] | 李睿, 连航, 马世龙, 等. 基于形式化方法的航空电子系统检测[J]. 软件学报, 2015, 26(2): 181-201. LI R, LIAN H, MA S L, et al. Avionics system testing based on formal methods[J]. Journal of Software, 2015, 26(2): 181-201. (in Chinese) |
[7] | 余慧佳, 刘奕群, 张敏, 等. 基于大规模日志分析的搜索引擎用户行为分析[J]. 中文信息学报, 2007, 21(1): 109-114. YU H J, LIU Y Q, ZHANG M, et al. Research in search engine user behavior based on log analysis[J]. Journal of Chinese Information Processing, 2007, 21(1): 109-114. DOI:10.3969/j.issn.1003-0077.2007.01.018 (in Chinese) |
[8] | FU Y, LUO S, SHU J. Survey of secure cloud storage system and key technologies[J]. Journal of Computer Research & Development, 2013, 50(1): 136-145. |
[9] | LIU J, HUANG K, RONG H, et al. Privacy-preserving public auditing for regenerating-code-based cloud storage[J]. IEEE Transactions on Information Forensics & Security, 2015, 10(7): 1513-1528. |
[10] | WU Y, JIANG Z L, WANG X, et al.Dynamic data operations with deduplication in privacy-preserving public auditing for secure cloud storage[C]//IEEE International Conference on Computational Science and Engineering.Piscataway, NJ: IEEE Press, 2017: 562-567. |
[11] | BELLET A, HABRARD A, SEBBAN M.A survey on metric learning for feature vectors and structured data[EB/OL].(2014-02-12)[2018-12-29].https: //arxiv.org/abs/1306.6709. |
[12] | 杨晶, 周双娥. 一种基于XML的非结构化数据转换方法[J]. 计算机科学, 2017, 44(11): 414-417. YANG J, ZHOU S E. Method for unstructured data transformation based on XML technology[J]. Computer Science, 2017, 44(11): 414-417. (in Chinese) |
[13] | BOUCHER T D, AUSLANDER D M, BASH C E, et al.Viability of dynamic cooling control in a data center environment[C]//The Ninth Intersociety Conference on Thermal and Thermomechanical Phenomena in Electronic Systems, 2004(ITHERM'04).Piscataway, NJ: IEEE Press, 2006: 593-600. |
[14] | HOU B, CHEN F, OU Z, et al. Understanding I/O performance behaviors of cloud storage from a client's perspective[J]. ACM Transactions on Storage, 2017, 13(2): 16. |
[15] | 汪帅, 吕江花, 汪溁鹤, 等. 一种支持数据去冗和扩容的多媒体文件云存储系统实现[J]. 计算机研究与发展, 2018, 55(5): 1034-1048. WANG S, LYU J H, WANG R H, et al. A multimedia file cloud storage system to support data deduplication and logical expansion[J]. Journal of Computer Research and Development, 2018, 55(5): 1034-1048. (in Chinese) |
[16] | 李慧莹.基于HDFS的小文件存储方法的研究与优化[D].西安: 西安电子科技大学, 2014. LI H Y.Research and optimization of small file storage method based on HDFS[D].Xi'an: Xidian University, 2014(in Chinese). http://cdmd.cnki.com.cn/Article/CDMD-10701-1014331548.htm |
[17] | 焦晨宇.可伸缩分布式文件系统及其应用[D].北京: 北京理工大学, 2015. JIAO C Y.The design and application of a scalable distributed file system[D].Beijing: Beijing Institute of Technology, 2015(in Chinese). |