相似性搜索(2)

news2025/2/25 10:24:52

在本篇中,我们通过播客相似性搜索为例,进一步研究基于chroma 的相似性搜索:

参考:

https://www.kaggle.com/code/switkowski/building-a-podcast-recommendation-engine/notebook

数据集来源:

https://www.kaggle.com/code/switkowski/building-a-podcast-recommendation-engine/input

数据的预处理 

import pandas as pd 
#print(os.listdir("./input"))
from IPython.core.interactiveshell import InteractiveShell
def preprocessor(file):
    InteractiveShell.ast_node_interactivity = "all"
    podcasts = pd.read_csv('./input/podcasts.csv')
    podcasts = podcasts[podcasts.language == 'English']#选择英语的项目
    podcasts = podcasts.dropna(subset=['description'])#删除缺失 description 的项目
    podcasts = podcasts.drop_duplicates('itunes_id')#删除重复的itunes_id
    sum(podcasts.description.isnull())
    podcasts['description_length'] = [len(x.description.split()) for _, x in podcasts.iterrows()]
    #podcasts['description_length'].describe()#显示description_length的统计摘要
    podcasts = podcasts[podcasts.description_length >= 20]#选择长度>20的项目
    podcasts = podcasts[0:10].reset_index(drop=True)#选择前10个项目,并且重新index 编号,不连续的index 变成连续 
    return podcasts
new_list=preprocessor('./input/podcasts.csv')
for index,row in new_list.iterrows():
    print("index:",index)
    print (row["description"])

搜索

#https://www.kaggle.com/code/switkowski/building-a-podcast-recommendation-engine?select=episodes.csv
#https://www.aicrowd.com/challenges/spotify-million-playlist-dataset-challenge#task
import pandas as pd 
import os

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel
print(os.listdir("./input"))

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
podcasts = pd.read_csv('./input/podcasts.csv')
podcasts = podcasts[podcasts.language == 'English']
podcasts = podcasts.dropna(subset=['description'])
podcasts = podcasts.drop_duplicates('itunes_id')
sum(podcasts.description.isnull())
podcasts['description_length'] = [len(x.description.split()) for _, x in podcasts.iterrows()]
podcasts['description_length'].describe()
podcasts = podcasts[podcasts.description_length >= 20]
favorite_podcasts = ['The MFCEO Project', 'Up and Vanished', 'Lore']
favorites = podcasts[podcasts.title.isin(favorite_podcasts)]
favorites
podcasts = podcasts[~podcasts.isin(favorites)].sample(15000)
data = pd.concat([podcasts, favorites], sort = True).reset_index(drop = True)
tf = TfidfVectorizer(analyzer = 'word', ngram_range = (1, 3), min_df = 0, stop_words = "english")
tf_idf = tf.fit_transform(data['description'])
tf_idf
similarity = linear_kernel(tf_idf, tf_idf)
similarity
x = data[data.title == 'Up and Vanished'].index[0]
similar_idx = similarity[x].argsort(axis = 0)[-4:-1]
for i in similar_idx:
    print(similarity[x][i], '-', data.title[i], '-', data.description[i], '\n')
print('Original - ' + data.description[x])
x = data[data.title == 'Lore'].index[0]
similar_idx = similarity[x].argsort(axis = 0)[-4:-1]
for i in similar_idx:
    print(similarity[x][i], '-', data.title[i], '-', data.description[i], '\n')
print('Original - ' + data.description[x])

使用TfidfVectorizer将选出来的播客的描述矢量化。

使用linear_kernel 找出两两之间播客描述的相似性。

找出与“Up and Vanished” ,“Lore”相似的播客

        倒数第4个到倒数第1个。

        similar_idx = similarity[x].argsort(axis = 0)[-4:-1]

 将结果打印出来

for i in similar_idx:
    print(similarity[x][i], '-', data.title[i], '-', data.description[i], '\n')

将 “Up and Vanished” ,“Lore”的标题和描述打印出来。

DeepSeek 的解释笔记

TfidfVectorizer

