使用Qdrant+FastText实现向量存储和检索

1 概述

《使用FastText库训练词向量》一文中,已经训练并保存好了一个用 FastText 训练的词向量模型-model_0809_001。在接下来的实践中,将直接使用该词向量模型来生成对应数据的向量,然后将向量和对应的负载存储到 Qdrant 中,然后进行向量检索。

2 向量存储和检索

下面是使用 Qdrant+FastText 实现向量存储和检索的实践案例。

2.1 创建 Qdrant 向量数据库

引入 qdrant_client 版本 为 1.10.1 的 Qdrant 的 python 客户端库。

pip install qdrant-client
或
conda install conda-forge::qdrant-client

创建并启动一个Qdrant数据库,数据持久化到磁盘,数据存储地址 “/Users/Shared/data/qdrant”。

from qdrant_client import QdrantClient
 
client = QdrantClient(path="/Users/Shared/data/qdrant")

2.2 创建数据集

创建一个名称为 test_collection_0812 的数据集。其中向量维度为200维(和FastText词向量模型设置的向量维度保持一致),相似度计算方式使用欧几里德距离-Distance.EUCLID。

def create_collection_0812():
    client.create_collection(
        collection_name="test_collection_0812",
        vectors_config=VectorParams(size=200, distance=Distance.EUCLID),
    )

2.3 新增向量数据 

首先使用 FastText 加载训练好的向量模型-model_0809_001, 然后使用该模型生成特征数据的向量,并往 test_collection_0812 数据集中新增向量数据。

# 加载词向量模型
model = fasttext.load_model(model_0809_001)

def add_vectors_0812():
    # 往向量库新增数据
    client.upsert(
        collection_name="test_collection_0812",
        wait=True,
        points=[
            PointStruct(id=1, vector=model['黄疸茵陈片'], payload={"genericName": "黄疸茵陈片"}),
            PointStruct(id=2, vector=model['美沙拉嗪肠溶片'], payload={"genericName": "美沙拉嗪肠溶片"}),
            PointStruct(id=3, vector=model['盐酸贝那普利'], payload={"genericName": "盐酸贝那普利"}),
            PointStruct(id=4, vector=model['痔康片'], payload={"genericName": "痔康片"}),
            PointStruct(id=5, vector=model['阿普唑仑'], payload={"genericName": "阿普唑仑"}),
            PointStruct(id=6, vector=model['黄疸茵陈冲剂'], payload={"genericName": "黄疸茵陈冲剂"}),
            PointStruct(id=7, vector=model['肝素钙注射液'], payload={"genericName": "肝素钙注射液"}),
            PointStruct(id=8, vector=model['黄疸茵陈颗粒'], payload={"genericName": "黄疸茵陈颗粒"}),
        ],
    )

2.4 向量检索

进行向量检索时,同样是使用向量模型-model_0809_001生成查询入参的向量,然后进行向量搜索。搜索结果的分数(score)越小代表搜索结果与入参越相近。下面是搜索与“黄疸茵陈片”最相近的6条数据的案例。

def query_0812(genericName, size):
    search_result = client.search(
        collection_name="test_collection_0812", query_vector=model[genericName], limit=size, with_vectors=True
    )

    for var in search_result:
        print(var)


if __name__ == '__main__':
    query_0811("黄疸茵陈片", 6)

搜索结果如下所示:

### SnowNLP 与 FastText 的结合方法 #### 背景介绍 SnowNLP 是一种用于中文自然语言处理的 Python 库,能够完成诸如分词、情感分析、关键词提取等功能[^2]。FastText 则是由 Facebook 开源的一种高效文本分类嵌入学习工具,适用于大规模数据集上的快速训练预测[^5]。 两者的结合可以通过以下方式实现:先使用 SnowNLP 对中文文本进行预处理(如分词、去停用词),再将处理后的结果输入到 FastText 中进行模型训练或推理。 --- #### 实现步骤说明 以下是具体的实现过程: 1. **加载并准备数据** 需要准备好待处理的数据集,并将其划分为训练集测试集。 2. **使用 SnowNLP 进行预处理** 使用 SnowNLP 提供的功能对原始文本进行清洗、分词以及去除无意义的内容。 3. **构建适合 FastText 输入格式的数据** FastText 支持特定格式的输入文件,通常是以 `__label__` 表示标签的方式存储每条记录。 4. **训练 FastText 模型** 使用预处理好的数据来训练 FastText 文本分类器或其他类型的模型。 --- #### 示例代码 下面是一个完整的代码示例,展示如何将 SnowNLP FastText 结合起来使用: ```python import jieba from snownlp import SnowNLP from fasttext import train_supervised # 数据样本 (假设我们有一个简单的二分类问题) data = [ ("这个产品太棒了!", "__label__positive"), ("服务很差,不推荐购买。", "__label__negative"), ("一般般,没有特别的感觉。", "__label__neutral") ] # 准备数据函数 def prepare_data(data): processed_data = [] for text, label in data: s = SnowNLP(text) # 创建 SnowNLP 对象 segmented_text = " ".join(s.words) # 使用 SnowNLP 分词 processed_data.append(f"{segmented_text} {label}") # 构建 FastText 格式的输入 return "\n".join(processed_data) # 将数据转换为 FastText 所需格式 fasttext_input = prepare_data(data) # 保存为临时文件以便 FastText 训练 with open("train.txt", "w", encoding="utf-8") as f: f.write(fasttext_input) # 训练 FastText 模型 model = train_supervised(input="train.txt", lr=1.0, epoch=25, wordNgrams=2) # 测试模型 test_texts = ["产品质量很好", "物流很慢"] for test_text in test_texts: s_test = SnowNLP(test_text) # 处理新文本 segmented_test_text = " ".join(s_test.words) # 分词 prediction = model.predict(segmented_test_text)[0][0] # 获取预测结果 print(f"原文: {test_text}, 预测类别: {prediction}") ``` --- #### 关键点解析 1. **SnowNLP 的作用** 在此过程中,SnowNLP 主要用作中文分词工具,帮助我们将未结构化的中文文本转化为可供机器理解的形式[^2]。 2. **FastText 的优势** FastText 可以高效地训练大型语料库中的文本分类模型,其支持多种超参数调整选项,从而提升最终效果[^5]。 3. **数据格式的重要性** FastText 需要特定格式的输入文件,其中每一行代表一条带标签的记录,形如 `"word1 word2 __label__class"`[^6]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ability Liao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值