GTE-Pro语义搜索入门:零基础实现Python爬虫数据索引

张开发
2026/6/19 20:22:33 15 分钟阅读
GTE-Pro语义搜索入门:零基础实现Python爬虫数据索引
GTE-Pro语义搜索入门零基础实现Python爬虫数据索引1. 引言你是不是经常遇到这样的情况公司内部有大量文档资料但想找某个特定信息时却像大海捞针一样困难传统的搜索只能匹配关键词稍微换个说法就找不到了。今天我要带你用GTE-Pro语义搜索引擎解决这个问题。它能真正理解你问的是什么而不是死板地匹配字面意思。想象一下你问怎么处理客户投诉它不仅能找到包含客户投诉处理流程的文档还能找到用户反馈解决方案、客诉应对指南等语义相关的内容。最好的部分是我们将从零开始构建整个系统用Python爬虫采集网页数据用GTE-Pro构建语义索引最后实现智能搜索。不需要任何AI背景跟着我做就行。2. 环境准备与快速部署2.1 安装必要的Python库首先确保你安装了Python 3.8或更高版本。然后打开终端运行以下命令安装需要的库pip install requests beautifulsoup4 sentence-transformers pandas numpy这些库各自的作用是requests用来抓取网页内容beautifulsoup4解析HTML文档提取我们需要的内容sentence-transformers使用GTE-Pro模型进行语义编码pandas处理和组织我们采集的数据2.2 准备GTE-Pro模型GTE-Pro是一个强大的语义编码模型它能将文本转换成1024维的向量表示。这些向量能够捕捉文本的语义信息让相似的内容在向量空间中距离更近。我们不需要自己训练模型直接使用预训练好的版本from sentence_transformers import SentenceTransformer # 加载GTE-Pro模型 model SentenceTransformer(thenlper/gte-large)第一次运行时会自动下载模型文件大约需要2-3GB的存储空间。下载完成后就可以直接使用了。3. 网页数据采集实战3.1 编写基础爬虫让我们从一个简单的爬虫开始采集CSDN技术文章的标题和内容import requests from bs4 import BeautifulSoup import time def crawl_csdn_articles(url): 爬取CSDN文章内容 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } try: response requests.get(url, headersheaders) response.raise_for_status() soup BeautifulSoup(response.text, html.parser) # 提取文章标题 title soup.find(h1, {class: title-article}) title title.text.strip() if title else 无标题 # 提取文章内容 content_div soup.find(div, {id: article_content}) if content_div: # 移除不必要的标签 for script in content_div.find_all(script): script.decompose() for style in content_div.find_all(style): style.decompose() content content_div.get_text(separator\n, stripTrue) else: content 无内容 return {title: title, content: content, url: url} except Exception as e: print(f爬取 {url} 时出错: {str(e)}) return None # 测试爬虫 test_url https://blog.csdn.net/example/article/123456 article_data crawl_csdn_articles(test_url) if article_data: print(f标题: {article_data[title]}) print(f内容前100字符: {article_data[content][:100]}...)3.2 批量采集与数据清洗单篇文章不够用我们需要批量采集多篇文章import pandas as pd from tqdm import tqdm def batch_crawl_articles(url_list, delay1): 批量爬取文章列表 articles [] for url in tqdm(url_list, desc爬取进度): article crawl_csdn_articles(url) if article: articles.append(article) time.sleep(delay) # 礼貌延迟避免被封IP return pd.DataFrame(articles) # 示例URL列表实际使用时替换为真实的文章URL sample_urls [ https://blog.csdn.net/example/article/1, https://blog.csdn.net/example/article/2, # 添加更多URL... ] # 执行批量爬取 df_articles batch_crawl_articles(sample_urls[:5]) # 先测试5篇 print(f成功爬取 {len(df_articles)} 篇文章) df_articles.head()4. 构建语义搜索引擎4.1 文本向量化现在到了最核心的部分——用GTE-Pro将文本转换成向量def create_embeddings(texts, batch_size32): 生成文本嵌入向量 # 如果输入是单段文本转换为列表 if isinstance(texts, str): texts [texts] # 生成嵌入向量 embeddings model.encode(texts, batch_sizebatch_size, show_progress_barTrue) return embeddings # 为所有文章生成嵌入向量 print(正在生成文本嵌入向量...) texts df_articles[content].tolist() embeddings create_embeddings(texts) print(f生成完成向量维度: {embeddings.shape})4.2 构建向量索引有了向量之后我们需要建立索引以便快速搜索import numpy as np from sklearn.metrics.pairwise import cosine_similarity class SemanticSearchEngine: 简单的语义搜索引擎 def __init__(self): self.documents [] self.embeddings None self.is_fitted False def add_documents(self, documents, embeddings): 添加文档到搜索引擎 self.documents.extend(documents) if self.embeddings is None: self.embeddings embeddings else: self.embeddings np.vstack([self.embeddings, embeddings]) self.is_fitted True def search(self, query, top_k5): 语义搜索 if not self.is_fitted: raise ValueError(请先添加文档) # 将查询文本转换为向量 query_embedding create_embeddings(query) # 计算余弦相似度 similarities cosine_similarity(query_embedding, self.embeddings)[0] # 获取最相似的文档索引 most_similar_indices np.argsort(similarities)[::-1][:top_k] # 返回搜索结果 results [] for idx in most_similar_indices: results.append({ document: self.documents[idx], similarity: similarities[idx], index: idx }) return results # 初始化搜索引擎 search_engine SemanticSearchEngine() search_engine.add_documents(df_articles[content].tolist(), embeddings) print(语义搜索引擎初始化完成)5. 实战搜索演示现在让我们试试看搜索引擎的效果def demo_search(query): 演示搜索功能 print(f搜索查询: {query}) print(- * 50) results search_engine.search(query, top_k3) for i, result in enumerate(results, 1): print(f结果 {i} (相似度: {result[similarity]:.4f}):) print(f内容片段: {result[document][:200]}...) print() return results # 测试几个搜索查询 test_queries [ Python爬虫教程, 机器学习基础, 数据库优化技巧 ] for query in test_queries: demo_search(query) print( * 80)6. 优化与改进建议6.1 处理大规模数据当数据量很大时我们需要更高效的索引方法# 对于大规模数据可以考虑使用专业的向量数据库 # 如 FAISS、Chroma、Weaviate 等 import faiss import numpy as np class FaissSearchEngine: 使用FAISS的语义搜索引擎 def __init__(self, dimension1024): self.dimension dimension self.index faiss.IndexFlatIP(dimension) # 内积相似度 self.documents [] def add_documents(self, documents, embeddings): 添加文档 self.documents.extend(documents) self.index.add(embeddings.astype(float32)) def search(self, query, top_k5): 搜索 query_embedding create_embeddings(query).astype(float32) distances, indices self.index.search(query_embedding, top_k) results [] for i, idx in enumerate(indices[0]): results.append({ document: self.documents[idx], similarity: distances[0][i], index: idx }) return results6.2 添加元数据过滤在实际应用中我们可能还需要根据其他条件过滤结果def enhanced_search(query, min_similarity0.5, max_results10): 增强版搜索支持相似度阈值和元数据过滤 results search_engine.search(query, top_k20) # 先获取更多结果 # 应用相似度阈值 filtered_results [r for r in results if r[similarity] min_similarity] # 限制返回数量 return filtered_results[:max_results]7. 总结通过这个教程我们完整实现了从数据采集到语义搜索的全流程。整个过程其实没有想象中那么复杂关键是掌握几个核心概念GTE-Pro的强大之处在于它能真正理解文本的语义而不只是关键词匹配。这意味着即使搜索词和文档中的表述方式不同只要意思相近就能找到相关的内容。在实际使用中你可能会遇到一些挑战比如爬虫被封IP、数据清洗复杂、搜索速度优化等。这些问题都有相应的解决方案比如使用代理IP、设计更精细的数据清洗规则、使用专业向量数据库等。最让我惊喜的是这样一个强大的语义搜索系统用不到200行代码就实现了。现在你可以在此基础上继续扩展比如添加用户界面、支持更多文件格式、集成到现有系统中等。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章