机器学习 -- 余弦相似度

news2024/11/18 7:48:37

场景

我有一个 页面如下(随便找的):

我的需求是拿到所有回答的链接,在这里插入图片描述
再或者我在找房子网上,爬到所有的房产信息,我们并不想做过多的处理,我只要告诉程序,请帮我爬一个类似 xxx 相似度为0.5的就可以了,然后我自会写一小段代码去给数据清洗,这就免去了每次不同网站写不同的一套脚本的痛苦。这里就用到了 余弦相似度

余弦相似度

余弦相似度,又称为余弦相似性,是通过测量两个向量的夹角的余弦值来度量它们之间的相似性。两个方向完全相同的向量的余弦相似度为1,而两个彼此相对的向量的相似度为-1。 注意,它们的大小并不重要,因为这是方向的度量。

余弦定理:
在这里插入图片描述
所以余弦的计算公式如下:
在这里插入图片描述
有向量 a,b 他们的余弦值的公式是:
在这里插入图片描述
这个可能和k近邻算法听起来有些相似。但是也有不同

余弦相似度通常用于计算两个向量间的相似度,尤其常见于文本处理中。它通过测量两个向量间夹角的余弦值来判断它们的相似度。而k近邻算法是一种基于实例的学习或非泛化学习,它不试图构造一个通用内部模型,而是简单地存储实例数据。在分类时,新的数据点会被分配到它最近邻的类别。

所以余弦相似度更适合比较文本的相似程度,而k近邻算法常用于分类问题

优缺点

余弦相似度是一种测量两个向量在方向上的相似度的度量。它广泛用于文本分析,特别是在计算文档或文本片段之间的相似性时。

优点

1.不受大小影响:余弦相似度仅考虑向量间的角度,而不受其大小(即向量的长度或幅度)的影响,这使得它特别适用于文本数据,其中词频(长度)可能不是很重要。

2.效率较高:在稀疏数据集(如文本数据)上计算余弦相似度通常比其他相似度测量更高效。
适合高维数据:它适用于高维数据集,例如文本数据,其中每个维度代表一个不同的单词。

缺点

1.不考虑非共有特征:仅考虑两个向量共有的特征(即同时在两个向量中出现的元素),这可能会忽略某些重要信息。

2.对数据分布敏感:在某些情况下,数据的分布会影响余弦相似度的结果,尤其是当两个向量的长度相差悬殊时。

业务应用

1.获取html文本内容,我有两个html文件(获取html很容易,自动化和http请求都可以做到,但是要注意robot.txt协议),h6是一个整体的大html ,h7是案例html,我要拿的是 所有回答的链接,所以h7就是随机一个链接的html

file_path = 'D:/herche_ai/h6.html'  
with open(file_path, 'r', encoding='utf-8') as file:
    html_content = file.read()


file_path = 'D:/herche_ai/h7.html' 
with open(file_path, 'r', encoding='utf-8') as file:
    target_html = file.read()
  1. 构建特征向量,我们利用BeautifulSoup将所有元素都趴下来,随后我们将其转为字符串表示
def build_feature_vector(html):
    """构建特征向量"""
    soup = BeautifulSoup(html, 'html.parser')
    elements = soup.find_all()
    elements_str = [element_to_string(el) for el in elements]
    return elements_str, elements
def element_to_string(element):
    """将元素转换为字符串表示"""
    return f"{element.name} {' '.join([f'{k}={v}' for k, v in element.attrs.items()])}"

3.构建源html和目标html的特征

# 构建原始html特征向量
    html_elements_str, html_elements = build_feature_vector(html)
# 构建目标html特征向量
    target_elements_str, _ = build_feature_vector(target_html)

4.处理文本

    vectorizer = CountVectorizer().fit(html_elements_str + target_elements_str)

