0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-30 11:46 次阅读

鼎鼎大名的 Bert 算法相信大部分同学都听说过,它是Google推出的NLP领域“王炸级”预训练模型,其在NLP任务中刷新了多项记录,并取得state of the art的成绩。

但是有很多深度学习的新手发现BERT模型并不好搭建,上手难度很高,普通人可能要研究几天才能勉强搭建出一个模型。

没关系,今天我们介绍的这个模块,能让你在3分钟内基于BERT算法搭建一个问答索引擎。它就是 bert-as-service 项目。这个开源项目,能够让你基于多GPU机器快速搭建BERT服务(支持微调模型),并且能够让多个客户端并发使用。

1.准备

开始之前,你要确保Pythonpip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

**(可选1) **如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

**(可选2) **此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南

请选择以下任一种方式输入命令安装依赖

  1. Windows 环境 打开 Cmd (开始-运行-CMD)。
  2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
  3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install bert-serving-server # 服务端
pip install bert-serving-client # 客户端

请注意,服务端的版本要求: Python >= 3.5Tensorflow >= 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 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(' > %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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    27

    文章

    4417

    浏览量

    126699
  • 算法
    +关注

    关注

    23

    文章

    4455

    浏览量

    90755
  • 搜索引擎
    +关注

    关注

    0

    文章

    107

    浏览量

    13306
  • 模型
    +关注

    关注

    1

    文章

    2704

    浏览量

    47685
收藏 人收藏

    评论

    相关推荐

    [分享]最强山寨版搜索引擎震惊世界-熊熊搜索

    。在记者尝试着搜索关键词后,集合了多个搜索引擎的组合页面出现在屏幕上。界面上不仅详细列出
    发表于 11-22 18:58

    参加搜索引擎营销SEM培训的好处?

    参加搜索引擎营销SEM培训进入搜索引擎行业,跟随各大搜索引擎起成长;4. 可以通过校友会认识大量业界专家和从业者,为日后的职业发展广聚人脉资源;北京鼎泰恒业网络营销培训学校010-5
    发表于 04-11 14:21

    详解搜索引擎中的投票机制

    苏七SEO解读搜索引擎的投票机制
    发表于 04-11 14:03

    基于网格技术的并行搜索引擎

    研究现有网格技术和搜索技术,分析并行搜索引擎的优点和不足,提出基于网格技术的并行搜索引擎解决方案,其中包含一个3 层结构的应用框架和一个并行搜索引擎的应用方案。
    发表于 03-30 10:09 23次下载

    搜索引擎查询日志的聚类

    随着搜索引擎技术和网络数据挖掘技术的发展,怎样从搜索引擎查询日志中找到有用的信息成为研究热点。该文在讨论Beeferman提出的算法及Chan对其改进的算法的优缺点后,提出一个
    发表于 04-02 08:49 27次下载

    基于伪爬行器的主题式元搜索引擎研究与设计

    为提高搜索的查准率和查全率,设计一个主题式的元搜索引擎和一个类似于爬行器的伪爬行器,通过调用通用搜索引擎采集信息,查全率高于通用搜索引擎。利用反馈机制,参考用
    发表于 04-10 09:33 22次下载

    原创优先的搜索引擎排序算法

    现有的搜索引擎排序算法大多根据网页之间的链接关系进行排序,没有考虑原创和转载文章之间的优先次序。该文提出一种适用于专业搜索引擎的新型排序算法,在排序时优先考虑
    发表于 04-16 08:43 20次下载

    后缀树聚类算法在元搜索引擎中的应用

    搜索引擎结果覆盖面广,易于维护,实现简单,能够提供比较全面的结果给用户。后缀树聚类算法(STC)充分考虑了文本集合的语言学特征,并引入了短语特性,从而产生了较好的聚类效果
    发表于 03-01 15:59 14次下载

    主题搜索引擎的研究

    介绍了将开源的全文检索工具包Lucene嵌入到自己的搜索引擎中来满足开发主题搜索引擎的需求。并基于Lucene中文分词的不足设计了一个比较完善的中文分词器,然后将其引入具体应
    发表于 07-05 16:30 11次下载

    网络搜索引擎,网络搜索引擎的工作原理

    网络搜索引擎,网络搜索引擎的工作原理 21 世纪是信息时代,随着信息科学技术的不断发展,网络已成为人们生活中的重要组成部分,网上
    发表于 03-26 15:51 1365次阅读

    基于JAVA技术的搜索引擎的研究与实现

    本文还利用Java技术对搜索引擎的三个核心部分即网络蜘蛛、网页索引搜索进行了实现。索引搜索部分借助Lucene全文
    发表于 05-07 14:14 35次下载
    基于JAVA技术的<b class='flag-5'>搜索引擎</b>的研究与实现

    基于带权集合的搜索引擎隐式反馈算法

    基于带权集合的隐式反馈算法。本文通过分析搜索引擎返回结果页面的特点,提出了一种描述网页摘要的带权集合以及相应元素的权重计算方法,并设计了一种带权集合的交集运算方法,通过该运算可以获取用户隐含的检索意图,最后以查询扩展的方
    发表于 12-20 15:49 0次下载
    基于带权集合的<b class='flag-5'>搜索引擎</b>隐式反馈<b class='flag-5'>算法</b>

    垂直搜索引擎是什么_垂直搜索引擎有哪些

    垂直搜索引擎是针对某一个行业的专业搜索引擎,是搜索引擎的细分和延伸,是对网页库中的某类专门的信息进行一次整合,定向分字段抽取出需要的数据进行处理后再以某种形式返回给用户。垂直搜索是相对
    发表于 01-04 17:19 7529次阅读

    苹果自研的搜索引擎干的过谷歌吗?

    据TNW报道,苹果正在加快研发自己的搜索引擎,以取代谷歌。推出自己的搜索引擎,将有利于苹果的产品服务的推广,同时削弱谷歌在搜索领域的垄断地位。
    的头像 发表于 12-22 14:54 1748次阅读

    NAS下搭建linux命令搜索引擎教程

    前面写到了程序专用的vscode,今天再来介绍一款程序佬专用的搜索引擎——Linux命令搜索引擎。该引擎专用于搜索Linux下的各种命令,毕竟人的记忆力是有限的,当你记不住某一个命令的
    的头像 发表于 02-24 11:33 854次阅读
    NAS下<b class='flag-5'>搭建</b>linux命令<b class='flag-5'>搜索引擎</b>教程