<返回首页

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

2024-04-29 12:35:50  微信公众号  Python实用宝典
加入收藏

鼎鼎大名的 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 详细指南。

请选择以下任一种方式输入命令安装依赖: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.5,Tensorflow >= 1.10 。

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

也可在Python实用宝典后台回复 bert-as-service 下载这些预训练好的模型。

下载完成后,将 zip 文件解压到某个文件夹中,例如 /tmp/uncased_L-24_H-1024_A-16/.

2.Bert-as-service 基本使用

安装完成后,输入以下命令启动BERT服务:

bert-serving-start -model_dir /tmp/uncased_L-24_H-1024_A-16/ -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列表其实就是官方文档的readme.md, 在我提供的下载链接里也附带了。

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.

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 对模型进行微调,比如这个例子:

https://github.com/google-research/bert#sentence-and-sentence-pair-classification-tasks

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
推荐信息
 
抖音如何撰写吸睛标题
 
Python图像处理库OpenCV入门教程:实践与构建
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器...
 
微服务架构最佳实践-方法篇
 
揭秘 Python 江湖中的15个冷门但超能模块
 
数据库为啥要融合+AI化?甲骨文Oracle 23ai给出了回答
 
一招教你解决页面中关联id的转换
在工作中,我们经常有这样的业务情况,实体间通过id实现数据业务上的关联,比如订...
 
SQL实用技巧-行列转换
 
Spring注入还可以这样玩!涨知识了
假设你有两个 CommonDAO bean,每个都需要在不同的环境中使用。这时,你可以使...
 
GPT-4o:实现跨越文本与视觉的智能交互
 
北京被曝小升初“掐尖招生”,北京教委:两校违反阳光招生要求被约谈,责成
 
DIY从入门到放弃:CPU主频/倍频/睿频/超频别迷糊
不管手机还是电脑,我们都知道CPU性能的重要性,作为核心组件,CPU决定了整机的性...
 
《DNF》手游将于5月21日正式上线 迪丽热巴代言
 
腾讯市值已达阿里两倍多!原因何在
 
苹果回应更新iOS 17.5恢复已删除多年照片:不用担心自己隐私安全
 
仅7地住房限购 北上广深会全面取消吗?
每经记者 甄素静 每经编辑 陈梦妤 据诸葛数据研究中心不完全统计,截至目前,全...
 
“国家队”出手收储房产,楼市格局真的要变了?
 
30年期超长期特别国债,今天正式首发,个人投资者能买吗?一文看懂
 
OpenAI与Reddit建立合作伙伴关系,利用其内容训练人工智能
 
Q1营收增速放缓,百度苦寻新引擎
 
不再区分一本、二本 江西2024年将首次迎来新高考
新京报讯 根据教育部统一部署,江西省作为全国第四批启动高考综合改革的7省(区...
返回栏目