TfidfVectorizer 是 自然语言处理(NLP) 中常用的工具,用于将文本数据转换为数值特征向量。它是 scikit-learn 库中的一个类,结合了 TF(词频,Term Frequency) 和 IDF(逆文档频率,Inverse Document Frequency) 两种统计方法,能够有效地表示文本数据并捕捉其重要特征。

TfidfVectorizer 的主要参数

以下是 TfidfVectorizer 的一些常用参数:

  • input: 输入类型,可以是文件名、文件对象或文本内容(默认是 content)。

  • encoding: 文本编码方式(默认是 utf-8)。

  • lowercase: 是否将文本转换为小写(默认是 True)。

  • stop_words: 是否移除停用词(如“的”、“是”等),可以设置为 'english' 或自定义列表。

  • max_df: 忽略在超过一定比例的文档中出现的单词(用于去除常见词)。

  • min_df: 忽略在少于一定数量的文档中出现的单词(用于去除罕见词)。

  • ngram_range: 指定 n-gram 的范围,例如 (1, 1) 表示只使用单词,(1, 2) 表示使用单词和二元词组。

  • max_features: 限制特征向量的最大维度(即最多保留多少个单词)。

使用示例

以下是一个简单的示例,展示如何使用 TfidfVectorizer 将文本数据转换为 TF-IDF 特征矩阵:

from sklearn.feature_extraction.text import TfidfVectorizer

# 示例文本数据
documents = [
    "我喜欢机器学习",
    "机器学习很有趣",
    "自然语言处理是机器学习的一个分支"
]

# 初始化 TfidfVectorizer
vectorizer = TfidfVectorizer()

# 拟合并转换文本数据
tfidf_matrix = vectorizer.fit_transform(documents)

# 查看结果
print("TF-IDF 特征矩阵:")
print(tfidf_matrix.toarray())  # 转换为稠密矩阵并打印

print("\n词汇表:")
print(vectorizer.get_feature_names_out())  # 打印词汇表

输出结果

TF-IDF 特征矩阵:
[[0.         0.         0.70710678 0.70710678 0.         0.        ]
 [0.57735027 0.57735027 0.         0.         0.57735027 0.        ]
 [0.         0.         0.         0.         0.40824829 0.81649658]]

词汇表:
['一个' '分支' '喜欢' '很有趣' '是' '机器学习']

 

  • TF-IDF 特征矩阵:每一行对应一个文档,每一列对应一个单词,值是该单词的 TF-IDF 权重。

  • 词汇表:列出了所有被提取的单词。


应用场景

  1. 文本分类
    将文本转换为 TF-IDF 特征后,可以用于训练分类模型(如朴素贝叶斯、支持向量机等)。

  2. 信息检索
    计算查询词与文档的 TF-IDF 相似性,用于搜索引擎排名。

  3. 文本聚类
    使用 TF-IDF 特征对文本进行聚类分析。

  4. 推荐系统
    计算用户评论或商品描述的 TF-IDF 特征,用于推荐相似商品。


优点

  1. 简单高效:能够快速将文本数据转换为数值特征。

  2. 捕捉关键词:通过 TF-IDF 权重,能够突出文档中的重要单词。

  3. 降噪:通过移除停用词和低频词,减少噪声。


局限性

  1. 无法捕捉语义:TF-IDF 只考虑词频和文档频率,无法理解单词的语义。

  2. 稀疏性问题:对于大规模语料库,TF-IDF 矩阵可能会非常稀疏,导致计算效率下降。

  3. 依赖预处理:需要配合分词、去停用词等预处理步骤才能发挥最佳效果。


总结

TfidfVectorizer 是一个强大的工具,能够将文本数据转换为数值特征,适用于文本分类、聚类、信息检索等任务。它是 NLP 中常用的特征提取方法之一,尤其适合处理中小规模的文本数据。如果需要捕捉语义信息,可以结合词嵌入(如 Word2Vec、BERT)等方法使用。

开启新对话

linear_kernel 

linear_kernel 的主要用途是计算两个向量或矩阵之间的线性核(Linear Kernel),也就是它们的点积(dot product)。它在机器学习和数据科学中常用于衡量样本之间的相似性,尤其是在使用核方法(Kernel Methods)或支持向量机(SVM)时。 

假设我们有以下两个矩阵 XX 和 YY,分别表示两组样本的特征向量:

python
复制
import numpy as np
from sklearn.metrics.pairwise import linear_kernel

# 样本特征矩阵
X = np.array([[1, 2, 3], [4, 5, 6]])  # 2个样本,每个样本有3个特征
Y = np.array([[7, 8, 9], [10, 11, 12]])  # 2个样本,每个样本有3个特征

# 计算线性核
kernel_matrix = linear_kernel(X, Y)
print(kernel_matrix)

输出结果:

[[ 50  68]
 [122 167]]

这里的输出是一个相似性矩阵,其中每个元素 (i,j)(i,j) 表示 XX 中第 ii 个样本与 YY 中第 jj 个样本的点积(即线性核值)。


优点

  1. 简单高效
    线性核的计算非常简单,只需要计算点积,因此计算速度快。

  2. 适合线性可分数据
    如果数据本身是线性可分的,线性核可以直接用于分类或回归任务。

  3. 可解释性强
    线性核的结果易于解释,因为它直接反映了样本在特征空间中的方向相似性。


局限性

  1. 不适合非线性数据
    如果数据是非线性可分的,线性核可能无法捕捉复杂的模式。此时可以使用其他核函数,如 RBF 核(高斯核)或多项式核。

  2. 表达能力有限
    线性核只能捕捉线性关系,无法处理更复杂的特征交互。


总结

   linear_kernel 是一个简单但非常有用的工具,主要用于计算样本之间的线性相似性。它在支持向量机、文本分类、推荐系统等任务中都有广泛应用。如果你的数据是线性可分的,或者你需要一个高效的相似性度量方法,linear_kernel 是一个很好的选择。

结论

    DeepSeek 对于程序猿学习帮助非常大,从本文开始,我会在博文中添加一些DeepSeek 提示的笔记。

在下面,我们会进一步地讨论急于大模型Embedding 的相似性搜索的编程

 

 

 

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

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

相关文章

Minio分布式多节点多驱动器集群部署

Minio分布式多节点多驱动器集群部署 Minio分布式多节点多驱动器集群部署节点规划先决条件开放防火墙端口设置主机名更新域名映射文件时间同步存储要求内存要求 增加虚拟机磁盘(所有机器都要执行)部署分布式 MinIO测试上传与预览测试高可用MinIO 配置限制模拟单节点磁盘故障模拟…

【信号量】

信号量 目录操作系统信号信号的默认处理动作示例解释信号的捕获与处理使用 signal 函数使用 sigaction 函数 信号的阻塞 信号的生命周期1. 信号产生2. 信号在进程中注册3. 信号在进程中注销4. 信号处理main 7 signal命令含义使用场景手册页包含的关键信息1. 信号概述2. 信号列表…

一篇文章学懂Vuex

一、基于VueCli自定义创建项目 233 344 二、Vuex 初始准备 建项目的时候把vuex勾选上就不用再yarn add vuex3了 store/index.js // 这里面存放的就是vuex相关的核心代码 import Vuex from vuex import Vue from vue// 插件安装 Vue.use(Vuex)// 创建仓库(空仓库…

DeepSeek 助力 Vue 开发:打造丝滑的二维码生成(QR Code)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

图像处理篇---图像处理中常见参数

