字符串的向量处理技巧:KD树和TF-IDF向量

使用下面的技术,可以构建不用DL的搜索引擎。

向量搜索引擎使用KD-Tree

KD-Tree 搭建以字符串向量为索引的树,以 O ( l o g n ) O(logn) O(logn) 的时间复杂度快速查找到最近的向量

代码来源:https://github.com/zhaozh10/ChatCAD/blob/main/search_engine/src/db.py

代码如下:

import os
import pickledef save_db_kdtree(path_list,token_names,data,**kwargs):from scipy.spatial import KDTreeif "db_path" in kwargs:db_path=kwargs["db_path"]else:db_path=f"search_engine/db/{kwargs['name']}"if not os.path.splitext(db_path)[1]:db_path+='.pt'# Create a KDTree objectdata=data.toarray()for v in data:if sum(v)!=0: v/=sum(v)tree = KDTree(data,copy_data=True)# Find the 5 nearest neighbors of the first point# distances, indices = tree.query(data[0], k=5)# print(path_list)db={"path_list":path_list,"token_names":token_names,"tree":tree}with open(db_path,'wb') as f:pickle.dump(db,f)def load_db_kdtree(**kwargs):from scipy.spatial import KDTreeif "db_path" in kwargs:db_path=kwargs["db_path"]else:db_path=f"search_engine/db/{kwargs['name']}"if not os.path.splitext(db_path)[1]:db_path+='.pt'# Create a KDTree objectwith open(db_path,'rb') as f:db = pickle.load(f)path_list,token_names,tree=db["path_list"],db["token_names"],db["tree"]# print(path_list)return Query_kdtree(path_list,token_names,tree)# Find the 5 nearest neighbors of the first point# distances, indices = tree.query(data[0], k=5)# db={"path_list":path_list,"token_names":token_names,"tree":tree}class Query_kdtree:def __init__(self,path_list,token_names,tree) -> None:self.path_list,self.token_names,self.tree=path_list,token_names,treedef query(self,feature_vector,k=5):if sum(feature_vector)!=0: feature_vector/=sum(feature_vector)distances, indices=self.tree.query(feature_vector,k,workers=-1)# print(len(self.path_list))return [(self.path_list[pid],distances[i]) for i,pid in enumerate(indices)]save_db=save_db_kdtree
load_db=load_db_kdtree#test pass
if __name__=="__main__":import scipy.sparse as sp# sparse_matrix = sp.lil_matrix((3, 3))save_db_kdtree([114,203],['a','b'],sp.csr_matrix([[.5,.5],[-.5,.5]]),name="try_1")q=load_db_kdtree(name="try_1")print(q.query([1,1],k=2)) # [(114, 0.7071067811865476), (203, 1.5811388300841898)]

使用TD-IDF向量作为一个文档的feature

当你有一个 (vocabs, document, library) 时,你可以用TD-IDF向量作为document的向量。

当然也可以是 (vocabs, sentence, documents).

一个sentence的TD-IDF向量就是这个句子的所有token的TD-IDF值而已。

代码如下:

# -*- coding: utf-8 -*-
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
import numpy as np# 示例文本数据(中文)
corpus = ["机器学习是人工智能的一个分支","深度学习是机器学习的子领域","自然语言处理是人工智能的重要方向"
]# 自定义中文分词函数
def chinese_tokenizer(text):# 使用 jieba 进行中文分词return list(jieba.cut(text))# 加载自定义词典(可选)
# jieba.load_userdict("custom_dict.txt")  # 如果有自定义词典,取消注释# 初始化 TfidfVectorizer
vectorizer = TfidfVectorizer(tokenizer=chinese_tokenizer,  # 使用自定义分词器stop_words=None,              # 可选:设置停用词(中文需自定义)max_features=1000             # 限制词汇表大小
)# 计算 TF-IDF 矩阵
tfidf_matrix = vectorizer.fit_transform(corpus)# 获取词汇表
vocabulary = vectorizer.get_feature_names_out()# 打印词汇表
print("词汇表(token_names):")
print(vocabulary)
print("\n")# 打印 TF-IDF 矩阵的形状
print("TF-IDF 矩阵形状 (文档数, 词汇表大小):", tfidf_matrix.shape)
print("\n")# 将稀疏矩阵转换为密集数组(便于查看具体值)
dense_matrix = tfidf_matrix.toarray()# 打印每个文档的 TF-IDF 向量
for i, doc in enumerate(corpus):print(f"文档 {i+1}:")print(doc)print("TF-IDF 向量:")print(dense_matrix[i])print("-" * 50)print("\n")# 示例:用 TF-IDF 向量训练分类模型
# 假设标签:0 表示机器学习,1 表示自然语言处理
labels = [0, 0, 1]# 训练逻辑回归分类器
clf = LogisticRegression()
clf.fit(tfidf_matrix, labels)# 测试新文本
new_text = ["人工智能的未来"]
new_tfidf = vectorizer.transform(new_text)
predicted_label = clf.predict(new_tfidf)[0]print("新文本预测标签:", predicted_label)

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

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

