当前位置:首页 > 科技  > 软件

Python 教你三分钟用Bert搭建问答搜索引擎

来源: 责编: 时间:2024-04-29 09:04:08 209观看
导读鼎鼎大名的 Bert 算法相信大部分同学都听说过,它是Google推出的NLP领域“王炸级”预训练模型,其在NLP任务中刷新了多项记录,并取得state of the art的成绩。但是有很多深度学习的新手发现BERT模型并不好搭建,上手难度很高

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

但是有很多深度学习的新手发现BERT模型并不好搭建,上手难度很高,普通人可能要研究几天才能勉强搭建出一个模型。hqV28资讯网——每日最新资讯28at.com

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

1.准备

hqV28资讯网——每日最新资讯28at.com

hqV28资讯网——每日最新资讯28at.com

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。hqV28资讯网——每日最新资讯28at.com

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.hqV28资讯网——每日最新资讯28at.com

(可选2) 此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南。hqV28资讯网——每日最新资讯28at.com

请选择以下任一种方式输入命令安装依赖:1. Windows 环境 打开 Cmd (开始-运行-CMD)。2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.hqV28资讯网——每日最新资讯28at.com

pip install bert-serving-server # 服务端pip install bert-serving-client # 客户端

hqV28资讯网——每日最新资讯28at.com

请注意,服务端的版本要求:Python >= 3.5,Tensorflow >= 1.10 。hqV28资讯网——每日最新资讯28at.com

此外还要下载预训练好的BERT模型,在 https://github.com/hanxiao/bert-as-service#install 上可以下载,如果你无法访问该网站,也可以在 https://pythondict.com/download/bert-serving-model/ 此处下载。hqV28资讯网——每日最新资讯28at.com

也可在Python实用宝典后台回复 bert-as-service 下载这些预训练好的模型。hqV28资讯网——每日最新资讯28at.com

下载完成后,将 zip 文件解压到某个文件夹中,例如 /tmp/uncased_L-24_H-1024_A-16/.hqV28资讯网——每日最新资讯28at.com

2.Bert-as-service 基本使用

hqV28资讯网——每日最新资讯28at.com

hqV28资讯网——每日最新资讯28at.com

安装完成后,输入以下命令启动BERT服务:hqV28资讯网——每日最新资讯28at.com

bert-serving-start -model_dir /tmp/uncased_L-24_H-1024_A-16/ -num_worker=4

hqV28资讯网——每日最新资讯28at.com

-num_worker=4 代表这将启动一个有四个worker的服务,意味着它最多可以处理四个并发请求。超过4个其他并发请求将在负载均衡器中排队等待处理。hqV28资讯网——每日最新资讯28at.com

下面显示了正确启动时服务器的样子:hqV28资讯网——每日最新资讯28at.com

图片图片hqV28资讯网——每日最新资讯28at.com

使用客户端获取语句的编码

现在你可以简单地对句子进行编码,如下所示:hqV28资讯网——每日最新资讯28at.com

from bert_serving.client import BertClientbc = BertClient()bc.encode(['First do it', 'then do it right', 'then do it better'])

hqV28资讯网——每日最新资讯28at.com

作为 BERT 的一个特性,你可以通过将它们与 |||(前后有空格)连接来获得一对句子的编码,例如hqV28资讯网——每日最新资讯28at.com

bc.encode(['First do it ||| then do it right'])

hqV28资讯网——每日最新资讯28at.com

图片图片hqV28资讯网——每日最新资讯28at.com

hqV28资讯网——每日最新资讯28at.com

远程使用 BERT 服务

你还可以在一台 (GPU) 机器上启动服务并从另一台 (CPU) 机器上调用它,如下所示:hqV28资讯网——每日最新资讯28at.com

hqV28资讯网——每日最新资讯28at.com

# 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'])

hqV28资讯网——每日最新资讯28at.com

3.搭建问答搜索引擎

hqV28资讯网——每日最新资讯28at.com

hqV28资讯网——每日最新资讯28at.com

我们将通过 bert-as-service 从FAQ 列表中找到与用户输入的问题最相似的问题,并返回相应的答案。hqV28资讯网——每日最新资讯28at.com

FAQ列表其实就是官方文档的readme.md, 在我提供的下载链接里也附带了。hqV28资讯网——每日最新资讯28at.com

1. 加载所有问题,并显示统计数据:hqV28资讯网——每日最新资讯28at.com

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

hqV28资讯网——每日最新资讯28at.com

一共有33个问题被加载,平均长度是9.hqV28资讯网——每日最新资讯28at.com

2. 然后使用预训练好的模型:uncased_L-12_H-768_A-12 启动一个Bert服务:hqV28资讯网——每日最新资讯28at.com

bert-serving-start -num_worker=1 -model_dir=/data/cips/data/lab/data/model/uncased_L-12_H-768_A-12

hqV28资讯网——每日最新资讯28at.com

3. 接下来,将我们的问题编码为向量:hqV28资讯网——每日最新资讯28at.com

bc = BertClient(port=4000, port_out=4001)doc_vecs = bc.encode(questions)

hqV28资讯网——每日最新资讯28at.com

4. 最后,我们准备好接收用户的查询,并对现有问题执行简单的“模糊”搜索。hqV28资讯网——每日最新资讯28at.com

为此,每次有新查询到来时,我们将其编码为向量并计算其点积  doc_vecs 然后对结果进行降序排序,返回前N个类似的问题:hqV28资讯网——每日最新资讯28at.com

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]))

hqV28资讯网——每日最新资讯28at.com

完成!现在运行代码并输入你的查询,看看这个搜索引擎如何处理模糊匹配:hqV28资讯网——每日最新资讯28at.com

图片图片hqV28资讯网——每日最新资讯28at.com

hqV28资讯网——每日最新资讯28at.com

完整代码如下,一共23行代码:hqV28资讯网——每日最新资讯28at.com

import numpy as npfrom bert_serving.client import BertClientfrom termcolor import coloredprefix_q = '##### **Q:** 'topk = 5with 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搜索模型。hqV28资讯网——每日最新资讯28at.com

你还可以微调模型,让这个模型整体表现地更完美,你可以将自己的数据放到某个目录下,然后执行 run_classifier.py 对模型进行微调,比如这个例子:hqV28资讯网——每日最新资讯28at.com

https://github.com/google-research/bert#sentence-and-sentence-pair-classification-taskshqV28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-86340-0.htmlPython 教你三分钟用Bert搭建问答搜索引擎

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 系统设计中跨时区问题 解决方案

下一篇: Go 语言将 PDF 转为 Word ,代码怎么实现 ?

标签:
  • 热门焦点
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 轿车从天而降电动车主被撞身亡 超速抢道所致:现场视频让网友吵翻

    近日,上海青浦区法院判决轿车从天而降电动车主被撞身亡案,轿车车主被判有期徒刑一年。案件显示当时男子驾驶轿车在上海某路段行驶,前车忽然转弯提速超车,
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • Golang 中的 io 包详解:组合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是对Reader和Writer接口的组合,
  • 三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
Top