文章目录 前言一、分贝(dB)的原理1.公式 二、峰值信噪比(PSNR, Peak Signal-to-Noise Ratio)1.用途2.公式3.示例 三、信噪比(SNR, Signal-to-Noise Ratio)1.用途2.公式3.示例 四、动态范围(Dyna…

【Java】—— 二叉树

一、树型结构 树形结构是一种重要的数据结构,它类似于现实生活中的树的结构,由结点和边构成。树形结构具有以下特点: 树形结构是一种层次化的结构,由根结点、内部结点和叶子结点组成。根结点是树的顶部结点,没有父结点…

机场导航系统有哪些功能?精准定位与高效路径规划技术深度剖析

本文专为关注机场服务优化、乘客体验提升的IT技术员及航空业同仁而写。将深入探讨机场室内导航系统的核心功能,旨在解决乘客在机场内部定位、路径规划、服务寻找等方面的痛点。如需获取机场导航系统解决方案可前往文章最下方获取,如有项目合作及技术交流…

医疗AI领域中GPU集群训练的关键技术与实践经验探究(上)

医疗AI领域中GPU集群训练的关键技术与实践经验探究(上) 一、引言 1.1 研究背景与意义 在科技飞速发展的当下,医疗 AI 作为人工智能技术与医疗领域深度融合的产物,正引领着医疗行业的深刻变革。近年来,医疗 AI 在疾病诊断、药物研发、健康管理等诸多方面取得了显著进展,…

STM32-智能小车项目

项目框图 ST-link接线 实物图: 正面: 反面: 相关内容 使用L9110S电机模块 电机驱动模块L9110S详解 | 良许嵌入式 一、让小车动起来 新建文件夹智能小车项目 在里面复制19-串口打印功能 重命名为01-让小车动起来 新建文件夹motor&…

星环科技推出DeepSeek全场景解决方案:即开即用、企业级部署、端侧智能三位一体

星环科技(688031.SH)正式发布DeepSeek全场景解决方案,全面覆盖个人用户、企业客户及行业场景需求,为用户提供从个人到企业、从云端到本地的全方位AI应用支持,为不同需求的用户提供了灵活、高效且安全的AI解决方案。 省…

《全星质量管理 QMS 软件系统》:赋能企业高效质量管理

《全星质量管理 QMS 软件系统》:赋能企业高效质量管理 在当今竞争激烈的商业环境中,《全星质量管理 QMS 软件系统》脱颖而出,展现出了显著且无可比拟的应用优势。 首先,《全星质量管理 QMS 软件系统》犹如一张严密的质量管控大网…

【多模态处理篇三】【DeepSeek语音合成:TTS音色克隆技术揭秘】

最近帮某明星工作室做AI语音助手时遇到魔幻需求——要求用5秒的咳嗽声克隆出完整音色!传统TTS系统直接翻车,生成的语音像得了重感冒的电音怪物。直到祭出DeepSeek的TTS音色克隆黑科技,才让AI语音从"机器朗读"进化到"声临其境"。今天我们就来扒开这个声音…

C++Qt学习笔记——实现一个串口通信界面

CQt学习笔记——实现一个串口通信界面 一.界面二、项目结构三、头文件1. 文件头部2. 类定义3. 构造函数和析构函数4. 成员函数5. 成员变量 四、代码解析ReceiveAeraInit 函数解析SerialHelper 构造函数解析1. 为什么有两个 SerialHelper?2. 为什么用 :: 和 :&#x…

Word(2010)排版技巧

设置标题样式 选择需要设置的标题 如下图所示。选择文字后,点击对应的样式即可设置。 设置标题格式 设置字体格式 设置段落格式 显示所有样式 标题样式展示 建议 建议新建一个正文样式,可以命名为正文1,因为所有的样式参考的“样式基准…

一.Vue中的条件渲染

1.在<head>中引用 <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> 2.在<body>中写入 <div id"app"><p><a v-if "user.usernameadmin"href"#">编辑</a><a …

IO进程 day05

IO进程 day05 9. 进程9. 9. 守护进程守护进程的特点守护进程创建步骤 10. 线程10.1. 线程的概念10.2. 进程和线程的区别10.2. 线程资源10.3. 线程的函数接口1. pthread_create-创建线程线程函数和普通函数的区别 2. pthread_exit3.线程资源回收函数join和detach的区别 获取线程…

【HeadFirst系列之HeadFirstJava】第6天之认识Java的API:解锁高效开发的钥匙

认识Java的API&#xff1a;解锁高效开发的钥匙 在《Head First Java》的第六章节中&#xff0c;作者深入探讨了Java的API&#xff08;Application Programming Interface&#xff09;&#xff0c;并强调了它在Java开发中的重要性。Java API 是Java开发工具包&#xff08;JDK&a…

4 - AXI GPIO按键控制LED实验

文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验任务是通过调用PL端AXI GPIO IP核&#xff0c;使用中断机制&#xff0c;实现PL端按键控制 PS端LED的功能。 2 系统框图 3 软件设计 注意事项&#xff1a; AXI GPIO IP核是双沿触发中断&#xff0c;不可设置&…

题海拾贝:扫雷

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…