第15篇:基于Milvus实现自然语言理解的实战案例

自然语言理解(NLU)是自然语言处理(NLP)的一个重要分支,旨在让计算机理解和解释人类语言。NLU广泛应用于搜索引擎、智能客服、推荐系统等领域。本文将详细介绍如何基于Milvus实现自然语言理解,特别是如何实现词嵌入与句嵌入、语义相似度计算。通过详细的代码示例,逐步讲解各个步骤的原理和实现方法。

自然语言理解的基本概念

词嵌入

词嵌入(Word Embedding)是将词汇映射到低维向量空间中的技术,通过这种映射,可以将词汇的语义信息表示为向量。常见的词嵌入方法有Word2Vec、GloVe、FastText等。

句嵌入

句嵌入(Sentence Embedding)是将整个句子映射到低维向量空间中的技术,能够捕捉句子的语义信息。常见的句嵌入方法有Sentence-BERT、Universal Sentence Encoder等。

语义相似度计算

语义相似度计算是基于向量空间中的距离度量词汇或句子之间的相似度。常用的度量方法有余弦相似度、欧氏距离等。

环境准备

安装必要的依赖包

我们需要安装以下Python依赖包:

!pip install milvus
!pip install transformers
!pip install sentence-transformers
!pip install numpy

词嵌入与句嵌入的实现

使用预训练模型生成词嵌入

我们可以使用Transformers库中的预训练模型生成词嵌入。这里以BERT模型为例:

from transformers import BertTokenizer, BertModel
import torch

# 加载预训练的BERT模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

def get_word_embedding(word):
    # 分词并转换为张量
    inputs = tokenizer(word, return_tensors='pt')
    outputs = model(**inputs)
    # 获取词嵌入
    word_embedding = outputs.last_hidden_state.mean(dim=1).detach().numpy()
    return word_embedding

# 示例
word = "example"
embedding = get_word_embedding(word)
print(embedding)
使用预训练模型生成句嵌入

同样,我们可以使用Sentence-BERT模型生成句嵌入:

from sentence_transformers import SentenceTransformer
import numpy as np

# 加载预训练的Sentence-BERT模型
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')

def get_sentence_embedding(sentence):
    """
    使用预训练的Sentence-BERT模型生成句嵌入
    :param sentence: 输入句子
    :return: 句嵌入向量
    """
    sentence_embedding = model.encode(sentence)
    return sentence_embedding

# 示例句子
sentences = [
    "This is an example sentence.",
    "This is another example.",
    "Completely different sentence."
]

# 生成所有句子的嵌入
embeddings = [get_sentence_embedding(sentence) for sentence in sentences]
插入句嵌入到Milvus

我们将生成的句嵌入插入到Milvus中进行管理和查询。

from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection

# 连接Milvus
connections.connect()

# 定义字段
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384)
]

# 创建集合
schema = CollectionSchema(fields, "embedding_collection")
collection = Collection(name="nlp_collection", schema=schema)

# 创建索引
index_params = {
    "metric_type": "L2",
    "index_type": "IVF_FLAT",
    "params": {"nlist": 128}
}
collection.create_index(field_name="embedding", index_params=index_params)

# 插入数据
def insert_data(collection, embeddings):
    """
    插入嵌入数据到Milvus集合
    :param collection: Milvus集合
    :param embeddings: 嵌入向量列表
    """
    ids = list(range(len(embeddings)))
    data = [
        ids,
        embeddings
    ]
    collection.insert(data)
    collection.load()

insert_data(collection, embeddings)

Milvus的基本操作

Milvus的安装与配置

首先,我们需要安装并启动Milvus。可以参考官方文档进行安装。这里以Docker方式为例:

docker pull milvusdb/milvus:latest
docker run -d --name milvus --network host milvusdb/milvus:latest

详细步骤可以参考前文:第2篇:Milvus安装与配置指南

数据库的创建与管理
from pymilvus import connections, utility, FieldSchema, CollectionSchema, DataType, Collection

# 连接Milvus
connections.connect()

# 定义字段
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384)
]

# 创建集合
schema = CollectionSchema(fields, "embedding_collection")
collection = Collection(name="nlp_collection", schema=schema)

