基于BERT算法搭建一个问答搜索引擎

鼎鼎大名的 bert 算法相信大部分同学都听说过,它是google推出的nlp领域“王炸级”预训练模型,其在nlp任务中刷新了多项记录,并取得state of the art的成绩。
但是有很多深度学习的新手发现bert模型并不好搭建,上手难度很高,普通人可能要研究几天才能勉强搭建出一个模型。
没关系,今天我们介绍的这个模块,能让你在3分钟内基于bert算法搭建一个问答搜索引擎。它就是 bert-as-service 项目。这个开源项目,能够让你基于多gpu机器快速搭建bert服务(支持微调模型),并且能够让多个客户端并发使用。
1.准备
开始之前,你要确保python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细python安装指南 进行安装。
**(可选1) **如果你用python的目的是数据分析,可以直接安装anaconda:python数据分析与挖掘好帮手—anaconda,它内置了python和pip.
**(可选2) **此外,推荐大家用vscode编辑器,它有许多的优点:python 编程的最好搭档—vscode 详细指南。
请选择以下任一种方式输入命令安装依赖 :
windows 环境 打开 cmd (开始-运行-cmd)。macos 环境 打开 terminal (command+空格输入terminal)。如果你用的是 vscode编辑器 或 pycharm,可以直接使用界面下方的terminal.pip install bert-serving-server # 服务端pip install bert-serving-client # 客户端请注意,服务端的版本要求: python >= 3.5 ,tensorflow >= 1.10 。
此外还要下载预训练好的bert模型,在 https://github.com/hanxiao/bert-as-service#install 上可以下载。
也可在python实用宝典后台回复 bert-as-service 下载这些预训练好的模型。
下载完成后,将 zip 文件解压到某个文件夹中,例如 /tmp/english_l-12_h-768_a-12/
2.bert-as-service 基本使用
安装完成后,输入以下命令启动bert服务:
bert-serving-start -model_dir /tmp/english_l-12_h-768_a-12/ -num_worker=4-num_worker=4 代表这将启动一个有四个worker的服务,意味着它最多可以处理四个并发请求。超过4个其他并发请求将在负载均衡器中排队等待处理。
下面显示了正确启动时服务器的样子:
使用客户端获取语句的编码现在你可以简单地对句子进行编码,如下所示:
from bert_serving.client import bertclientbc = bertclient()bc.encode(['first do it', 'then do it right', 'then do it better'])作为 bert 的一个特性,你可以通过将它们与 |||(前后有空格)连接来获得一对句子的编码,例如
bc.encode(['first do it ||| then do it right'])
远程使用 bert 服务
你还可以在一台 (gpu) 机器上启动服务并从另一台 (cpu) 机器上调用它,如下所示:
# on another cpu machinefrom bert_serving.client import bertclientbc = bertclient(ip='xx.xx.xx.xx') # ip address of the gpu machinebc.encode(['first do it', 'then do it right', 'then do it better'])3.搭建问答搜索引擎
我们将通过 bert-as-service 从faq 列表中找到与用户输入的问题最相似的问题,并返回相应的答案。
faq列表你也可以在 python实用宝典后台回复 bert-as-service 下载。
首先,加载所有问题,并显示统计数据:
prefix_q = '##### **q:** 'with open('readme.md') as fp: questions = [v.replace(prefix_q, '').strip() for v in fp if v.strip() and v.startswith(prefix_q)] print('%d questions loaded, avg. len of %d' % (len(questions), np.mean([len(d.split()) for d in questions]))) # 33 questions loaded, avg. len of 9一共有33个问题被加载,平均长度是9.
然后使用预训练好的模型:uncased_l-12_h-768_a-12 启动一个bert服务:
bert-serving-start -num_worker=1 -model_dir=/data/cips/data/lab/data/model/uncased_l-12_h-768_a-12接下来,将我们的问题编码为向量:
bc = bertclient(port=4000, port_out=4001)doc_vecs = bc.encode(questions)最后,我们准备好接收用户的查询,并对现有问题执行简单的“模糊”搜索。
为此,每次有新查询到来时,我们将其编码为向量并计算其点积 ** doc_vecs **然后对结果进行降序排序,返回前n个类似的问题:
while true: query = input('your question: ') query_vec = bc.encode([query])[0] # compute normalized dot product as score score = np.sum(query_vec * doc_vecs, axis=1) / np.linalg.norm(doc_vecs, axis=1) topk_idx = np.argsort(score)[::-1][:topk] for idx in topk_idx: print(' > %st%s' % (score[idx], questions[idx]))完成! 现在运行代码并输入你的查询,看看这个搜索引擎如何处理模糊匹配:
完整代码如下,一共23行代码(在后台回复关键词也能下载):
上滑查看完整代码
import numpyas np
from bert_serving.clientimport bertclient
from termcolorimport colored
prefix_q ='##### **q:** '
topk =5
with open('readme.md')as fp:
questions = [v.replace(prefix_q,'').strip()for vin fpif v.strip()and v.startswith(prefix_q)]
print('%d questions loaded, avg. len of %d' % (len(questions), np.mean([len(d.split())for din questions])))
with bertclient(port=4000, port_out=4001)as bc:
doc_vecs = bc.encode(questions)
while true:
query = input(colored('your question: ','green'))
query_vec = bc.encode([query])[0]
# compute normalized dot product as score
score = np.sum(query_vec * doc_vecs, axis=1) / np.linalg.norm(doc_vecs, axis=1)
topk_idx = np.argsort(score)[::-1][:topk]
print('top %d questions similar to %s' % (topk, colored(query,'green')))
for idxin topk_idx:
print(' > %st%s' % (colored('%.1f' % score[idx],'cyan'), colored(questions[idx],'yellow')))够简单吧?当然,这是一个基于预训练的bert模型制造的一个简单qa搜索模型。
你还可以微调模型,让这个模型整体表现地更完美,你可以将自己的数据放到某个目录下,然后执行 run_classifier.py 对模型进行微调,比如这个例子:
https://github.com/google-research/bert#sentence-and-sentence-pair-classification-tasks

中国的无人机地位在全球是怎样的位置
风力发电机对蓄电池的充电电路设计
realme是如何成为全球增长的最快手机品牌?
TB5128FTG驱动芯片在家用电器中的应用与效果研究
中国芯如何突围?
基于BERT算法搭建一个问答搜索引擎
食品重金属检测仪的使用步骤
教你如何利用傅里叶变换干漂亮的事
AMD下个目标或瞄准工作站市场 目前局面对AMD十分有利
华为云数据库GaussDB:给世界一个更优选择
海尔AWE发布物联网时代首个全流程口碑体系
PC市场格局渐稳 AMD需要赛灵思
晶能光电实验室获CNAS认可
TCL CES 带来首款打印式 OLED 卷轴屏,预计 2024 年量产
什么是主机总线适配器 HBA卡又是用来干嘛的呢?
服务拉动高增长!卡萨帝厨房8月年累份额继续翻番
小米POCO F3国行版详细规格配置曝光
可再生能源发展已成全球趋势
采用GPS测量监控技术校准高精度晶振时钟的设计方案介绍
基于IR53HD420驱动LED的驱动电路