风控中的文本相似方法之余弦定理

一、 余弦相似概述

余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。

从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。结果是与向量的长度无关的,仅仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为-1到1之间。

例如在信息检索中,每个词项被赋予不同的维度,而一个维度由一个向量表示,其各个维度上的值对应于该词项在文档中出现的频率。余弦相似度因此可以给出两篇文档在其主题方面的相似度。另外,它通常用于文本挖掘中的文件比较,在数据挖掘领域中,会用到它来度量集群内部的凝聚力。

二、 余弦相似应用场景

原创文章检测:通过文本相似,可以检测公众号文章、论文等是否存在抄袭

垃圾邮件识别:如“诚聘淘宝兼职”、“诚聘打字员”、“文章代写”、“增值税发票”等这样的小广告满天飞,作为网站或者APP的风控,不可能简单的加几个关键字就能进行屏蔽的,一般常用的方法就是标注一部分典型的广告文本,与它相似度高的就进行屏蔽。

内容推荐系统:在腾讯新闻、微博、头条、知乎等,每一篇文章、帖子的下面都有一个推荐阅读,那就是根据一定算法计算出来的相似文章。

冗余新闻过滤:我们每天接触过量的信息,信息之间存在大量的重复,相似度可以帮我们删除这些重复内容,比如,大量相似新闻的过滤筛选。

可用于文本相似的方法非常多,比如基于字符的杰卡德相似、编辑距离相似、最长公共子串等,基于距离的相似也很多,比如汉明距离、欧几里得距离等。本文介绍的是余弦距离相似,比较简单,可以作为风控领域文本相似的入门。

废话不多说,先看一个案例,我们用三句话作为例子,我从自己的邮箱里面扒出来的垃圾邮件,具体步骤如下。

三、 计算文本余弦相似

第一步,分词。

A句子:有/发票/加/薇/45357

B句子:有/发票/加/微/45357

C句子:正规/ 增值税/ 发票

第二步,列出所有的词(所有词的长度作为向量长度)

有,发票,加,薇,微,45357,正规,增值税

第三步,计算词频

A句子:有 1,发票 1,加 1,薇 1,微 0,45357 1,正规 0,增值税 0

B句子:有 1,发票 1,加 1,薇 0,微 1,45357 1,正规 0,增值税 0

C句子:有 0,发票 1,加 0,薇 0,微 0,45357 0,正规 1,增值税 1

第四步,写出词频向量。

A句子:[1, 1, 1, 1, 0, 1, 0 ,0]

B句子:[1, 1, 1, 0, 1, 1, 0 ,0]

C句子:[0, 1, 0, 0, 0, 0, 1 ,1]

到这里,问题就变成了如何计算这两个向量的相似程度。我们可以把它们想象成空间中的两条线段,都是从原点(0, 0, ...)出发,指向不同的方向。两条线段之间形成一个夹角,如果夹角为0度,意味着方向相同、线段重合;如果夹角为90度,意味着形成直角,方向完全不相似;如果夹角为180度,意味着方向正好相反。因此,我们可以通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。

以二维空间为例,上图的a和b是两个向量,我们要计算它们的夹角θ。根据初中知识,余弦定理告诉我们,可以用下面的公式求得:

图片

假定a向量是[x1, y1],b向量是[x2, y2],那么可以将余弦定理改写成下面的形式:

图片

数学家已经证明,余弦的这种计算方法对n维向量也成立,假定A和B是两个n维向量,A是 [A1, A2, ..., An] ,B是 [B1, B2, ..., Bn] ,则A与B的夹角θ的余弦等于:

图片

使用这个公式,我们就可以得到,句子A与句子B的夹角的余弦。

图片

下面我们用Python代码计算看看

import numpy as npA = np.array([1, 1, 1, 1, 0, 1, 0 ,0])B = np.array([1, 1, 1, 0, 1, 1, 0 ,0])C = np.array([0, 1, 0, 0, 0, 0, 1 ,1])#定义相似计算函数def cos_simi(x,y):   num = x.dot(y.T)   denom = np.linalg.norm(x) * np.linalg.norm(y)   return num / denomcos_simi(A,B)0.7999999999999998cos_simi(A,C)0.2581988897471611cos_simi(B,C)0.2581988897471611

[有/发票/加/薇/45357]  和 [有/发票/加/微/45357] 只有一个字的差异,相似度0.80

[有/发票/加/薇/45357]  和 [正规/ 增值税/ 发票] 只有一个词相同,相似度0.2581,结果符合我们的感知。到此,我们就学会了计算两个句子的相似度