# 创建索引
index_params = {
    "metric_type": "L2",
    "index_type": "IVF_FLAT",
    "params": {"nlist": 128}
}
collection.create_index(field_name="embedding", index_params=index_params)
数据的插入与查询
# 插入数据
def insert_data(collection, embeddings):
    ids = list(range(len(embeddings)))
    data = [
        ids,
        embeddings
    ]
    collection.insert(data)
    collection.load()

# 查询数据
def search_data(collection, query_embedding, top_k=5):
    search_params = {
        "metric_type": "L2",
        "params": {"nprobe": 10}
    }
    results = collection.search([query_embedding], "embedding", search_params, limit=top_k)
    return results

# 示例
embeddings = [get_sentence_embedding("This is a test sentence.")]
insert_data(collection, embeddings)
query_embedding = get_sentence_embedding("test")
results = search_data(collection, query_embedding)
print(results)

基于Milvus的语义相似度计算

语义相似度计算原理

语义相似度计算基于向量之间的距离,常用的度量方法有余弦相似度和欧氏距离。Milvus支持多种向量索引结构和距离度量方法,可以根据应用需求选择合适的配置。

语义相似度计算的实现

我们可以使用上述生成的句嵌入,在Milvus中进行相似度计算。以下是具体实现:

def search_data(collection, query_embedding, top_k=5):
    """
    在Milvus中搜索最相似的句子
    :param collection: Milvus集合
    :param query_embedding: 查询嵌入向量
    :param top_k: 返回最相似的前k个结果
    :return: 搜索结果
    """
    search_params = {
        "metric_type": "L2",
        "params": {"nprobe": 10}
    }
    results = collection.search([query_embedding], "embedding", search_params, limit=top_k)
    return results

# 查询示例
query_sentence = "example"
query_embedding = get_sentence_embedding(query_sentence)
results = search_data(collection, query_embedding)

# 输出结果
for result in results:
    print(f"ID: {result.id}, Distance: {result.distance}")

完整流程图

我们来绘制整个流程图,以便更好地理解各个步骤。

用户输入句子
生成句嵌入
插入嵌入到Milvus
用户查询句子
生成查询句子嵌入
在Milvus中搜索相似句子
返回相似句子结果

代码的完整实现

下面是完整的代码实现,包含所有步骤的详细注释:

from sentence_transformers import SentenceTransformer
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection
import numpy as np

# 加载预训练的Sentence-BERT模型
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')

def get_sentence_embedding(sentence):
    """
    使用预训练的Sentence-BERT模型生成句嵌入
    :param sentence: 输入句子
    :return: 句嵌入向量
    """
    sentence_embedding = model.encode(sentence)
    return sentence_embedding

# 连接Milvus
connections.connect()

# 定义字段
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384)
]

# 创建集合
schema = CollectionSchema(fields, "embedding_collection")
collection = Collection(name="nlp_collection", schema=schema)

# 创建索引
index_params = {
    "metric_type": "L2",
    "index_type": "IVF_FLAT",
    "params": {"nlist": 128}
}
collection.create_index(field_name="embedding", index_params=index_params)

def insert_data(collection, embeddings):
    """
    插入嵌入数据到Milvus集合
    :param collection: Milvus集合
    :param embeddings: 嵌入向量列表
    """
    ids = list(range(len(embeddings)))
    data = [
        ids,
        embeddings
    ]
    collection.insert(data)
    collection.load()

def search_data(collection, query_embedding, top_k=5):
    """
    在Milvus中搜索最相似的句子
    :param collection: Milvus集合
    :param query_embedding: 查询嵌入向量
    :param top_k: 返回最相似的前k个结果
    :return: 搜索结果
    """
    search_params = {
        "metric_type": "L2",
        "params": {"nprobe": 10}
    }
    results = collection.search([query_embedding], "embedding", search_params, limit=top_k)
    return results

# 示例句子
sentences = [
    "This is an example sentence.",
    "This is another example.",
    "Completely different sentence."
]

# 生成所有句子的嵌入
embeddings = [get_sentence_embedding(sentence) for sentence in sentences]

# 插入嵌入到Milvus
insert_data(collection, embeddings)

# 查询示例
query_sentence = "example"
query_embedding = get_sentence_embedding(query_sentence)
results = search_data(collection, query_embedding)

