要在 Python 中实现语义搜索,您需要专注于理解文本的含义,而不仅仅是匹配关键词。这通常涉及三个核心步骤:将文本转换为数值表示(嵌入向量),高效地存储这些嵌入向量,并比较它们以找到语义上相似的内容。现代库(如 sentence-transformers
)和向量数据库(例如,FAISS)简化了这个过程。以下是使用免费工具的实用方法。
首先,使用预训练的语言模型来生成嵌入向量。例如,sentence-transformers
库提供了诸如 all-MiniLM-L6-v2
之类的模型,这些模型将句子转换为 384 维向量。使用 pip install sentence-transformers
安装该库,然后加载模型并编码您的文档
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
documents = ["A dog chasing a ball", "Cats sleeping in the sun", ...]
document_embeddings = model.encode(documents)
接下来,存储嵌入向量以实现高效搜索。对于小型数据集,使用 scikit-learn
计算查询嵌入向量和所有文档嵌入向量之间的余弦相似度
from sklearn.metrics.pairwise import cosine_similarity
query = "Playful pets running around"
query_embedding = model.encode([query])
similarities = cosine_similarity(query_embedding, document_embeddings)[0]
top_match_index = similarities.argmax()
对于大型数据集,使用 FAISS(Facebook AI Similarity Search)来加速检索。使用 pip install faiss-cpu
安装它,然后构建索引
import faiss
index = faiss.IndexFlatIP(384) # Inner product (cosine similarity)
faiss.normalize_L2(document_embeddings) # Normalize for cosine
index.add(document_embeddings)
distances, indices = index.search(query_embedding, k=3) # Top 3 matches
最后,考虑实际调整。根据您的使用情况选择平衡速度和准确性的模型——较大的模型(如 all-mpnet-base-v2
)性能更好,但速度较慢。通过删除无关的噪声(例如,HTML 标签)和标准化格式来预处理文本。如果处理多语言数据,请使用诸如 paraphrase-multilingual-MiniLM-L12-v2
之类的模型。对于生产环境,使用专用向量数据库(如 Qdrant 或 Pinecone)部署索引,这些数据库提供可扩展性和实时更新。这种方法确保您检索基于上下文相关性的结果,而不仅仅是关键词重叠。