搜索引擎主题模型优化( 让你在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

  它还有很多其他用途,这里就不一一介绍了,大家可以去官方文档学习:

  觉得还不错就给我一个小小的鼓励吧!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线