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

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

概述

余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。
详见 百度百科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[]
Python中的文本相似度可以通过基于TF-IDF和余弦相似度算法来实现。TF-IDF(Term Frequency-Inverse Document Frequency)是用于评估一个词语在一个文档中的重要程度的方法。 首先,我们需要使用Python中的文本处理库(如nltk)来对文本进行预处理,包括分词、去除停用词、词干化等。接下来,我们可以使用sklearn库中的TF-IDF向量化器来将文本转换为TF-IDF特征向量。 然后,我们可以使用余弦相似度算法来计算两个文本之间的相似度。余弦相似度是通过计算两个向量之间的夹角来度量它们的相似程度的。 以下是一个简单的示例代码: ```python import nltk from nltk.corpus import stopwords from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity def preprocess_text(text): # 分词 tokens = nltk.word_tokenize(text) # 去除停用词 stop_words = set(stopwords.words('english')) tokens = [token for token in tokens if token.lower() not in stop_words] # 词干化 stemmer = nltk.PorterStemmer() tokens = [stemmer.stem(token) for token in tokens] # 返回处理后的文本 return " ".join(tokens) def calculate_similarity(text1, text2): # 预处理文本 processed_text1 = preprocess_text(text1) processed_text2 = preprocess_text(text2) # 转换为TF-IDF特征向量 vectorizer = TfidfVectorizer() tfidf_matrix = vectorizer.fit_transform([processed_text1, processed_text2]) # 计算余弦相似度 cosine_sim = cosine_similarity(tfidf_matrix[0], tfidf_matrix[1]) # 返回相似度 return cosine_sim[0][0] text1 = "今天天气不错" text2 = "今天天气很好" similarity = calculate_similarity(text1, text2) print("文本1和文本2的相似度为:", similarity) ``` 在以上示例中,我们先对文本进行了预处理,并使用TF-IDF向量化器将其转换为特征向量。然后,我们使用余弦相似度算法计算了文本1和文本2之间的相似度,并输出结果。 这只是一个简单的示例,实际应用中可能需要更多的预处理步骤和参数调整来获得更好的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值