前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BERT实现QA中的问句语义相似度计算

BERT实现QA中的问句语义相似度计算

作者头像
mantch
发布2020-03-18 20:38:22
2.2K0
发布2020-03-18 20:38:22
举报

文章目录
  • 1. BERT 语义相似度
  • 2. 安装 bert-as-service
  • 3. 启动 BERT 服务
  • 4. 相似度计算

1. BERT 语义相似度

BERT的全称是Bidirectional Encoder Representation from Transformers,是Google2018年提出的预训练模型,即双向Transformer的Encoder,因为decoder是不能获要预测的信息的。模型的主要创新点都在pre-train方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。

有一个这样的场景,QA对话系统,希望能够在问答库中找到与用户问题相似的句子对,然后把答案返回给用户。这篇就是要解决这个问题的。

关于 BERT 的原理知识请访问: http://mantchs.com/2019/09/28/NLP/BERT/

下面介绍一个封装好的 BERT 工具,利用该工具能够快速的得到词向量表示。该工具的名称叫做: bert-as-service,从名称就可以看出作者是把 BERT 作为一种服务了,只要调用该服务就能够得到我们想要的向量表示,得到向量以后,就可以通过余弦相似度的计算公式计算向量之间的相似度。

bert-as-service 源码详见: https://github.com/hanxiao/bert-as-service

bert-as-service 使用文档: https://bert-as-service.readthedocs.io/en/latest/index.html

步骤如下:

  1. 安装 bert-as-service 的服务端和客户端。
  2. 预训练 BERT 模型。
  3. 客户端编写代码请求服务端得到句向量。
  4. 句子与句子向量之间计算相似度,并返回 top_k 个结果。

2. 安装 bert-as-service

  1. 环境要求: Python版本 >= 3.5,Tensorflow版本 >= 1.10 (本人环境,Python = 3.7 Tensorflow = 1.13.1)
  2. 安装服务端和客户端 pip install -U bert-serving-server bert-serving-client

3. 启动 BERT 服务

  1. 下载预训练模型 Google AI发布的经过预训练的BERT模型。这里我们下载 BERT-Base, Chinese,12-layer, 768-hidden, 12-heads, 110M parameters。 链接: https://pan.baidu.com/s/1jJudiTj__vbFb0WkEQUxWw 密码:mf4p
  2. 启动服务 解压缩后,运行如下命令进行启动,目录换成解压后的路径。(-num_worker指定使用多少个CPU) bert-serving-start -model_dir /Users/mantch/Downloads/chinese_L-12_H-768_A-12 -num_worker=4 运行后会看到如下结果: http_max_connect = 10 http_port = None mask_cls_sep = False max_batch_size = 256 max_seq_len = 25 model_dir = /Users/mantch/Downloads/chinese_L-12_H-768_A-12 no_position_embeddings = False no_special_token = False num_worker = 4 pooling_layer = [-2] pooling_strategy = REDUCE_MEAN port = 5555 port_out = 5556 prefetch_size = 10 priority_batch_size = 16 show_tokens_to_client = False tuned_model_dir = None verbose = False xla = False 其中就已经显示了port = 5555,port_out = 5556 等端口号信息。 如果显示以下信息就表示可以使用了 I:WORKER-0:[__i:gen:559]:ready and listening! I:WORKER-3:[__i:gen:559]:ready and listening! I:WORKER-1:[__i:gen:559]:ready and listening! I:WORKER-2:[__i:gen:559]:ready and listening! I:VENTILATOR:[__i:_ru:164]:all set, ready to serve request!

4. 相似度计算

  1. 数据集 我们使用蚂蚁金服语义相似度比赛的一份数据集,该数据集分为 4 列,第一列是索引,第二列和第三列是句子,第四列中的 1 表示这两个句子是同义句,否则表示为 0。 数据集下载地址: https://www.lanzous.com/ia9dg8b
  2. 编写代码 import pandas as pd import numpy as np from bert_serving.client import BertClient from termcolor import colored num = 100 # 采样数 topk = 5 # 返回 topk 个结果 # 读取数据集 sentence_csv = pd.read_csv('atec_nlp_sim_train_all.csv', sep='\t', names=['idx', 's1', 's2', 'label']) sentences = sentence_csv['s1'].tolist()[:num] print('%d questions loaded, avg.len %d' % (len(sentences), np.mean([len(d) for d in sentences]))) with BertClient(port=5555, port_out=5556) as bc: # 获取句子向量编码 doc_vecs = bc.encode(sentences) while True: query = input(colored('your question:', 'green')) query_vec = bc.encode([query])[0] # 余弦相似度 分数计算。 # np.linalg.norm 是求取向量的二范数,也就是向量长度。 score = np.sum(query_vec * doc_vecs, axis=1) / np.linalg.norm(doc_vecs, axis=1) ''' argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引) [::-1]取从后向前(相反)的元素, 例如[ 1 2 3 4 5 ] 则输出为[ 5 4 3 2 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(sentences[idx], 'yellow')))
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. BERT 语义相似度
  • 2. 安装 bert-as-service
  • 3. 启动 BERT 服务
  • 4. 相似度计算
相关产品与服务
腾讯智能对话平台
腾讯智能对话平台(Tencent Bot Platform,TBP)专注于“对话即服务”的愿景,全面开放腾讯对话系统核心技术,为大型企业客户、开发者和生态合作伙伴提供开发平台和机器人中间件能力,实现便捷、低成本构建人机对话体验和高效、多样化赋能行业。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档