搜索引擎主题模型优化( 让你在3分钟基于BERT算法搭建一个问答搜索引擎-service项目 )
优采云 发布时间: 2022-01-13 13:18搜索引擎主题模型优化(
让你在3分钟基于BERT算法搭建一个问答搜索引擎-service项目
)
众所周知的Bert算法相信大部分同学都听说过。是谷歌在NLP领域推出的预训练模型。它刷新了 NLP 任务中的许多记录,并取得了最先进的结果。
但是,很多深度学习新手发现,BERT模型并不容易搭建,上手难度很大。普通人可能需要学习几天才能勉强建立模型。
没关系,我们今天介绍的模块可以让你在3分钟内搭建一个基于BERT算法的问答搜索引擎。它是 bert-as-service 项目。这个开源项目可以让你快速构建基于多 GPU 机器的 BERT 服务(支持微调模型),并允许多个客户端同时使用它们。
1.准备
在开始之前,您需要确保 Python 和 pip 已成功安装在您的计算机上。
请选择以下方法之一输入命令安装依赖项:
1. Windows 环境打开 Cmd (Start-Run-CMD)。
2. 在 MacOS 环境下打开终端(command+space 进入终端)。
3.如果你使用的是VSCode编辑器或者Pycharm,可以直接使用界面底部的Terminal。
pip install bert-serving-server # 服务端
pip install bert-serving-client # 客户端
请注意,服务器版本要求为:Python >= 3.5,Tensorflow >= 1.10。
另外,下载预训练的 BERT 模型,可以在#install 下载。
下载完成后,将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 表示这将启动一个有四个工作人员的服务,这意味着它最多可以处理四个并发请求。超过 4 个其他并发请求将在负载均衡器中排队等待处理。
下面显示了正确启动时服务器的外观:
使用客户端获取语句的编码
现在您可以像这样简单地对句子进行编码:
from bert_serving.client import BertClient
bc = 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 machine
from bert_serving.client import BertClient
bc = BertClient(ip='xx.xx.xx.xx') # ip address of the GPU machine
bc.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('> %s\t%s' % (score[idx], questions[idx]))
结束!现在运行代码并输入您的查询,看看这个搜索引擎如何处理模糊匹配:
完整代码如下,一共23行代码(后台回复关键词也可以下载):
向上滑动查看完整代码
import numpy as np
from bert_serving.client import BertClient
from termcolor import colored
prefix_q = '##### **Q:** '
topk = 5
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])))
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 idx in topk_idx:
print('> %s\t%s' % (colored('%.1f' % score[idx], 'cyan'), colored(questions[idx], 'yellow')))
很简单,对吧?当然,这是一个基于预训练的 Bert 模型的简单 QA 搜索模型。
您还可以对模型进行微调,使模型的整体性能更加完美。你可以把自己的数据放在一个目录下,然后执行run_classifier.py对模型进行微调,比如这个例子:
#sentence-and-sentence-pair-classification-tasks
它还有很多其他用途,这里就不一一介绍了,大家可以去官方文档学习:
觉得还不错就给我一个小小的鼓励吧!