前言
今天下午克隆了一个前端项目,然后在本地运行了一下,与本地的后端接口进行了一系列的测试,发现了一些体验不好的问题,有的地方还有一些报错,所以集中来处理一下,提高一下用户的体验。
使用协同过滤算法,进行文章推荐的问题
(1)在为用户进行基于协同过滤的推荐时,由于要获取用户的数据,才能进行个性化推荐,而对于没有登陆的游客来说,或者一个没有进行浏览的用户来说,这个部分的显示却是空的。
如下图,猜你喜欢部分,显示为空:
对应后端报错:显示获取不到用户的登陆信息,有关token的获取出错,由于用户没有登陆,所以没有token,而这个接口是需要有token的用户才能获取的。
解决方案:
所以对于未登陆的用户,由于没有token,
由于@RequestAttribute注解的参数,默认是不能为空的,否则系统会抛出异常,它也有一个required配置项,只需要设置它为false,参数就可以为空了:
这样就可以在未登陆得时候随即返回参数了。
(2)协同过滤的推荐算法,速度太慢,获取一个列表,20条博客,往往需要5s左右,体验太差。
查看后端源代码,由于我对协同过滤算法使用到的数据已经进行了定时的物化,每20分钟就会物化一次用户的浏览记录到本地的csv中
但是发现,在进行协同过滤时,每个用户获取列表,都需要读取这两个csv文件,并且调用相应的相似度计算方法,计算皮尔逊相似度。
这里面存在着大量的重复性的工作。所以想着使用缓存机制,在定时抽取到csv文件后,都将模型加载到内存中,并且计算出相似度矩阵,等到协同过滤推荐的使用
这里我试用了以下的方法
参考与:https://www.jianshu.com/p/08973c447c55
这个注解会在项目初始化时,执行下面的方法。
实现:
//定时的初始化
@PostConstruct
public void postConstruct() throws IOException, TasteException {
userCategoryDataModel = new FileDataModel(new File(USER_CATEGORY_MODEL_FILE_NAME));
userTagDataModel = new FileDataModel(new File(USER_TAG_MODEL_FILE_NAME));
userCategoryUserSimilarity = new PearsonCorrelationSimilarity(userCategoryDataModel);
userCategoryItemSimilarity = new PearsonCorrelationSimilarity(userCategoryDataModel);
userTagUserSimilarity =new PearsonCorrelationSimilarity(userTagDataModel);
userTagItemSimilarity = new PearsonCorrelationSimilarity(userTagDataModel);
System.out.println("模型初始化完成");
}
这样处理以后,推荐的效率快了许多。
访问时下流行界面的问题
热榜出现问题
未解决,不知道哪里的问题
协同过滤推荐模块Mahout,回因为新注册用户,没有用户的浏览记录而出错
解决方案:
在后端加入try catch ,捕获这个错误,如果有这个错误就随机返回文章
获取订阅列表时,服务器出错
应该是sql出错了,检查一下
发现是,传入的tagIdList如果为空,则sql会执行报错,所以加一层判断,如果tagIdList为空,则返回空