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

主要技术: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);

}
});
返回联合收割机;
}
```