CountVectorizer主要用于文本处理,它通过计数每个单词在文本中出现的频率来将文本转换为数值向量。这个过程可以分为以下几个步骤:
分词:将每个文本(在这种情况下是HTML元素的字符串表示)分割成单词或标记。
构建词汇表:从所有文本中提取出所有不同的单词,构建一个词汇表。
计数:对于每个文本,计算词汇表中每个单词的出现次数。
转换为向量:每个文本最终被转换为一个向量,向量的每个元素代表词汇表中对应单词的出现次数。

5.将两个html文本转为向量数值

 html_vec = vectorizer.transform(html_elements_str)
 target_vec = vectorizer.transform(target_elements_str)

6.比较相似度并且拿出相似度大于0.5的元素

similarities = cosine_similarity(target_vec, html_vec)
    similar_elements = []
    for index, similarity in enumerate(similarities[0]):
        if similarity >= threshold:
            similar_elements.append(html_elements[index])
    return similar_elements

7.顺利拿到h6 html中所有和h7相似的元素

结束

余弦相似度应用爬虫场景结束

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【粉丝福利社】一书读懂物联网:基础知识+运行机制+工程实现(文末送书-进行中)

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主&#xf…

小型内衣裤洗衣机哪个牌子好?市面上内衣洗衣机便宜好用的牌子推荐

这两年,内衣洗衣机这个小型的家电逐渐走进热门的视线里,很多小伙伴使用过它之后不仅轻松了很多,还可以很好的少数一些细菌。但这个时候也有人说内衣洗衣机就是智商税,根本没有作用,只能心理在作怪,而面对这…

【STM32】STM32学习笔记-USART串口数据包(28)

00. 目录 文章目录 00. 目录01. 串口简介02. HEX数据包03. 文本数据包04. HEX数据包接收05. 文本数据包接收06. 预留07. 附录 01. 串口简介 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持…

通过Windows事件查看器查询系统关机和重启日志