四、完整版代码

# 输入A,B两段语句,判断相似度

import jieba
from collections import Counter

def preprocess_data(text):
    """数据预处理函数,分词并去除停用词"""
    # 使用结巴分词对文本进行分词
    words = jieba.cut(text)
    # 去除停用词,这里只列举了几个示例停用词,实际应用中需要根据具体需求添加更多停用词
    stopwords = ['的', '了', '和', '是', '就', '而', '及', '与', '或']
    filtered_words = [word for word in words if word not in stopwords]
    return filtered_words

def extract_features(words):
    """特征提取函数,使用词袋模型"""
    features = Counter(words)
    return str(features)

def cosine_similarity(features1, features2):
    """余弦相似度计算函数"""
    numerator = sum(features1[word] * features2[word] for word in set(features1) & set(features2))
    denominator = ((sum(features1[word] ** 2 for word in features1) ** 0.5) * (
            sum(features2[word] ** 2 for word in features2) ** 0.5))
    if not denominator:
        return 0.0
    else:
        return round(numerator / float(denominator), 3)


def check_duplicate(content, input_text, threshold=0.7):
    """查重函数,判断当前文本是否与已有文本重复"""
    # 对当前文本进行预处理和特征提取
    words = preprocess_data(content)
    features = extract_features(words)
    
    # 在此模拟已有文本的特征
    existing_features = extract_features(preprocess_data(input_text))
    
    similarity = cosine_similarity(eval(features), eval(existing_features))
    
    # 根据设定的相似度阈值来判断是否重复
    if similarity >= threshold:
        return similarity
    else:
        return similarity


similarity = check_duplicate("我是你的人","我是你的情人")
print('similarity',similarity)

原文链接:在此鸣谢小伍哥!!!https://mp.weixin.qq.com/s?__biz=MzA4OTAwMjY2Nw==&mid=2650188043&idx=2&sn=2fd5d3e143050092ebbee5969a153852&chksm=88238ecfbf5407d9a0a31ba2d892f87214e7225becf25ec4c209a66e4283aa2c08b990bfb73c&scene=21#wechat_redirect

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/705712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重新安装TortoiseGit后提示权限错误问题解决

今天在Windows11系统中下载安装使用TortoiseGit可视化Git工具,进行代码提交管理。 由于电脑之前是一位开发人员在使用,所以曾经安装使用过这个工具。 重新安装好软件后,在coding网站中复制代码路径后,在本地目录通过鼠标右键选择…

WPF/C#:异常处理

什么是异常? 在C#中,异常是在程序执行过程中发生的特殊情况,例如尝试除以零、访问不存在的文件、网络连接中断等。这些情况会中断程序的正常流程。 当C#程序中发生这种特殊情况时,会创建一个异常对象并将其抛出。这个异常对象包…

Go微服务框架Kratos中makefile命令的使用方法及报错处理

