河北省建设局材料备案网站,专业制作银行存单,邱杰wordpress,网站编辑做seo好做吗随机匹配
目的 为了帮大家更快地发现和自己兴趣相同的朋友 问题 匹配 1 个还是匹配多个#xff1f; 答#xff1a;匹配多个#xff0c;并且按照匹配的相似度从高到低排序 怎么匹配#xff1f;#xff08;根据什么匹配#xff09; 答#xff1a;标签 tags 还可以根据 us…随机匹配
目的 为了帮大家更快地发现和自己兴趣相同的朋友 问题 匹配 1 个还是匹配多个 答匹配多个并且按照匹配的相似度从高到低排序 怎么匹配根据什么匹配 答标签 tags 还可以根据 user_team 匹配加入相同队伍的用户 本质找到有相似标签的用户 举例 用户 A[Java, 大一, 男] 用户 B[Java, 大二, 男] 用户 C[Python, 大二, 女] 用户 D[Java, 大一, 女]
1. 怎么匹配 找到有共同标签最多的用户TopN 共同标签越多分数越高越排在前面 如果没有匹配的用户随机推荐几个降级方案
2. 怎么对所有用户匹配取 TOP
直接取出所有用户依次和当前用户计算分数取 TOP N 优化方法 切忌不要在数据量大的时候循环输出日志取消掉日志后 20 秒Map 存了所有的分数信息占用内存解决 维护一个固定长度的有序集合sortedSet只保留分数最高的几个用户时间换空间 e.g : 【3, 4, 5, 6, 7】取 TOP 5id 为 1 的用户就不用放进去了细节剔除自己 √尽量只查需要的数据 a. 过滤掉标签为空的用户 √ b. 根据部分标签取用户前提是能区分出来哪个标签比较重要 c. 只查需要的数据比如 id 和 tags √7.0s提前查定时任务提前把所有用户给缓存不适用于经常更新的数据提前运算出来结果缓存针对一些重点用户提前缓存 大数据推荐 比如说有几亿个商品难道要查出来所有的商品 难道要对所有的数据计算一遍相似度
检索 召回 粗排 精排 重排序等等
检索尽可能多地查符合要求的数据比如按记录查 召回查询可能要用到的数据不做运算 粗排粗略排序简单地运算运算相对轻量 精排精细排序确定固定排位 分表学习建议 mycat框架sharding sphere 框架一致性hash
随机匹配实现 编辑距离算法 https://blog.csdn.net/DBC_121/article/details/104198838 最小编辑距离字符串 str1 通过最少多少次增删改字符的操作可以变成字符串str2
! 没学过,不要紧,直接当成黑盒导入使用即可 余弦相似度算法 https://blog.csdn.net/m0_55613022/article/details/125683937如果需要带权重计算比如学什么方向最重要性别相对次要
后端
引入工具类
新建工具类 cv 代码过来 简单测试一下 之前都是传入字符串,而实际需要比较的是两组字符数组 测试一下,是可以的 取出所有用户依次和当前用户计算分数 bug : 笑死,为什么这里打印出来和数据库不一样 解决 使用这段代码成功
for (int i 0; i userList.size(); i) {
User user userList.get(i);
String userTags user.getTags();
//无标签的
if (StringUtils.isBlank(userTags)){
continue;
}
ListString userTagList gson.fromJson(userTags, new TypeTokenListString() {
}.getType());
//计算分数
int distance AlgorithmUtils.minDistance(tagList, userTagList);
indexDistanceMap.put(i,distance);
}使用这段代码失败 明明一样
for (int i 0; i userList.size(); i) {
User useruserList.get(i);
String userTagsuser.getTags();
//判断用户是否有标签列表
if(StringUtils.isBlank(userTags))
{
continue;
}
//将tags字符串转换为List
ListString userTagListgson.fromJson(tags,new TypeTokenListString(){
}.getType());
//计算分数(分数越低,相似度越高)
int distanceAlgorithmUtils.minDistance(tagList,userTagList);
indexDistanceMap.put(i,distance);
}完整代码 public ListUser matchUsers(int num, User loginUser) { QueryWrapperUser queryWrapper new QueryWrapper();
queryWrapper.isNotNull(tags);
queryWrapper.select(id,tags);
//1.查询所有用户
ListUser userListthis.list(queryWrapper);
//2.获取当前登录用户的标签
//todo 前端传来可能是多个标签,这里是以字符串形式传递的吗?????
String tagsloginUser.getTags();
Gson gsonnew Gson();
//将字符串转换为List
ListString tagListgson.fromJson(tags,new TypeTokenListString(){ }.getType());
System.out.println(当前登录用户的tagList : tagList);
//用户列表的下标:相似度
ListPairUser,Integer listnew ArrayList();
//3.遍历用户列表,获得相似度分数
for (int i 0; i userList.size(); i) {
User useruserList.get(i);
String userTagsuser.getTags();
//判断无标签或者当前user是登录用户
if(StringUtils.isBlank(userTags) || loginUser.getId().equals(user.getId()))
{
continue;
}
//将tags字符串转换为List
ListString userTagListgson.fromJson(userTags,new TypeTokenListString(){
}.getType());
//计算分数(分数越低,相似度越高)
int distanceAlgorithmUtils.minDistance(tagList,userTagList);
list.add(new Pair(user,distance));
}
//4.按照编辑距离由小到大排序
ListPairUser, Integer topUserPairList list.stream()
.sorted((a, b) -(int) (a.getValue() - b.getValue()))
.limit(num)
.collect(Collectors.toList());
//有顺序的userID列表
ListInteger userListVo topUserPairList.stream().map(pari - pari.getKey().getId()).collect(Collectors.toList()); //根据id查询user完整信息
QueryWrapperUser userQueryWrapper new QueryWrapper();
userQueryWrapper.in(id,userListVo); MapInteger, ListUser userIdUserListMap this.list(userQueryWrapper)
.stream()
.map(user - getSafetyUser(user))
.collect(Collectors.groupingBy(User::getId)); // 因为上面查询打乱了顺序这里根据上面有序的userID列表赋值
ListUser finalUserList new ArrayList();
for (Integer userId : userListVo){
finalUserList.add(userIdUserListMap.get(userId).get(0));
}
return finalUserList;
}