【QCon】精华内容上线92%,全面覆盖“人工智能+”的典型案例!>>> 了解详情
写点什么

如何通过几行 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/


公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2019-12-19 17:138892
用户头像
张之栋 前InfoQ编辑

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

关注

评论

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

28天瞎写的第二百三十五天:客服得有多专业?

树上

28天写作

产品经理训练营作业 02

KingSwim

京东支付SDK重构设计与实现

京东数科风险算法与技术

翻译:《实用的Python编程》README

codists

Python

「产品经理训练营」作业03:利益相关方识别

狷介

产品经理训练营

硬核!八张图搞懂 Flink 端到端精准一次处理语义 Exactly-once(深入原理,建议收藏)

五分钟学大数据

大数据 flink

学习计算机视觉

IT蜗壳-Tango

OpenCV 计算机视觉 2月春节不断更

《学会写作》学习笔记之如何拟标题

JiangX

28天写作

批判性思维自修课(六)

石君

28天写作 批判性思维

产品训练营-作业3

简小一

极客大学·产品经理训练营·第二章作业(二)

二大爷

极客大学 产品训练营

架构训练营大作业(二)

一期一会

区块链在数字版权领域的应用发展报告(2020)

CECBC

版权保护

翻译:《实用的Python编程》00_Setup

codists

Python

架构师训练营第十周作业

zamkai

被接连封杀后,出海的“TikTok们”都打算如何做?

李忠良

28天写作

图解计算机结构与体系分类!!

冰河

编程 程序员 高并发 计算机结构 操作系统原理

看完字节大佬的算法刷题宝典,我直接手撕了500道算法算法题

程序员 面试 算法

【LeetCode】子集问题debug模式查看数据变化

Albert

算法 LeetCode 2月春节不断更

Spring - IOC

小马哥

Java 架构师 spring 5 七日更

为啥写的mybatis插件没用?一场mybatis插件加载机制的探索之旅

altantisor

spring Boot Starter mybatis源码

中国为什么加快推进数字人民币

CECBC

数字货币

分页方式,看这一篇就够了。

大伟

分页

一文看完TCP/IP协议基础知识点

精美的淘客项目完全开源啦,确定不来围观吗

Silently9527

Vue mybatis springboot uniapp

产品训练营第三次作业

Geek_79e983

静默安装Oracle也没那么恐怖

MySQL从删库到跑路

oracle

不会开发的你也能管理好企业漏洞,开源免费工具:洞察(insight II)

BigYoung

安全 安全漏洞 28天写作 2月春节不断更

管理笔记[4]:组织管理的目标就是实现1+1>2

L3C老司机

架构训练营大作业(一)

一期一会

Java并发包源码学习系列:阻塞队列实现之SynchronousQueue源码解析

Java 编程

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