我们的系统主要流程是:对新闻分词->对新闻提取主题特征->挖掘用户特征->使用不同算法推荐
算法推荐的流程是 训练用户模型->对user,article对评分->对每个用户提取得分高的article推荐
对于协同过滤,我们认为训练过程就是找与用户相似的用户,而用户对新闻的评分由与他相似的用户加权平均来取
每一个流程都应该相互独立,能够单独运行,单独改进,模块之间的关系只通过数据流相关,没有直接调用的关系,比如Recommender不会去调用特征生成,而是通过Provider去取特征,取不到Provider会自动调用算法生成,Provider在这里面就扮演了数据流的作用,解耦了两个模块之间的关系,这样不一样的推荐方法就能与不一样的特征,不一样的语料分析方法随意组合。
- 中文分词:Jieba分词
- ORM框架:MongoEngiene
- 语料主题模型分析:gensim
- 聚类和K近邻等机器学习算法:scikit-learn
- WEB开发:Django
- 科学计算:numpy和scipy
在算法运行期间,我们提供多种方式来存储数据,其中包括mongoDB数据库,本地文件,缓存.
我们使用统一的CacheUtil来管理缓存的本地持久化和读取操作.
使用Provider来统一实现从三种数据源读取中间数据并在无法读取时调用算法生成特征
- CacheUtil:中间文件管理
- DBUtil:批量写入数据库操作
- WordExtractor:分词工具
- CorpusHandler:主题提取和语料生成工具
- Trainer:训练用户的模型
- Predictor:求取用户对新闻的评分
- Recommender:最后实际对用户进行推荐
- Evaluator:计算算法的优劣
我们希望做到每一个流程都能单独运行,单独改进,而不影响其他模块的运行,在console包里面我们专门提供从命令行启动每一个模块的脚本文件.
- 基于内容的简单推荐
- 基于用户的协同过滤