快速搭建sentence_transformer方法

sentence transformer模型可以将句子进行Embedding。这里使用docker快速构建一个sentence transformer环境,小试牛刀。

准备镜像

这里Docker的安装就不介绍了,我们使用Dockerfile来构建我们的镜像,Dockerfile内容如下:

FROM python:3.10-slim

WORKDIR /app

RUN pip install transformers \
    && pip3 install torch --index-url https://download.pytorch.org/whl/cpu \
    && pip install sentence-transformers \
    && pip install Flask

Dockerfile里面的内容很简单,主要是安装pytorch以及sentence-transformers

构建镜像:docker build -t ddy_sentence_transformer .

下载模型

在官网https://www.sbert.net/的介绍中,通过下面的方式使用模型,如果模型不存在,则会自动下载:

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("hkunlp/instructor-large")

然而在使用的过程中,发现根本下载不下来,因此使用离线的方式下载模型,在https://public.ukp.informatik.tu-darmstadt.de/reimers/sentence-transformers/v0.2/中,找到我们需要的模型然后下载。

这里我们使用较小的模型,distiluse-base-multilingual-cased-v1.zip,模型支持中文。

将模型进行解压,得到:0_Transformer 1_Pooling 2_Dense config.json modules.json

构建一个简单的demo

新建一个main.py用于测试sentence_transformer:

from flask import Flask, request, jsonify
from sentence_transformers import SentenceTransformer, util

app = Flask(__name__)
model = SentenceTransformer('/app/distiluse-base-multilingual-cased-v1')

def encode_text(texts):    
    # Encode the texts and convert to list
    embeddings = model.encode(texts, convert_to_tensor=True, show_progress_bar=False)
    embeddings_list = embeddings.tolist()
    return embeddings_list

@app.route('/cal_distance', methods=['POST'])
def cal_distance():
    params = request.json
    sentence_1 = params['sentence_1']
    sentence_2 = params['sentence_2']
    embedding_1 = encode_text([sentence_1])[0]
    embedding_2 = encode_text([sentence_2])[0]
    distance = util.pytorch_cos_sim(embedding_1, embedding_2)
    print('sentence_1:', sentence_1, '|| sentence_2:' , sentence_2 , '===distance:', distance)
    return jsonify({'status': 'ok'})
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

程序的主要作用就是判断两句话的相似度

运行程序

docker run \
    -p 5000:5000 \
    -v /home/my_user/lib/ddy/sentence_transformer/distiluse-base-multilingual-cased-v1/:/app/distiluse-base-multilingual-cased-v1/ \
    -v /home/my_user/lib/ddy/sentence_transformer/code/main.py:/app/ \
    --name ddy \
    ddy_sentence_transformer \
    python -u main.py

测试

data = {"sentence_1": '教师', "sentence_2": '老师'}
requests.post('http://10.26.120.58:5000/cal_distance', json=data)

可以看出程序的输出结果:

sentence_1: 教师 || sentence_2: 老师 ===distance: tensor([[0.9625]])

可以看出来相似性还挺高的。

### 基于Transformer架构的句子融合技术 #### 句子融合的概念与重要性 句子融合是指将多个输入句子的信息综合成一个新的连贯表达的过程。这一过程不仅涉及语法结构的理解,还需要语义层面的一致性和逻辑上的流畅性。对于自然语言处理(NLP),特别是像摘要生成、对话系统等领域来说至关重要。 #### Transformer在句子融合中的优势 由于其自注意力机制能够捕捉长距离依赖关系并有效建模上下文信息,在处理多源文本时表现出色。这使得Transformers非常适合用于构建高效的句子融合模型[^1]。 #### 实现方式概述 一种常见的做法是先分别编码各个待融合的句子得到各自的表示向量;接着利用交叉注意层让这些表征相互作用从而获得更加丰富的联合特征空间;最后解码器依据此增强后的隐状态序列生成最终目标句。 具体步骤如下: - **预处理阶段** 对原始文档进行分词操作,并标注特殊标记(如`<bos>`开头,<eos>结尾),以便后续网络识别不同片段边界。 - **编码部分** 使用共享参数或多组独立权重矩阵来初始化若干个相同配置下的Encoder模块实例化对象,各自负责接收单条记录作为输入完成初步转换任务。 - **交互学习环节** 设计专门针对跨样本间关联性的计算单元——比如采用Scaled Dot Product Attention公式衡量两两之间相似度得分,再经由Softmax函数归一化后形成概率分布图谱指导下一步骤的选择决策流程。 - **解码输出端口** 经过充分训练调整优化过的Decoder组件按照既定策略逐步展开预测动作直至遇到终止符为止,则整个合成过程宣告结束。 ```python import torch.nn as nn from transformers import BertTokenizer, EncoderDecoderModel class SentenceFusion(nn.Module): def __init__(self, model_name='bert-base-uncased'): super(SentenceFusion, self).__init__() # 初始化BERT tokenizer 和 pre-trained encoder-decoder 模型 self.tokenizer = BertTokenizer.from_pretrained(model_name) self.model = EncoderDecoderModel.from_encoder_decoder_pretrained( model_name, model_name) def forward(self, input_ids_list): """ Args: input_ids_list (list of tensor): List containing tokenized sentences. Returns: Tensor: Generated fused sentence tokens ids. """ max_length = max([len(ids) for ids in input_ids_list]) padded_inputs = [torch.cat((ids, torch.zeros(max_length-len(ids), dtype=torch.long))) for ids in input_ids_list] batched_input = torch.stack(padded_inputs).unsqueeze(0) # Add batch dimension outputs = self.model.generate(batched_input, num_beams=5, min_length=20, max_length=max_length*2) return outputs.squeeze() fusion_model = SentenceFusion() input_sentences = ["The cat sat on the mat.", "It was a sunny day."] tokenized_inputs = [fusion_model.tokenizer.encode(sentence, add_special_tokens=True) for sentence in input_sentences] fused_output = fusion_model(tokenized_inputs) print(fusion_model.tokenizer.decode(fused_output)) ``` 上述代码展示了如何使用Hugging Face库中提供的BertTokenizer以及EncoderDecoderModel类快速搭建起一个简单的句子融合框架。这里选用的是基于BERT的基础版本来进行实验验证,实际应用可根据需求替换为更适合特定场景的大规模预训练模型以提升效果表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值