写点什么

如何通过几行 Python 代码,使用 BERT 进行词嵌入?

  • 2019-12-19
  • 本文字数:2015 字

    阅读完需:约 7 分钟

如何通过几行 Python 代码,使用BERT进行词嵌入?

在自然语言处理领域中,诞生于 2018 年末的 BERT 非常的“火热”。强悍如 BERT,在十多项 NLP 的任务上强势屠榜,业界声称 BERT 将开创自然语言处理领域新的纪元。在本文中,作者 Anirudh_S 将展示如何只使用几行 Python 代码,就可以使用深度学习自然语言处理模型(BERT)将单词嵌入到向量中。


本文最初发表于 Towards Data Science,经原作者 Anirudh_S 授权,InfoQ 中文站翻译并分享。

词嵌入:它们是什么?

在自然语言处理领域中,以向量形式或词嵌入表示单词或句子的方式,为各种潜在应用打开了大门。这种将单词编码为向量的函数,对自然语言处理任务来说是一个强大的工具,例如计算单词之间的语义相似度,人们可以用来构建语义搜索引擎,就像Google 将 BERT 应用于搜索一样。可以说,BERT 是最强大的语言模型之一,在机器学习社区中非常流行。


BERT(Bidirectional Encoder Representations from Transformers)模型已使用大型句子语料库进行预训练。简而言之,训练是通过在一个句子中对一些单词进行掩码(根据论文作者的说法,大约为 15% 的单词),然后让模型去预测那些被掩码的单词。随着模型的预测训练,它学会了生成一个强大的单词内部表示,即词嵌入(Word embedding)。今天,我们将介绍如何轻松地构建并运行 BERT 模型,并将单词编码为词嵌入。

BERT 词嵌入模型设置

有一组可用的选项来运行带 Python 和 TensorFlow 的 BERT 模型。但是,为了能够让你非常容易地获得 BERT 模型,我们将使用一个 Python 库,它可以帮助我们立即进行设置!


Bert-as-a-service(意为 BERT 即服务)是一个 Python 库,它使我们能够在本地机器上部署预训练 BERT 模型并运行推理。它可以用于服务任何已发布的模型类型,甚至也可以服务于针对特定下游任务进行微调的模型。此外,它还需要后端的 TensorFlow 与预训练模型一起工作。因此,我们将继续在控制台中安装 TensorFlow 1.15。


pip3 install tensorflow-gpu==1.15
复制代码


接下来,我们将安装 Bert-as-a-service 客户端和服务器。同样,这个库并不支持 Python 2。因此,你要确保已经安装的是 Python 3.5 或更高版本。


pip3 install -U bert-serving-server bert-serving-client
复制代码


BERT 服务器将模型部署在本地机器上,客户端可以订阅它。此外,可以在同一台计算机上安装这两样,也可以在一台机器上部署服务器并从另一台计算机订阅。安装完成之后,下载你选择的 BERT 模型。你可以点击此链接来找到所有模型的列表。

部署模型

现在,初始设置已经完成,让我们使用以下命令启动模型服务。


bert-serving-start -model_dir /path_to_the_model/ -num_workers=1
复制代码


例如,如果模型名称为 uncased_L-24_H-1024_A-16,且它位于 “/model” 目录中,那么,命令如下所示:


bert-serving-start -model_dir /model/uncased_L-24_H-1024_A-16/ -num_workers=1
复制代码


其中, “num_workers” 参数用于初始化服务器可以处理的并发请求的数量。但是,我们只需设置 num_workers=1 就可以了,因为我们只是在单个客户端上使用我们的模型。如果要部署多个客户端进行订阅的话,请相应为 “num_workers” 参数进行设置。

使用 BERT 客户端订阅

我们可以运行一个 Python 脚本,使用 BERT 服务将我们的单词编码成词嵌入。有鉴于此,我们只需导入 BERT-client 库并创建客户端类的实例。完成这一步后,我们就可以提供想要编码的单词或句子的列表。


from bert-serving.client import BertClient()client = BertClient()vectors = client.encode([ “dog” ],[ “cat” ],[ “man” ])
复制代码


我们应该将想要编码的单词作为 Python 列表提供。上面,我给出了三个列表,每个列表都有一个单词。因此, “vectors” 对象的形状为 (3,embedding_size)。通常,嵌入大小是 BERT 模型编码的词向量的长度。实际上,它将任意长度的单词编码为一个恒定长度的向量。但是,不同的 BERT 模型可能会有所不同。

计算词之间的相似度