# 输出结果
for result in results:
    print(f"ID: {result.id}, Distance: {result.distance}")

通过上述代码和流程图,我们详细展示了如何基于Milvus实现一个句子搜索系统。从生成句嵌入、插入Milvus到查询相似句子,每一步都有详细的说明和代码示例。这种方法可以广泛应用于各种需要自然语言理解的场景,如智能搜索、推荐系统等。

总结

本文详细介绍了基于Milvus实现自然语言理解的方法,包括词嵌入与句嵌入的生成、Milvus的基本操作和语义相似度计算。通过具体的代码示例,展示了如何一步步实现这些功能。Milvus作为高性能的向量数据库,能够高效地处理大规模向量数据,是实现自然语言理解的强大工具。

如果你喜欢这篇文章,别忘了收藏文章、关注作者、订阅专栏,感激不尽。

  • 29
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于 Milvus 的多模态检索系统可以实现对多种类型数据的检索,例如图像、文本、语音等。下面是一个简单的演示: 1. 首先,需要安装 Milvus 和相应的 Python SDK: ```shell pip install pymilvus==2.0.0rc5 pip install opencv-python==4.5.1.48 pip install Pillow==8.2.0 pip install grpcio==1.32.0 pip install grpcio-tools==1.32.0 ``` 2. 接下来,我们需要准备一些数据。这里以图像为例,将一些图像文件存储在本地文件夹中。 3. 然后,我们需要将这些图像向量化,并将它们插入到 Milvus 中。这里使用 ResNet50 模型提取图像特征,并使用 Milvus Python SDK 将特征向量插入到 Milvus 中。 ```python import os import cv2 import numpy as np from PIL import Image from milvus import Milvus, IndexType, MetricType, Status # 连接 Milvus milvus = Milvus(host='localhost', port='19530') # 创建 collection collection_name = 'image_collection' if collection_name in milvus.list_collections(): milvus.drop_collection(collection_name) milvus.create_collection(collection_name, {'fields': [ {'name': 'id', 'type': 'int64', 'is_primary': True}, {'name': 'embedding', 'type': 'float', 'params': {'dim': 2048}} ], 'segment_row_limit': 4096, 'auto_id': False}) # 加载 ResNet50 模型 model = cv2.dnn.readNetFromTorch('resnet50.t7') model.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV) model.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU) # 提取图像特征并插入到 Milvus 中 data_path = 'image_data' for i, file_name in enumerate(os.listdir(data_path)): file_path = os.path.join(data_path, file_name) img = cv2.imread(file_path) img = cv2.resize(img, (224, 224)) blob = cv2.dnn.blobFromImage(img, 1, (224, 224), (104, 117, 123)) model.setInput(blob) embedding = model.forward().flatten() status, ids = milvus.insert(collection_name=collection_name, records=[ {'id': i, 'embedding': embedding.tolist()} ]) print(f'Insert image {file_name} with id {ids[0]}') # 创建索引 milvus.create_index(collection_name, IndexType.IVF_FLAT, {'nlist': 128}) ``` 4. 现在,我们已经将图像向量化并插入到 Milvus 中了。接下来,我们可以使用 Milvus 的向量相似度搜索功能来实现多模态检索。这里以图像检索为例,给定一张查询图像,我们可以使用同样的方式提取其特征向量,并在 Milvus 中搜索与其相似的图像。 ```python # 加载查询图像 query_path = 'query_image.jpg' query_img = cv2.imread(query_path) query_img = cv2.resize(query_img, (224, 224)) query_blob = cv2.dnn.blobFromImage(query_img, 1, (224, 224), (104, 117, 123)) # 提取查询图像特征 model.setInput(query_blob) query_embedding = model.forward().flatten() # 在 Milvus 中搜索相似的图像 search_param = {'nprobe': 16} status, results = milvus.search(collection_name, query_embedding.tolist(), 10, search_params=search_param) print(f'Search results: {results}') ``` 以上就是一个简单的基于 Milvus 的多模态检索系统的演示。除了图像检索,我们也可以使用类似的方式实现文本、语音等多种类型数据的检索。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Gemini技术窝

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

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

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

打赏作者

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

抵扣说明:

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

余额充值