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)