python短文本相似度计算_预训练Bert句向量_flask

该博客介绍了如何利用预训练模型sentence_transformers来实现文本相似度匹配任务,具体场景是找出与输入问句最相似的短文本。通过加载'bert-base-chinese'模型,对候选文本数据集进行编码,并计算余弦相似度来确定最高相似度的文本。代码中展示了从获取输入到返回最相似文本的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 任务介绍(预训练模型sentence_transformers来做文本相似度匹配任务)

从一堆候选短文本数据集中筛选出与输入问句最相似的短文本(即短文本相似度匹配)

1.1 首先输入比如是:“我要出国”

1.2 候选数据集有10条短文本,如下:

候选文本数据
外国人出入境证签发
新增年生产能力500万吨及以上煤矿项目核准
对完成关系国家利益或者公共利益并有重大应用价值的植物新品种育种的单位或者个人的奖励
法律职业资格认定
戒毒医疗机构或医疗机构从事戒毒治疗业务许可
城乡居民基本养老保险关系转移接续申请
涉及敏感国家和地区、敏感行业的境外投资项目核准
外国人对国家重点保护陆生野生动物进行野外考察或野外拍摄电影、录像审批
广播电台、电视台设立、终止审批
普通高等学校教师资格认定
法律职业资格认定

1.3 最终输出相似度最高的文本,如下:

外国人出入境证签发

附录一:代码实现:

from sentence_transformers import SentenceTransformer, util
import pandas as pd
from flask import Flask, request, jsonify
import json
import numpy as np
import time

app = Flask(__name__)
model = SentenceTransformer('bert-base-chinese')
model.eval()
content = pd.read_table("data.txt", header=None)[0].values.tolist()
passage_embedding = model.encode(content, convert_to_numpy=True)

def cosine_similarity(x, y):
    num = x.dot(y.T)
    denom = np.linalg.norm(x) * np.linalg.norm(y, axis=1)
    return num / denom

def sim(ask, level):
    time1 = time.time()
    ask = model.encode([ask])
    time2 = time.time()
    spend_time = time2 - time1
    print(spend_time)
    cos_matrix = cosine_similarity(ask, passage_embedding)[0]
    index = np.argsort(-cos_matrix)[level]
    return [content[index], cos_matrix[index]]

@app.route('/top_ask', methods=['GET', 'POST'])
def get_synonyms():
    json_data = request.get_data()
    comment_json = json.loads(json_data)
    ask = comment_json['ask']
    json_data = sim2(ask, 0)
    return jsonify({"text": str(json_data[0]), "相似度": str(json_data[1])})

if __name__ == '__main__':  #
    app.run(host="0.0.0.0", port=1089, debug=True)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dunwuh

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

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

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

打赏作者

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

抵扣说明:

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

余额充值