相关文章

Modbus TCP 转Canopen网关连接台达伺服驱动器的配置案例

本案例是使用欧姆龙PLC通过开疆智能ModbusTCP转Canopen网关连接台达A2伺服驱动器的配置案例。 配置过程: 首先打开PLC组态软件“Sysmac Studio”,新建项目并进行配置。 编写ModbusTCP的通讯程序。 设置连接的IP地址,端口号等参数。 设置Modb…

Vim Z 开头的视图滚动/折叠命令完整学习笔记

Vim Z 开头的视图滚动/折叠命令完整学习笔记 文章目录 Vim Z 开头的视图滚动/折叠命令完整学习笔记1. 核心概念2. 垂直滚动对齐命令2.1 基础对齐2.2 重画增强版 3. 横向滚动命令3.1 字符级滚动3.2 半屏滚动 4. 代码折叠命令4.1 基础折叠操作4.2 高级折叠操作4.3 全局折叠控制4.…

【Keepalived】Keepalived-2.3.4 已恢复对 CentOS 7 支持

之前在CentOS 7.9系统中对 Keepalived 2.3.2、2.3.3 版本进行编译和安装测试,都出现了编译报错,且官方文档中也给出了不再支持RHEL 7的申明,但是6月10日,Keeplived-2.3.4版本在CentOS 7.9系统中编译、安装成功。 对于此问题&#…

Java NIO 面试全解析:9大核心考点与深度剖析

文章目录 🚀 Java NIO 面试全解析:9大核心考点与深度剖析📌 一、基础概念:BIO/NIO/AIO 终极对比📌 二、Buffer核心机制:状态机设计精髓Buffer状态机原理 📌 三、零拷贝原理:高性能IO…

C++提高编—(模板,泛型,异常处理)

一 模板 1.1 模板概论 以下图为例子,提供了三个西装的证件照,谁都可以取拍照,可以是小孩,男女人,也可以是某些动物等等等。n那么我们这个模板也是这样,它可以是任何类型,基础类型,c…

Python图像处理基础(六)

Python图像处理基础(六) 文章目录 Python图像处理基础(六)3.4 双层图像3.5 具有更多色阶的位图数据3.6 基于调色板的图像3.6.1 超过 256 种颜色的图像3.7 处理透明度3.7.1 Alpha 通道3.7.2 透明调色板条目3.7.3 透明颜色3.8 隔行扫描和交替像素排序3.4 双层图像 某些类型的…

卷积神经网络(一)

第七章 卷积神经网络 从今天开始学习卷积神经网络的内容。 本章的主题是卷积神经网络(Convolutional Neural Network,CNN)。 CNN被用于图像识别、语音识别等各种场合,在图像识别的比赛中,基于 深度学习的方法几乎都以…

OpenCV 多边形绘制与填充

一、知识点 1、void polylines(InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar & color, int thickness 1, int lineType LINE_8, int shift 0 ); (1)、在图像上绘制多边形曲线。 (2)、参数说明: img: 输入、输出参数&#xff0…

C#接口代码记录