文章目录 前言一、事件查看器是什么?二、怎么使用事件查看器查看开机和关机日志三、Windows常用事件ID总结 前言 昨天服务器应用程序的接口突然都访问不了,远程进入了服务器发现程序没有问题,但服务器的桌面非常干净(一般总有未关…

Dynamics 365 自动编号Seed定时重置

很久前已有博文介绍过自动编号,不论是工具也好,自带UI设置(博文)也好。 一般的自动编号最后几位都是用的流水号,而编号的前部都是带年月日,或者年月又或者年,具体以实际的业务需求为准,例如ZD202401100001,…

算法通关村番外篇-LeetCode编程从0到1系列一

大家好我是苏麟 , 今天开始带来LeetCode编程从0到1系列 . 编程基础 0 到 1 , 50 题掌握基础编程能力 大纲 1768.交替合并字符串389. 找不同28. 找出字符串中第一个匹配项的下标283. 移动零66. 加一 1768.交替合并字符串 描述 : 给你两个字符串 word1 和 word2 。请你从 word1…

EasyExcel简单实例(未完待续)

EasyExcel简单实例 准备工作例1&#xff1a;简单读取 Student 表例2&#xff1a;简单读取 Student 表 准备工作 导入easyExcel依赖&#xff0c;注意版本&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactI…

2024.01.09.Apple_UI_BUG

我是软件行业的&#xff0c;虽然不是手机设计的&#xff0c;但是这个设计真的导致经常看信息不完整&#xff0c;要下拉的。 特别读取文本或者其他文件的时候&#xff0c;上面有个抬头就是看不到&#xff0c;烦&#xff0c;体验感很差

Vue项目nginx部署到线上,访问时加前缀解决方案

一、业务场景&#xff1a; 最近项目开发完了&#xff0c;需要部署一个测试版本和正式版本到线上&#xff0c;测试版本前面需要加一个dev前缀&#xff0c;遇到了一些坑&#xff0c;分享给大家 二、目前效果 三、具体实现步骤&#xff1a; &#xff08;1&#xff09;实现静态文…

SAP PP配置学习(五)

查找 四、 其它 设置 MM 过帐号码范围 定义凭证号码范围 OB52 打开期间 MMPV 开帐 &#xff08;下篇见&#xff09;

UE5 UE4 修复GPU驱动程序崩溃

原贴链接&#xff1a;https://mp.weixin.qq.com/s/e5l9XtfwEFWgwhHi1b2idg UE5 UE4在处理含有大量图形的项目时&#xff0c;你有可能会遇到GPU崩溃 可以通过修改注册表&#xff0c;修复崩溃。 GPU崩溃情况概述 UE5 UE4在处理含有大量图形的项目时&#xff0c;你有可能会遇到G…

3d云渲染平台哪个好?如何挑选好的云渲染平台?

3D渲染耗时耗力&#xff0c;很多CG从业者都会转向云渲染平台以提高效率和质量&#xff0c;降低成本。云渲染能让用户通过网络上传项目&#xff0c;借助平台提供的强大渲染集群完成渲染&#xff0c;而无需购买设备&#xff0c;所以选择一个好的云渲染平台非常重要。那么哪个云渲…

【复习】人工智能 第 8 章 人工神经网络及其应用

因为计算牵扯到导数&#xff0c;所以这章难的部分不会考太难。 人工神经网络是对人脑或生物神经网络若干基本特性的抽象和模拟。 深度学习是神经网络的发展。 人工智能曾经历过很长一段时间的停滞不前。 浩瀚的宇宙中&#xff0c;也许只有包含数千忆颗星球的银河系的复杂性能够…

HTML音乐播放器带歌词跟随效果源码附注释

音乐播放器效果截图 <!doctype html><!--声明html版本编写指令 H5--> <html><head><!--声明页面编码 uft-8 国际编码--><meta charset

Open CASCADE学习|非线性方程组

非线性方程组是一组包含非线性数学表达式的方程&#xff0c;即方程中含有未知数的非线性项。解这类方程组通常比解线性方程组更为复杂和困难。 非线性方程组在很多领域都有应用&#xff0c;例如物理学、工程学、经济学等。解决非线性方程组的方法有很多种&#xff0c;包括数值…

在Linux上搭建Maven仓库

目录 一、下载安装包二、安装maven三、修改配置文件settings.xml四、配置环境变量五、测试maven是否可用 一、下载安装包 我在这里为大家准备好了apache-maven-3.5.0-bin.tar.gz&#xff0c;百度网盘下载链接如下&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bGun…

已解决:UnicodeDecodeError: ‘gb2312‘ codec can‘t decode byte 0xe5 in position 1

起因 python 读文件报错。这个报错不是来自open而是read函数&#xff08;请看最后部分&#xff09;。 原因&#xff1a;文件编码不一致。 比如文件本身编码为 gb2312&#xff0c;而 python默认以 utf-8 编码打开&#xff0c;报错。 解决 初级&#xff1a;以通用的 utf-8 编码…

【Spring Boot】SpringBoot maven 项目创建图文教程

创建一个Spring Boot项目并使用Maven进行构建是一项相对简单的任务。以下是使用IntelliJ IDEA创建Spring Boot Maven项目的详细教程&#xff1a; 步骤 1&#xff1a;安装 IntelliJ IDEA 确保你已经安装了最新版本的 IntelliJ IDEA。你可以从官方网站下载并安装。 步骤 2&am…

Python教程(21)——面向对象编程的三大特性

面向对象三大特性 封装继承多态 在Python中&#xff0c;面向对象编程是一种核心的编程思想。Python被称为“一切皆对象”的语言&#xff0c;因为在Python中&#xff0c;几乎所有的数据都被视为对象。这包括数字、字符串、列表、函数等基本类型&#xff0c;还有自定义的类和对象…

安卓(雷电)模拟器清除屏幕密码

1、设置磁盘可写 启动模拟器&#xff0c;然后在模拟器的设置界面&#xff0c;设置磁盘共享为可写入&#xff0c;重启模拟器&#xff0c;如下图&#xff1a; 2、找到模拟器目录 返回桌面&#xff0c;右键模拟器图标&#xff0c;打开文件所在目录&#xff0c;如下图&#xff1a…