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

1. BERT 语义相似度

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

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

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

步骤如下:

安装 bert-as-service 的服务端和客户端。

预训练 BERT 模型。

客户端编写代码请求服务端得到句向量。

句子与句子向量之间计算相似度,并返回 top_k 个结果。

2. 安装 bert-as-service环境要求:

Python版本 >= 3.5,Tensorflow版本 >= 1.10

(本人环境,Python = 3.7 Tensorflow = 1.13.1)

安装服务端和客户端

1pip install -U bert-serving-server bert-serving-client

3. 启动 BERT 服务下载预训练模型

Google AI发布的经过预训练的BERT模型。这里我们下载 BERT-Base, Chinese,12-layer, 768-hidden, 12-heads, 110M parameters。

启动服务

解压缩后,运行如下命令进行启动,目录换成解压后的路径。(-num_worker指定使用多少个CPU)

1bert-serving-start -model_dir /Users/mantch/Downloads/chinese_L-12_H-768_A-12 -num_worker=4

运行后会看到如下结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19http_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 等端口号信息。

如果显示以下信息就表示可以使用了

1

2

3

4

5I: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. 相似度计算数据集

我们使用蚂蚁金服语义相似度比赛的一份数据集,该数据集分为 4 列,第一列是索引,第二列和第三列是句子,第四列中的 1 表示这两个句子是同义句,否则表示为 0。

编写代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37import 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')))

QRcode.gif

python词组语义相似度_【NLP】BERT语义相似度计算相关推荐

  1. python余弦相似度_推荐系统01--余弦相似度

    今天,我们来聊聊协同过滤中的相似度计算方法有哪些. 相似度的本质 推荐系统中,推荐算法分为两个门派,一个是机器学习派,另一个就是相似度门派.机器学习派是后起之秀,而相似度派则是泰山北斗,以致撑起来推荐 ...

  2. java 圈复杂度_详解圈复杂度

    详解圈复杂度 圈复杂度概念 圈复杂度(Cyclomatic complexity,简写CC)也称为条件复杂度,是一种代码复杂度的衡量标准.由托马斯·J·麦凯布(Thomas J. McCabe, Sr ...

  3. java能测圈复杂度_[Java教程]圈复杂度

    [Java教程]圈复杂度 0 2015-12-02 13:00:42 Cyclomatic Complexity 1. 概念 a. 圈复杂度是一种衡量代码复杂程度的标准. b. 圈复杂度高的害处: 圈 ...

  4. 基于python的风险管理方式属于_张家港高校邦_Python科学计算_网课答案

    张家港高校邦_Python科学计算_网课答案3rh4 张家港高校邦_Python科学计算_网课答案 关注公众号{帅搜}即可查询答案 支持:大学网课,智慧树,知到,超星,尔雅,学习通,选修课,公务员,外 ...

  5. fastreport 旋转90度_水冷必不可少之90度弯头

    点击蓝字关注我们 设计于Bitspower而言 是生活,专注当下,发现需求迎合需求 是呼吸,将持续在道上,创新永不止步 BP所研发的水冷接头一直以来是众多玩家认可的逸品,兼具质感与特色,赋予水冷无限可 ...

  6. 怎么计算信息完整度_德阳冻货运镖怎么计算费用

    德阳冻货运镖怎么计算费用 物流"一词我们并不陌生,它把小到零食玩具.大到家用电器,一一送到我们手中,但传统的物流运输模式只能满足部分物品的运输要求.随着人们的生活品质不断提高.消费不断升级. ...

  7. java 华氏度_在Java中将华氏度转换为摄氏温度[重复] - java

    This question already has answers here: Double value returns 0 [duplicate] (3个答案) 6年前关闭. 我正在尝试将华氏度转换 ...

  8. 圆为什么规定一定是360度_为什么圆是360度

    展开全部 圆的360度是美索不62616964757a686964616fe78988e69d8331333431363032达比亚人首创的,绵延6000多年,并一直延续至今. 大约在6000年前,美 ...

  9. 圆为什么规定一定是360度_圆为什么是360度?不一样的趣味知识,让你痴迷数学...

    圆在数学里面是一种几何图形,同时也是十分奇妙的形状.早在人类学会使用工具的时候,就开始接触圆了,利用石器在墙上凿的小孔,大多数都是圆形的:学会制作陶器以后,陶瓷包括碗.碟子.花瓶等等,陶瓷的底部基本都 ...

  10. java降低if的圈复杂度_如何降低圈复杂度?

    我正在研究将RequestDTO发送到Web服务的类.我需要先验证请求,然后再发送. 可以从3个不同的地方发送请求,每个" requesttype"都有不同的验证规则,例如requ ...

最新文章

  1. 切换分支 更改只影响当前分支代码_idea 中分支管理操作的意思
  2. MASM + DOSBox——debug时g命令卡死解决方案
  3. ubantu实现linux命令的实验_C语言实现linux命令---ls
  4. 如何在 ASP.NET CORE 中获取客户端 IP ?
  5. 第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)
  6. Logstash+elasticsearch+elastic+nignx
  7. python raise用处_python基础教程python raise的基本使用
  8. spring配置文件中id与name
  9. win11虚拟机如何安装 Windows11虚拟机安装步骤教程
  10. All boundaries are conventions, waiting to be transcended.
  11. [转]ASP.NET在线用户列表精确版—解决用户意外退出在线列表无法及时更新问
  12. 计算机密码突然不正确,win10开机密码明明正确,win10密码突然不对了
  13. Algorithms Lecture 1 -- Introduction to asymptotic notations【渐进表示法】​​
  14. 中国甲鱼养殖行业发展现状分析,浙江省产量最高「图」
  15. SQL 求同比 环比
  16. java 找不到或无法加载主类 test_JAVA报找不到或无法加载主类的错误
  17. 元宇宙专题001 | 他们居然将元宇宙和心理学写到一起了
  18. establish connection
  19. windows 7 数据执行保护 开启关闭方法
  20. 计算机专业去,计算机专业去哪个学校_西信院

热门文章

  1. CentOS 6.5开放端口与查看端口状态
  2. python123怎么绑定慕课_python学习30——绑定方法与非绑定方法
  3. 用 Markdown 写炫酷简历,助力跳槽换工作
  4. Flask一个页面多个form提交的问题及解决方法
  5. 2022年华为ICT大赛 全球总决赛!中文综合任务书-网络赛道真题!
  6. 亚马逊签约第五届进博会;黑芝麻智能与MAXIEYE达成合作;新思科技与达索系统合作打造业界首个整体照明设计平台 | 全球TMT...
  7. java计算机毕业设计婚恋网站源码+mysql数据库+系统+lw文档+部署
  8. zabbix 图形是点状的_Zabbix与RRDtool绘图篇(0)_图形展示二次开发构思
  9. 你的微笑,温暖了我的苍凉
  10. Linux设备驱动程序 三 字符设备驱动