基于协同过滤的推荐系统设计

核心提示针对海量的新闻资讯数据,如何快速的根据用户的检索需要,完成符合用户阅读需求的新闻资讯推荐?本篇文章主要采用余弦相似度及基于用户协同过滤算法实现新闻推荐,通过余弦相似度算法完成针对不同新闻数据之间的相似性计算,实现分类标签。通过协同过滤算法发

针对海量的新闻信息数据,如何根据用户的检索需求,快速完成满足用户阅读需求的新闻信息推荐?本文主要采用余弦相似度和用户协同过滤算法来实现新闻推荐。通过余弦相似度算法,计算不同新闻数据之间的相似度,实现分类标注。通过协同过滤算法,找到阅读习惯相似的用户,进行个性化推荐。

这个新闻推荐系统:

主要技术:springboot,mybatis,mysql,javascript,vue.js,html,css。

主要算法:余弦相似度,基于用户协作的过滤推荐。

一.系统设计

系统前后台分离,系统前端主要通过Vue.js、javascript、html、CSS等技术实现。系统后端框架采用springboot+mybatis+mysql的数据库构建,对海量新闻信息数据采用分表操作完成数据存储和分析。系统前后台的数据交互通过Ajax异步调用传输JSON实现。该系统的架构主要分为四个层次:基础数据存储、新闻爬虫、新闻分析计算、新闻网站前端。其中,爬虫主要是定期收集互联网上各大新闻网站的公开信息数据,完成数据清洗、过滤等操作。主要系统架构设计如下:

第二,效果实现了

# # #登录界面

# # #系统主页

# # #推荐列表

# # #新闻搜索

# # #新闻详情

# # #浏览历史记录

其他效果省略。

三。系统算法介绍

# # #余弦相似性算法

余弦相似度,也称余弦相似度,是通过计算两个向量夹角的余弦来评价两个向量的相似度。余弦相似度根据坐标值将向量绘制到vector 空房间,比如最常见的二维空房间。

余弦相似度度量两个向量之间的角度,结果用角度的余弦来表示,所以两个向量的余弦相似度为:

是分子矢量A和矢量B的点乘,分母是它们各自的L2乘法,即所有量纲值的平方相加,求根。

余弦相似度的值为[-1,1],值越大越相似。

余弦相似度的Java代码实现

` ` java

公共静态double getSimilarity {

如果。长度> 0 doc2!= null doc2.trim.length > 0){

Map AlgorithmMap = new HashMap

//将两个字符串中的汉字和出现的总次数封装到AlgorithmMap中。

对于;i++) {

char D1 = doc 1 . charat;

If) {//不处理标点和数字

int charIndex = getGB2312Id//保存字符对应的GB2312代码

如果{

int[]FQ = algorithm map . get;

如果{

FQ[0]++;//该字符已经存在,添加1

}否则{

FQ = new int[2];

FQ[0]= 1;

FQ[1]= 0;

AlgorithmMap.put//向地图添加新字符

}

}

}

}

对于;i++) {

char D2 = doc 2 . charat;

如果){

int charIndex = getGB2312Id

如果{

int[]FQ = algorithm map . get;

如果{

FQ[1]++;

}否则{

FQ = new int[2];

FQ[0]= 0;

FQ[1]= 1;

AlgorithmMap.put

}

}

}

}

iterator iterator = algorithm map . keyset . iterator;

double sqdoc 1 = 0;

double sqdoc 2 = 0;

双分母= 0;

while ) {

int[]c = algorithm map . get);

分母+= c[0]* c[1];

sq doc 1+= c[0]* c[0];

sqdoc 2+= c[1]* c[1];

}

double v = denominator/math . sqrt;//余弦计算

v = double . isnan 0d:v;

回归v;

}否则{

抛出新的NullPointerException

}

}

```

# # #协同过滤推荐算法

协同过滤算法是一个大的范畴,主要包括基于用户的、基于项目的以及两者的结合。在这里,我主要介绍基于用户的协同过滤算法。主旨也很简单。中国有句谚语,“物以类聚,人以群分。”我们可以确定,一个和你非常相似的用户喜欢的物品,也是你大概率喜欢的物品。这就是基于用户的协同过滤推荐算法的思想。基于用户的协同过滤推荐的实现主要包括以下步骤:

> 1.计算用户相似度

2.获取需要推荐给用户的物品。

基于用户协同推荐算法的实现

` ` java

公共静态列表XtglNewsTj {

int N = userInfos.size

//为用户相似度计算建立用户稀疏矩阵[相似度矩阵]

int[][]sparse matrix = new int[N][N];

//存储不同的总数,例如:对应于每个用户的A 3

Map userItemLength = new HashMap

//为用户建立一个倒排的新闻列表

map > item user collection = new HashMap;

Set items = new HashSet//新闻收藏的辅助存储

Map userID = new HashMap//辅助存储每个用户的用户ID映射

Map idUser = new HashMap//辅助存储每个ID对应的用户映射

For{//以空的间隔顺序处理n个用户输入数据

userItemLength.put.getKey,user infos . get . getvalue . size);//例如:A 3

userID.put.getKey,I);//用户ID与稀疏矩阵建立对应关系

id user . put . getkey);

//创建新闻用户倒排列表

for . getvalue . size;j ++){

If.getValue.get)){//如果已经包含对应的新闻-用户映射,则直接添加对应的用户。

item user collection . get . getvalue . get). add . getkey);

}else{//否则,创建相应的新闻-用户集合映射。

items . add . getvalue . get);

item user collection . put . getvalue . get,new HashSet);//创建新闻-用户倒置关系

item user collection . get . getvalue . get). add . getkey);

}

}

}

system . out . println);

//计算相似矩阵[稀疏]

set > entry set = item user collection . entry set;

iterator > iterator = entry set . iterator;

while){

set common users = iterator . next . getvalue;

对于{

对于{

如果){

继续;

}

sparse matrix[userid . get][userid . get]+= 1;

}

}

}

/计算用户之间的相似度[余弦相似度]

int re commend userid = userid . get;

List res = new ArrayList

对于{

如果{

system . out . println+"-"+id user . get+"相似度:"+稀疏矩阵[推荐UserID][j]/math . sqrt)* useitemlength . get))));

}

}

//计算指定用户推荐用户的新闻推荐度

list recommend infos = new ArrayList;

因为{//遍历每条新闻

set users = item user collection . get;//获取当前新闻的所有用户集合

If){//如果推荐用户的当前新闻,计算推荐度。

double itemRecommendDegree = 0.0

对于{

itemrecommendegree+= sparse matrix[userid . get][userid . get]/math . sqrt * user item length . get);//推荐度的计算

}

recommend infos . add);

}

}

recommondInfos.sort {

@覆盖

公共int比较{

返回O2 . getvalue . compare to);

}

});

返回联合收割机;

}

```

 
友情链接
鄂ICP备19019357号-22