算法-入门篇(余弦相似度)

余弦相似度是评估向量间相似性的方法,常用于密码验证场景。通过计算两个向量的夹角余弦值,判断密码的相似度。在实际应用中,由于现实差异,采用词袋模型对密码进行特征提取,并通过比较特征向量的余弦值来确定相似度。本文将介绍如何实现这一算法并进行测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。
详见 百度百科https://baike.baidu.com/item/%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E5%BA%A6/17509249?fr=aladdin

数学模型
在这里插入图片描述
计算公式
在这里插入图片描述

一般来讲最终数据越接近于1,表示分子与分母部分的夹角越小

用途:

使用 余弦相似度的场景一般用在判断两条数据的相似程度上,常见使用在,风控系统中对密码验证的场景等。当相似度即最终值越接近于1时,表示密码的相似度越高。

使用

本文将根据 密码相似度验证 简单介绍此算法的使用。

  • 所谓验证密码相似度,可以转化为求当前请求密码中的所有字符历史密码相似度的判定。

但是,现实往往是存在着差异性的,比如用户的历史密码的长度都不一致等,因此,在此场景下,我们需要引入词袋

词袋:词袋模型(英语:Bag-of-words model)是个在自然语言处理和信息检索(IR)下被简化的表达模型。

百度百科:https://baike.baidu.com/item/%E8%AF%8D%E8%A2%8B%E6%A8%A1%E5%9E%8B/22776998?fr=aladdin

  • 使用词袋,我们对所有在密码(包括历史密码与当前请求密码)出现过的字符进行提取,通过每个密码中的字符的出现次数进行建模提取出每个密码的特征向量
  • 最后通过比较,当前请求密码的特征向量与历史每个密码的特征向量的余弦值大小,判断相似度

代码实现

  /**① 主干--作评估
  ordernessPassword ---- 请求密码
  historyOrdernessPasswords ----- 历史密码集合
  */
    public boolean doEval(String ordernessPassword, Set<String> historyOrdernessPasswords){
   
        //如果历史密码没有,则证明第一次登陆,不校验
        if(historyOrdernessPasswords.size()==0 || historyOrdernessPasswords==null){
   
            return false;
        }
        //获取包含所有历史密码的词袋
        Set<Character> wordBag = new HashSet<Character>();
        //获取历史密码流
        List<char[]> collect = historyOrdernessPasswords.stream().map(histroyt -> histroyt.toCharArray()).collect(Collectors.toList());
        for (char[] chars : collect) {
   
            for (int i = 0; i < chars.length; i++) {
   
                //词袋获取所有历史的单词
                wordBag.add(chars[i]);
            }
        }
        //将当前输入的密码加入词袋
        char[]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值