using System;namespace InterfacesExample {// 定义接口public interface INBAPlayable{void KouLan();}public interface ISupermanable{void Fly();}// 基类public class Person{public void CHLSS(){Console.WriteLine("人类吃喝拉撒睡");}}// Student 类实现多个…

SpringDataJpa实体类中属性顺序与数据库中生成字段顺序不一致的问题

自己写的代码覆盖hibernate中的代码 翻了翻源码发现,很多地方都是使用LinkedHashMap或者是List来传输Entity里面的fields,于是感觉Hibernate应该是考虑到使用Entity里面定义的fields的顺序来实现建表语句里的表字段顺序的。   于是就一步步跟踪下去&…

软件架构期末复习

题型 填空题 20分,2分/空,10空 选择题 30分,2分/题,15题 简答题 30分,6分/题,5题(概念+分析) 案例分析题 20分,5个小题(综合) 分值:体系结构、设计模式各占50% 考试内容 体系结构 SA基础(SA03PPT):SA概念、SA与软件过程(阶段)的关系、SA核心概念模型(重要…

Oracle ADG 日常巡检指南

一、基础状态检查 数据库角色与模式 SELECT db_unique_name, open_mode, database_role, switchover_status FROM v$database;预期状态: 主库:OPEN_MODEREAD WRITE, DATABASE_ROLEPRIMARY备库:OPEN_MODEREAD ONLY WITH APPLY, DATABASE_ROLE…

【MV】key_moments 与 continuous_timeline的编排权衡

一、编排顺序: key_moments → continuous_timeline* 建议使用顺序:key_moments → continuous_timeline 📊 两者关系 key_moments:从continuous_timeline中精选出来的重点(约11个关键时间点)continuous_timeline:完整的时间轴(37个片段,覆盖每句歌词)🎭 实际编…

Tomcat线程模型

目录 1 Linux I/O模型 2 Linux I/O模型分类 3 Tomcat支持的I/O模型 4 Tomcat I/O模型选型 5 Tomcat NIO实现 6 Tomcat异步IO实现 1 Linux I/O模型 I/O:在计算机内存和外部设备之间拷贝数据的过程程序通过cpu向外部设备发出读指令,数据从外部设置拷贝至内…

最新Spring Security实战教程企业级安全方案设计实现

最新Spring Security实战教程(十七)企业级安全方案设计 - 多因素认证(MFA)实现 1. 前言2. 为什么需要多因素认证? 传统认证的风险MFA的核心优势常见多因素认证实现方案 3. 多因素认证的核心原理4. 系统架构与流程设计…

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…

大话软工笔记—架构的概要设计

架构的概要设计是在需求工程分析成果的基础之上对整个系统进行的顶层规划,重点是确定设计规范(理念、主线等),从大的范围和高度对业务进行规划和设计,架构概要设计的成果“业务架构图”,是后续各阶段设计的…

Flink CDC —部署模式

一、Standalone 模式 独立模式是Flink最简单的部署模式。本简短指南将向您展示如何下载最新稳定版本的Flink,安装和运行它。 您还将运行一个示例Flink CDC作业,并在web UI中查看它。 1、准备 Flink在所有类似UNIX的环境中运行,即Linux、Mac…

day029-Shell自动化编程-计算与while循环

文章目录 1. read 交互式初始化变量1.1 案例-安装不同的软件1.2 案例-比较大小 2. 计算2.1 bc2.2 awk2.3 expr2.4 let2.5 案例-计算内存的空闲率2.6 案例-检查域名过期时间和https证书过期时间 3. 循环3.1 循环控制语句3.2 for循环-c语言格式3.3 while循环3.3.1 案例-猜数字3.3…

华为云Flexus+DeepSeek征文 | 基于华为云ModelArts Studio打造AingDesk AI聊天助手

华为云FlexusDeepSeek征文 | 基于华为云ModelArts Studio打造AingDesk AI聊天助手 引言一、ModelArts Studio平台介绍华为云ModelArts Studio简介ModelArts Studio主要特点 二、安装AingDesk应用AingDesk应用介绍下载地址安装AingDesk工具 三、开通DeepSeek-R1-0528商用服务访问…