最近在折腾Open edX数据相关的东西,同时试着将open edx与机器学习结合
如果你是EDM(educational data mining)的新玩家(我也是新手233),对教育领域的数据感兴趣,推荐你这篇论文《教育数据挖掘研究进展综述》,了解一下这个领域的概况和进展
官方的insights显得太重,我们打算享用这个免费午餐,但不定制它。对于个性化的数据分析,我们准备另起炉灶,完全独立于Open edX本身。架构上的设计主要为
我用周末的两天,搭建了初始模型,从目前的进展看来,这条路似乎还算康庄大道
架构中的第一条,产生了难题,我试着去hack tracking system的时候,发现它并不是个平坦的结构,hack起来十分痛苦,而我定制开源系统的原则之一是尽可能不侵入原代码。尽可能尊重原有架构,试着去理解它而不是急着改造它,后者的代价太沉重了,危机四伏
所以眼前的第一个任务是理解tracking system的机制,并优雅地定制它
写一个rest服务,在js中用ajax去发送事件(当然你也可以用edx采用的backbone),对应的rest服务去写日志(采用django或是python原生的方式都行),这种方式简单粗暴。因为违背了我拓展开源系统的原则,所以直接pass了
|
|
问题是日志没有单独剥离出来,分析时,日志量巨大,需要筛选出来,所以这是我们主要需要解决的问题
更好的范式为
|
|
出于国内网络的原因,我们可能需要考虑国内的Analytics服务,由于Analytics用种普遍需求,所以国内也容易找到同类产品:
Open edX中的tracking system产生的log与系统业务相关,数据特征皆为教育者所关心。并不是一种不是通用的数据(诸如nginx产生的日志就很通用,仅关心http请求本身),正是这种特质,使其适合作为EDM的数据源
由于当前文档的匮乏,我们只好直接翻源码了,涉及的源码主要包括
我们从产生emit(从语义就可以知道这是提交日志事件的功能函数)开始追踪,目的是找到产生独立log的方法:
从class的名字我们可以猜到这个类(Tracker)基本就是我们要找的东西啦
接下来找侵入的地方:
|
|
-> eventtracking/django/__init__.py 里override_default_tracker()注册tracker,而eventtracking.django的EventTrackingConfig是触发上边代码的地方,具体原理可见:
|
|
所以我们完全可以构造自己的tracker,因为TRACKERS是个dict,所以可以同时存在任意多的tracker,每个tracker可以有自己的backends,至此,探索完毕,问题解决
至于细节问题,构造tracker是主要的任务,直接用Tracker构造一个新的就好,核心参数是backends, ThreadLocalContextLocator(), processors,其中backends是定制化的核心,之后加入到TRACKERS中,调用时,from eventtracking import mytracker就好,其他和原生的tracker无异
既然在读这块的源码,解决完任务,顺便做了更全面的探索(从框架层)
|
|
edx-platform/common/djangoapps/track/middleware.py中,tracker在request里产生,被注入了session之类的属性,tracker生成的时候就很强大了,这就是它有上下文的原因,django作为一个大而全的框架,在此威力在此显现出来
这个应该是配合js使用的,作为rest服务,这部分没详细去挖掘,我想模仿Segment的机制去实现
直接参考既有的插件就行了,这一部分倒是简单
最近在折腾Open edX数据相关的东西,同时试着将open edx与机器学习结合
如果你是EDM(educational data mining)的新玩家(我也是新手233),对教育领域的数据感兴趣,推荐你这篇论文《教育数据挖掘研究进展综述》,了解一下这个领域的概况和进展
官方的insights显得太重,我们打算享用这个免费午餐,但不定制它。对于个性化的数据分析,我们准备另起炉灶,完全独立于Open edX本身。架构上的设计主要为
我用周末的两天,搭建了初始模型,从目前的进展看来,这条路似乎还算康庄大道
架构中的第一条,产生了难题,我试着去hack tracking system的时候,发现它并不是个平坦的结构,hack起来十分痛苦,而我定制开源系统的原则之一是尽可能不侵入原代码。尽可能尊重原有架构,试着去理解它而不是急着改造它,后者的代价太沉重了,危机四伏
所以眼前的第一个任务是理解tracking system的机制,并优雅地定制它
写一个rest服务,在js中用ajax去发送事件(当然你也可以用edx采用的backbone),对应的rest服务去写日志(采用django或是python原生的方式都行),这种方式简单粗暴。因为违背了我拓展开源系统的原则,所以直接pass了
|
|
问题是日志没有单独剥离出来,分析时,日志量巨大,需要筛选出来,所以这是我们主要需要解决的问题
更好的范式为
|
|
出于国内网络的原因,我们可能需要考虑国内的Analytics服务,由于Analytics用种普遍需求,所以国内也容易找到同类产品:
Open edX中的tracking system产生的log与系统业务相关,数据特征皆为教育者所关心。并不是一种不是通用的数据(诸如nginx产生的日志就很通用,仅关心http请求本身),正是这种特质,使其适合作为EDM的数据源
由于当前文档的匮乏,我们只好直接翻源码了,涉及的源码主要包括
我们从产生emit(从语义就可以知道这是提交日志事件的功能函数)开始追踪,目的是找到产生独立log的方法:
从class的名字我们可以猜到这个类(Tracker)基本就是我们要找的东西啦
接下来找侵入的地方:
|
|
-> eventtracking/django/__init__.py 里override_default_tracker()注册tracker,而eventtracking.django的EventTrackingConfig是触发上边代码的地方,具体原理可见:
|
|
所以我们完全可以构造自己的tracker,因为TRACKERS是个dict,所以可以同时存在任意多的tracker,每个tracker可以有自己的backends,至此,探索完毕,问题解决
至于细节问题,构造tracker是主要的任务,直接用Tracker构造一个新的就好,核心参数是backends, ThreadLocalContextLocator(), processors,其中backends是定制化的核心,之后加入到TRACKERS中,调用时,from eventtracking import mytracker就好,其他和原生的tracker无异
既然在读这块的源码,解决完任务,顺便做了更全面的探索(从框架层)
|
|
edx-platform/common/djangoapps/track/middleware.py中,tracker在request里产生,被注入了session之类的属性,tracker生成的时候就很强大了,这就是它有上下文的原因,django作为一个大而全的框架,在此威力在此显现出来
这个应该是配合js使用的,作为rest服务,这部分没详细去挖掘,我想模仿Segment的机制去实现
直接参考既有的插件就行了,这一部分倒是简单