当前位置:首页 > 技术分析 > 正文内容

Elasticsearch遇上BERT:使用Elasticsearch和BERT构建搜索引擎

ruisui883个月前 (03-29)技术分析21

作者:Hironsan

编译:ronghuaiyang

导读

强强联合,看看是否能有1+1>2的效果。

在这篇文章中,我们使用一个预先训练好的BERT模型和Elasticsearch来构建一个搜索引擎。Elasticsearch最近发布了带有矢量字段的文本相似性搜索。另一方面,你可以使用BERT将文本转换为固定长度的向量。一旦我们通过BERT将文档转换成向量并存储到Elasticsearch中,我们就可以使用Elasticsearch和BERT搜索类似的文档。

本文使用Elasticsearch和BERT按照以下架构实现了一个搜索引擎。这里,我们使用Docker将整个系统划分为三个部分:application, BERT和Elasticsearch。这样做的目的是为了更容易地扩展每个服务。

我在这篇文章中只展示了重要的部分,整个系统都在docker-compose.yaml中。在以下的GitHub存储库中:
https://github.com/Hironsan/bertsearch。

1. 下载预训练BERT模型

首先,下载一个预先训练好的BERT模型。以下命令是下载英文版本的例子:

$ wget https://storage.googleapis.com/bert_models/2018_10_18/cased_L-12_H-768_A-12.zip
$ unzip cased_L-12_H-768_A-12.zip

2. 设置环境变量

你需要设置一个预先训练好的BERT模型和Elasticsearch的索引名作为环境变量。这些变量在Docker容器中使用。下面的示例将jobsearch指定为索引名,以及./cased_L-12_H-768_A-12为模型路径:

$ export PATH_MODEL=./cased_L-12_H-768_A-12
$ export INDEX_NAME=jobsearch

3. 启动Docker容器

现在,我们使用Docker compose来启动Docker容器。这里要启动三个容器:application容器、BERT容器和Elasticsearch容器。

$ docker-compose up

注意,我建议你分配更多的内存(超过8GB)给Docker。因为BERT容器需要大内存。

4. 创建Elasticsearch索引

您可以使用create index API向Elasticsearch集群添加新的索引。创建索引时,你可以指定以下内容:

  • 设置索引
  • 索引中字段的映射
  • 索引别名

例如,如果你想创建带有“title”、“text”和“text_vector”字段的“jobsearch”索引,可以通过以下命令创建索引:

$ python example/create_index.py --index_file=example/index.json --index_name=jobsearch
# index.json
{
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 1
  },
  "mappings": {
    "dynamic": "true",
    "_source": {
      "enabled": "true"
    },
    "properties": {
      "title": {
        "type": "text"
      },
      "text": {
        "type": "text"
      },
      "text_vector": {
        "type": "dense_vector",
        "dims": 768
      }
    }
  }
}

注意:text_vector 的dims值必须与预先训练的BERT模型的dims匹配。

5. 创建文档

一旦创建了索引,就可以为某个文档建立索引了。这里的要点是使用BERT将文档转换为向量。得到的向量存储在text_vector字段中。让我们把你的数据转换成一个JSON文档:

$ python example/create_documents.py --data=example/example.csv --index_name=jobsearch
# example/example.csv
"Title","Description"
"Saleswoman","lorem ipsum"
"Software Developer","lorem ipsum"
"Chief Financial Officer","lorem ipsum"
"General Manager","lorem ipsum"
"Network Administrator","lorem ipsum"

脚本执行完成后,可以得到如下的JSON文档:

# documents.jsonl
{"_op_type": "index", "_index": "jobsearch", "text": "lorem ipsum", "title": "Saleswoman", "text_vector": [...]}
{"_op_type": "index", "_index": "jobsearch", "text": "lorem ipsum", "title": "Software Developer", "text_vector": [...]}
{"_op_type": "index", "_index": "jobsearch", "text": "lorem ipsum", "title": "Chief Financial Officer", "text_vector": [...]}
...

6. 索引文档

将数据转换成JSON后,可以向指定的索引添加一个JSON文档,并使其可搜索。

$ python example/index_documents.py

7. 打开浏览器

打开http://127.0.0.1:5000,下面是一个搜索job的例子。你可以看到,“I’m looking for a lawyer” 的query返回的是“Legal assistant”以及 “Lawyer”。

总结

在这篇文章中,我们使用Elasticsearch和BERT实现了搜索引擎。虽然BERT的执行速度存在问题,但是像这样将BERT作为一个独立的容器来处理很容易扩展,所以我认为这个问题是可以解决的。我希望这篇文章对你有用。

英文原文:
https://towardsdatascience.com/elasticsearch-meets-bert-building-search-engine-with-elasticsearch-and-bert-9e74bf5b4cf2

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3126.html

标签: bert词向量
分享给朋友:

“Elasticsearch遇上BERT:使用Elasticsearch和BERT构建搜索引擎” 的相关文章

教培收费管理系统有哪些?

大部分培训机构走上正轨后,随着学员数量不断增长,各种业务和课程报名费用项目逐渐增多,如果还是采用传统的人工收费,就势必会出现算错账或收支对不上的问题。此时,再去查询哪里出了问题是一件非常难的事情。因此,很多培训机构都会使用机构收费系统。那培训机构收费系统有哪些呢?校宇宙是一款适合培训学校内部使用的信...

K8S NFS 共享存储

NFS 共享存储前面我们学习了 hostPath 与 Local PV 两种本地存储方式,但是平时我们的应用更多的是无状态服务,可能会同时发布在不同的节点上,这个时候本地存储就不适用了,往往就需要使用到共享存储了,比如最简单常用的网络共享存储 NFS,本节课我们就来介绍下如何在 Kubernetes...

html5+css3做的响应式企业网站前端源码

大家好,今天给大家介绍一款,html5+css3做的响应式企业网站前端源码 (图1)。送给大家哦,获取方式在本文末尾。首页banner幻灯片切换特效(图2)首页布局简约合理(图3)关于我们页面(图4)商品列表(图5)商品详情(图6)服务介绍(图7)新闻列表(图8)联系我们(图9)源码完整,需要的朋友...

有效地简化导航-Part 1:信息架构

「四步走」——理想的导航系统要做一个可用的导航系统,网页设计师必须按顺序回答以下4个问题:1. 如何组织内容?2. 如何解释导航的选项?3. 哪种导航菜单最适合容纳这些选项?4. 如何设计导航菜单?前两个问题关注构建和便签内容,通常称为信息架构。信息架构师通常用网站地图(site map diagr...

Vue Router 4 路由操作 - 路由导航

路由导航分为 声明式导航 和 编程式导航。通过 <router-link to="..."> 标签跳转的方式为声明式导航。通过 路由实例对象(router.push(...))跳转的为编程式导航。导航到不同的位置想要导航到不同的URL,使用 router.push 方法。...

微信小程序发展越来越快,Flutter应用开发越来越低效?

目前的疑惑微信小程序发展的越来越快,目前小程序甚至取代了大部分 App 的生态位,公司的坑位不增反降,只能让原生应用开发兼顾或换岗进行小程序的开发。以我的实际情况来讲,公司应用采用的 Flutter 框架,同样的功能不可避免的就会存在 Flutter 应用开发和微信小程序开发兼顾的情况,这种重复造轮...