运用 kratos 微服务框架开发项目时,可以使用提供的 makefile 中的命令自动且快速生产相关代码,提高开发效率。 krotos中makefile文件内容如下: GOHOSTOS:$(shell go env GOHOSTOS) GOPATH:$(shell go env GOPATH) VERSION$(shell git descri…

翻译英文文献工具

翻译英文文献工具 1. zotero1. 安装zotero2. 安装pdf翻译器2.1. 查看zotero版本2.2. 下载对应的pdf翻译器插件版本2.3. 安装插件2.4. 使用插件 2. 小绿鲸英文文献阅读器1. 安装2. 使用 1. zotero 1. 安装zotero 官网: https://www.zotero.org/ 一键next默认安装就…

(四)React组件、useState、组件样式

1. 组件 1.1 组件是什么 概念:一个组件就是用户界面的一部分,它可以有自己的逻辑和外观,组件之间可以相互嵌套,也可以复用多次。 组件化开发可以让开发者像搭积木一样构建一个完整的庞大应用 1.2 React组件 在React中&#xf…

独具韵味的移动端 UI 风格

独具韵味的移动端 UI 风格

《转载》前苏联的三进制计算机Setun

1、苏联的三进制计算机概述 早在 1956 年,就需要创建一种可在大学和实验室中使用的实用数字计算机模型。为此,需要一种易于学习、可靠、廉价但同时高效、专为大规模使用而设计的小型计算机。 对这种机器的要求:运行速度必须等于每秒数百次操作…

求单源最短路径的新方法

参见:dijkstra 算法为什么高效。 本来不想谈算法,本来只想了一下 dijkstra 算法背后的形而上,但还是归纳出一个仅靠一次广度优先遍历就能获得单源最短路径的新算法,框图里是算法流程,流程下是一个例子: …

Ubuntu Server 20.04挂载磁盘

先查看磁盘信息: sudo fdisk -l然后提供NTFS文件系统支持: sudo mkfs.ntfs /dec/sda -F这个过程非常久… 处理完如上图。(ps. 这个 Have a nice day. 好浪漫~) 接着挂载磁盘: sudo mount /dev/sda ~/device设置开机…

系统架构设计师 - 操作系统(2)

操作系统 操作系统(5-6分)文件管理绝对路径与相对路径 ★索引文件 ★★★位示图 ★ 存储管理段页式存储 ★★★页式存储段式存储段页式存储(了解) 页面置换算法 ★ 微内核操作系统嵌入式操作系统 ★★★ 大家好呀!我是…

第五十一天 | 1143.最长公共子序列

题目:1143.最长公共子序列718.最长重复子数组的区别是,子序列不要求连续,子数组要求连续。这一差异体现在dp数组含义和递推公式中,本题是子序列,那就要考虑上nums1[i - 1] ! nums2[j - 1]的情况。 本道题与 1.dp数组…

vue 应用测试(一) --- 介绍

vue 应用测试(一) ---介绍 前端测试简介组件测试Jest 测试框架简介其他测试框架 第一个测试避免误报如何组织测试代码 组件挂载Vue2 组件挂载的方式Vue3 的挂载方式vue-test-utils挂载选项 如何调试测试用例参考小结 前端测试简介 软件测试:…

【每日一练 】day2

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 🎈丠丠64-CSDN博客🎈 ✨✨ 帅哥美女们,我们共同加油!一起…

企业多云策略的优势与实施指南

企业在选择云服务提供商时,常见的选项包括亚马逊AWS、微软Azure、谷歌云GCP、阿里云、腾讯云和华为云。为了避免过度依赖单一供应商,许多企业选择采用多云策略,这样可以充分利用不同云服务的优势,同时避免重复工作和其他额外的工作…

大模型应用开发课程上新!

在人工智能快速发展的今天,大模型应用已逐渐渗透到各个行业,对我们的工作和生活产生了深远的影响。越来越多的企业和开发者渴望深入探索大模型落地应用,然而却缺少高质量且专业的培训课程及学习途径。 为满足企业和开发者在实际场景中使用大…

ROS——自定义话题消息和使用方法

定义Person话题 定义Person发布者 /*** 该例程将发布/person_info话题&#xff0c;自定义消息类型&#xff1a; test_topic::Person*/#include <ros/ros.h> #include <test_topic/Person.h> //包含的头文件&#xff0c;ros相关的头文件&#xff0c;及自定义头文件…

单点登录分析介绍

文章目录 1、单点登录解决方案1.1、后端保存登录状态1.2、token模式 2、user服务-登录接口2.1、UserController2.2、UserInfoServiceImpl2.3、载荷2.4、响应2.5、Redis Desktop Manager 1、单点登录解决方案 多个系统只有一个登录服务 1.1、后端保存登录状态 1.2、token模式 …

Excel根据身份证号提取信息

概览 本篇文章主要对根据身份证号码提取出生年月日、年龄、性别、退休年龄这三项进行讲解。 一. 提取出生年月日 公式&#xff1a;TEXT(MID(B2,7,8),“0000-00-00”) MID(B2,7,8)&#xff1a;表示从单元格 B2 中的字符串&#xff08;这里是身份证号&#xff09;&#xff0c…

Day 43 keepalived高可用集群

keepalived高可用集群 负载均衡 lb集群 load balance ​ 流量分发 高可用 ha集群 high availability ​ 主要是给服务器做冗余 keepalive 持久连接 保持存活 keepalived 高可用软件名称 红帽有自己的高可用集群套件&#xff1a;RHCS keepalived介绍 ​ keepalived是集…

世优波塔AI数字人多模态交互系统,让智慧教育多维度落地应用

“你是谁&#xff0c;你能做什么&#xff1f;”、“降落伞应该包含哪些部分&#xff1f;”、“制作降落伞需要什么流程&#xff1f;”在北京四中雄安校区的实践课堂上&#xff0c;一个数字人AI一体机在教室中央引人注目&#xff0c;老师和学生们争相向名叫“小优”的“数字老师…