到现在为止,一切都还不错!对于那些只是一些数字的向量该怎么处理呢?正如前所述,这些向量表示单词在 1024 维超空间(对此模型 uncased_L-24_H-1024_A-16 而言为 1024)中的编码位置。此外,通过某种相似性函数比较不同词的向量有助于确定它们之间的关联程度。


余弦相似度(Cosine similarity)就是这样的一个函数,它给出的相似度得分在 0.0 到 1.0 之间。在这种情况下,1.0 表示单词意思相同(100% 匹配),而 0.0 表示它们完全不同。下面是词嵌入之间余弦相似性的 scikit-learn 实现。


from sklearn.metrics.pairwise import cosine_similaritycos_lib = cosine_similarity(vectors[1,:],vectors[2,:]) #similarity between #cat and dog
复制代码

完成 BERT 词嵌入

你还可以输入整条句子,而不是单个单词,服务器会处理它。词嵌入可以通过多种方式集合在一起,形成连接(concatenation)这样的句子嵌入。


作者介绍:


Anirudh_S,仪表工程师,热衷于机器人、人工智能、机器学习和自主系统。


原文链接:


https://hackerstreak.com/word-embeddings-using-bert-in-python/


2019-12-19 17:1311384
用户头像
张之栋 前InfoQ编辑

发布了 91 篇内容, 共 51.9 次阅读, 收获喜欢 159 次。

关注

评论

发布
暂无评论
发现更多内容

博睿数据获评2024中国智能运维领域“最具商业合作价值企业”

博睿数据

TiDB br日志备份PermissionDenied

TiDB 社区干货传送门

实践案例 备份 & 恢复

冲一下深信服,好像有点简单?

王中阳Go

Go 面试

为什么要开发海外电商代购系统?

科普小能手

系统开发 电商系统 海外代购系统 代购系统 代购商城系统

华测检测拟投资常州红海公司,布局电动自行车检测热门增长赛道

财见

ORN Ventures获得5,000万美元A轮融资

财见

e&宣布2024年Q3收益,合并收入增长10%,达到144亿迪拉姆

财见

TiDB数据库出现性能问题,如何利用数据库性能诊断工具DBdoctor一分钟诊断!

TiDB 社区干货传送门

性能调优 实践案例 管理与运维 安装 & 部署 应用适配

管理者应该具备的几点认知

老张

团队管理 技术管理 职场晋升

PME算法基础及其Python实现

代码忍者

HarmonyOS 5.0应用开发——用户文件操作

高心星

鸿蒙 HarmonyOS 鸿蒙5.0 HarmonyOS NEXT

上海HR+AI智慧人才港启动,中国人力资本发展大会点亮数字化转型之路

财见

“观测先锋 · 2024 可观测平台创新应用案例大赛“评审团亮相,奖项权益再升级!

博睿数据

Pandabuy案例分享:微店商品详情数据接口对接反向海淘的成功实践

tbapi

淘宝代购集运系统 Pandabuy 反向海淘系统

资源利用率提高30%,揭秘华为云Serverless高效、高密度调度优化原理

华为云开发者联盟

资源调度 #Serverless #云原生 华为云FunctionGraph

知乎 PB 级数据:超大规模TiDB集群管控实践

TiDB 社区干货传送门

实践案例 集群管理 数据库架构设计 HTAP 场景实践

Merge-region 原理及常见问题

TiDB 社区干货传送门

故障排查/诊断

Java如何实现企业微信审批流程

威哥爱编程

Java 微信 企业微信开发

企业数字化转型:你的企业处于哪个发展阶段?

积木链小链

数字化转型 数字化 数字化平台

YMatrix 6.0 正式发布: 下一代实时分析数仓

YMatrix 超融合数据库

数据库 数据仓库 流计算 YMatrix 实时分析

探讨Java深搜算法的学习笔记

威哥爱编程

Java 算法 DFS

软件测试学习笔记丨Flask操作数据库-数据库和表的管理

测试人

软件测试

TiDB 集群组件间开启 TLS(双向认证

TiDB 社区干货传送门

7.x 实践

TiDB Vector 本地部署体验

TiDB 社区干货传送门

8.x 实践 TiDB Cloud TiDB Vector

TiKV Raft Store 内存管理的原理与实现丨TiKV 源码解读(二十三)

TiDB 社区干货传送门

Rust 在 Android 的编程实践——技术驱动的车云一体化解决方案探索

Greptime 格睿科技

android rust 时序数据库 车云

如何通过几行 Python 代码,使用BERT进行词嵌入?_AI&大模型_Anirudh_S_InfoQ精选文章