Elasticsearch:多语言语义搜索

news2024/11/17 3:45:27

在此示例中,我们将使用多语言嵌入模型 multilingual-e5-base 对混合语言文档的 toy 数据集执行搜索。 使用这个模型,我们可以通过两种方式进行搜索:

  • 跨语言,例如使用德语查询来查找英语文档
  • 在非英语语言中,例如使用德语查询来查找德语文档

虽然此示例仅使用密集检索,但也可以将密集检索和传统词汇检索与混合搜索相结合。 有关词法多语言搜索的更多信息,请参阅博客文章 “在 Elasticsearch 中使用语言识别进行多语言搜索”。

使用的数据集包含 MIRACL 数据集的维基百科段落片段。

安装

Elasticsearch 及 Kibana

如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考如下的链接来进行安装:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

在安装的时候,我们可以选择 Elastic Stack 8.x 的安装指南来进行安装。在本博文中,我将使用最新的 Elastic Stack 8.10 来进行展示。

在安装 Elasticsearch 的过程中,我们需要记下如下的信息:

Python 安装包

在本演示中,我们将使用 Python 来进行展示。我们需要安装访问 Elasticsearch 相应的安装包 elasticsearch:

pip install elasticsearch
pip install sentence_transformers
pip install torch

我们将使用 Jupyter Notebook 来进行展示。

$ pwd
/Users/liuxg/python/elser
$ jupyter notebook

创建应用并演示

初始化及连接 Elasticsearch

import getpass
import textwrap
import torch

from elasticsearch import Elasticsearch
from sentence_transformers import SentenceTransformer

device = "cuda" if torch.cuda.is_available() else "cpu"

model = SentenceTransformer("intfloat/multilingual-e5-base", device=device)

然后我们创建一个客户端对象来实例化 Elasticsearch 类的实例。

ELASTCSEARCH_CERT_PATH = "/Users/liuxg/elastic/elasticsearch-8.10.0/config/certs/http_ca.crt"
 
client = Elasticsearch(  ['https://localhost:9200'],
    basic_auth = ('elastic', 'vXDWYtL*my3vnKY9zCfL'),
    ca_certs = ELASTCSEARCH_CERT_PATH,
    verify_certs = True)
print(client.info())

使用所需的映射创建 Elasticsearch 索引

我们需要添加一个字段来支持密集向量存储和搜索。 注意下面的 passage_embedding 字段,它用于存储 passage字段的密集向量表示。

# Define the mapping
mapping = {
    "mappings": {
        "properties": {
            "language": {"type": "keyword"},
            "id": {"type": "keyword"},
            "title": {"type": "text"},
            "passage": {"type": "text"},
            "passage_embedding": {
                "type": "dense_vector",
                "dims": 768,
                "index": "true",
                "similarity": "cosine"
            }
        }
    }
}

# Create the index (deleting any existing index)
client.indices.delete(index="articles", ignore_unavailable=True)
client.indices.create(index="articles", body=mapping)

摄入数据

让我们索引一些数据。 请注意,我们使用 sentence transformer 模型嵌入 passage 字段。 建立索引后,你将看到文档包含一个 passage_embedding 字段(“type”:“dense_vector”),其中包含浮点值向量。 这就是 passage 字段在向量空间中的嵌入。 我们将使用该字段使用 kNN 执行语义搜索。

articles = [
    {
        "language": "en",
        "id": "1643584#0",
        "title": "Bloor Street",
        "passage": """Bloor Street is a major east–west residential and commercial thoroughfare in Toronto, Ontario, Canada. Bloor Street runs from the Prince Edward Viaduct, which spans the Don River Valley, westward into Mississauga where it ends at Central Parkway. East of the viaduct, Danforth Avenue continues along the same right-of-way. The street, approximately long, contains a significant cross-sample of Toronto's ethnic communities. It is also home to Toronto's famous shopping street, the Mink Mile.""",
    },
    {
        "language": "en",
        "id": "2190499#0",
        "title": "Elphinstone College",
        "passage": """Elphinstone College is an institution of higher education affiliated to the University of Mumbai. Established in 1856, it is one of the oldest colleges of the University of Mumbai. It is reputed for producing luminaries like Bal Gangadhar Tilak, Bhim Rao Ambedkar, Virchand Gandhi, Badruddin Tyabji, Pherozshah Mehta, Kashinath Trimbak Telang, Jamsetji Tata and for illustrious professors that includes Dadabhai Naoroji. It is further observed for having played a key role in spread of Western education in the Bombay Presidency.""",
    },
    {
        "language": "en",
        "id": "8881#0",
        "title": "Doctor (title)",
        "passage": """Doctor is an academic title that originates from the Latin word of the same spelling and meaning. The word is originally an agentive noun of the Latin verb "" 'to teach'. It has been used as an academic title in Europe since the 13th century, when the first Doctorates were awarded at the University of Bologna and the University of Paris. Having become established in European universities, this usage spread around the world. Contracted "Dr" or "Dr.", it is used as a designation for a person who has obtained a Doctorate (e.g. PhD). In many parts of the world it is also used by medical practitioners, regardless of whether or not they hold a doctoral-level degree.""",
    },
    {
        "language": "de",
        "id": "9002#0",
        "title": "Gesundheits- und Krankenpflege",
        "passage": """Die Gesundheits- und Krankenpflege als Berufsfeld umfasst die Versorgung und Betreuung von Menschen aller Altersgruppen, insbesondere kranke, behinderte und sterbende Erwachsene. Die Gesundheits- und Kinderkrankenpflege hat ihren Schwerpunkt in der Versorgung von Kindern und Jugendlichen. In beiden Fachrichtungen gehört die Verhütung von Krankheiten und Gesunderhaltung zum Aufgabengebiet der professionellen Pflege.""",
    },
    {
        "language": "de",
        "id": "7769762#0",
        "title": "Tourismusregion (Österreich)",
        "passage": """Unter Tourismusregion versteht man in Österreich die in den Landestourismusgesetzen verankerten Tourismusverbände mehrerer Gemeinden, im weiteren Sinne aller Gebietskörperschaften.""",
    },
    {
        "language": "de",
        "id": "2270104#0",
        "title": "London Wall",
        "passage": """London Wall ist die strategische Stadtmauer, die die Römer um Londinium gebaut haben, um die Stadt zu schützen, die über den wichtigen Hafen an der Themse verfügte. Bis ins späte Mittelalter hinein bildete diese Stadtmauer die Grenzen von London. Heute ist "London Wall" auch der Name einer Straße, die an einem noch bestehenden Abschnitt der Stadtmauer verläuft.""",
    },
    {
        "language": "de",
        "id": "2270104#1",
        "title": "London Wall",
        "passage": """Die Mauer wurde Ende des zweiten oder Anfang des dritten Jahrhunderts erbaut, wahrscheinlich zwischen 190 und 225, vermutlich zwischen 200 und 220. Sie entstand somit etwa achtzig Jahre nach dem im Jahr 120 erfolgten Bau der Festung, deren nördliche und westliche Mauern verstärkt und in der Höhe verdoppelt wurden, um einen Teil der neuen Stadtmauer zu bilden. Die Anlage wurde zumindest bis zum Ende des vierten Jahrhunderts weiter ausgebaut. Sie zählt zu den letzten großen Bauprojekten der Römer vor deren Rückzug aus Britannien im Jahr 410.""",
    },
]

我们的数据集是一个 Python 列表,其中包含两种语言的维基百科文章中的段落词典。 我们将使用 helpers.bulk 方法批量索引我们的文档。

以下代码迭代文章并创建要执行的操作列表。 每个操作都是一个字典,其中包含对 Elasticsearch 索引的 “index” 操作。 该 passage 使用我们选择的模型进行编码,并将编码向量添加到文章文档中。 请注意,E5 模型要求使用前缀指令 “passage:” 来告诉模型要嵌入 passage。 在查询方面,查询字符串将以 “query:” 为前缀。 然后,文章文档将添加到操作列表中。

最后,我们调用 bulk 方法,指定索引名称和操作列表。

actions = []
for article in articles:
    actions.append({"index": {"_index": "articles"}})
    passage = article["passage"]
    passageEmbedding = model.encode(f"passage: {passage}").tolist()
    article["passage_embedding"] = passageEmbedding
    actions.append(article)

client.bulk(index="articles", operations=actions)

多语言语义搜索

接下来,我们将使用两种查询进行搜索:

  • 以英语查询以查找任何语言的文档
  • 以德语查询仅查找德语文档(使用过滤器),以显示模型在非英语语言中的功能

再次注意,查询以 “query:” 为前缀,模型需要它来正确编码查询。

对于不熟悉德语的人来说,可以快速翻译一下:

  • "health" -> "Gesundheit"
  • "wall" -> "Mauer"
def pretty_response(response):
    for hit in response["hits"]["hits"]:
        score = hit["_score"]
        language = hit["_source"]["language"]
        id = hit["_source"]["id"]
        title = hit["_source"]["title"]
        passage = hit["_source"]["passage"]
        print()
        print(f"ID: {id}")
        print(f"Language: {language}")
        print(f"Title: {title}")
        print(f"Passage: {textwrap.fill(passage, 120)}")
        print(f"Score: {score}")
def query(q, language=None):
    knn = {
        "field": "passage_embedding",
        "query_vector" : model.encode(f"query: {q}").tolist(),
        "k": 2,
        "num_candidates": 5
    }

    if language:
        knn["filter"] = {
            "term": {
                "language": language,
            }
        }

    return client.search(index="articles", knn=knn)
pretty_response(query("health"))

请注意,在上面的结果中,我们看到有关医疗保健的文档,即使是德语,也与查询 “health” 匹配得更好,而英语文档则没有具体谈论健康,而是更广泛地谈论医生。 这就是多语言嵌入的力量,它可以跨语言嵌入含义。

pretty_response(query("wall", language="de"))

在上面,我们使用过滤器在德语的文档里搜索英文单词 wall。

pretty_response(query("Mauer", language="de"))

在上面,我们在德语文档里搜索德语单词 “Mauer”。我们可以看到 “London Wall” 文档也被正确搜索到了。

有关 jupyter 的文件可以在地址下载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1065688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于风驱动优化的BP神经网络(分类应用) - 附代码

基于风驱动优化的BP神经网络(分类应用) - 附代码 文章目录 基于风驱动优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.风驱动优化BP神经网络3.1 BP神经网络参数设置3.2 风驱动算法应用 4.测试结果&#x…

每日一题 901. 股票价格跨度(中等,单调栈)

理解题目,对于第 i 天,要求的是前 i - 1 天所满足条件的跨度 思路: 暴力搜索的方式是,对于每一个第 i 天都遍历搜索 i - 1, i - 2,…,直到第 j 天大于当前价格优化,考虑哪里进行了…

1500*B. Zero Array(贪心数学找规律)

Problem - 1201B - Codeforces 解析&#xff1a; 因为每次减少2&#xff0c;如果总和为奇数肯定无法实现。 特例&#xff0c;如果某个数大于其他所有数的总和&#xff0c;同样无法实现。 其他均可实现。 #include<bits/stdc.h> using namespace std; #define int long l…

数学王国找寻另一半:求一个整数的真因子总和

数学王国找寻另一半&#xff0c;求一个整数的真因子总和。 (本笔记适合python字符串、列表list熟悉的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不…

基于水循环优化的BP神经网络(分类应用) - 附代码

基于水循环优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于水循环优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.水循环优化BP神经网络3.1 BP神经网络参数设置3.2 水循环算法应用 4.测试结果&#x…

10月7日星期六今日早报简报微语报早读

10月7日&#xff0c;星期六&#xff0c;早报简报微语早读分享。 1、中秋国庆假期国内旅游8.26亿人次&#xff0c;旅游收入7534.3亿&#xff1b; 2、2023国庆档新片票房破27亿&#xff1b; 3、石宇奇、李诗沣会师决赛&#xff0c;国羽提前包揽男单金银牌&#xff1b; 4、德国大…

前端vue 自定义组件

Vue组件的使用之props 为了提高组件的复用性&#xff0c;在封装vue组件时需要遵守如下原则&#xff1a; ① 组件的DOM结构、Style样式要尽量复用 ② 组件中要显示的数据&#xff0c;尽量由组件的使用者提供 为了方便使用者为组件提供要展示的数据&#xff0c;vue组件提供了…

【C++面向对象侯捷下】4. pointer-like classes,关于智能指针 | 5. function-like classes,所谓仿函数

文章目录 4. pointer-like classes,关于智能指针pointer-like classes,关于智能指针 shared_ptrpointer-like classes,关于迭代器5. function-like classes&#xff0c;所谓仿函数【不懂&#xff0c;跳过】 4. pointer-like classes,关于智能指针 pointer-like classes,关于智…

Postgresql中的C/C++混编(JIT)

1 Postgresql编译JIT 整体上看使用了GCC、G编译文件&#xff0c;最后用G汇总&#xff1a; GCC编译的三个.o文件llvmjit、llvmjit_deform、llvmjit_expr llvmjit.c -> llvmjit.o gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -…

VF11MR8M 冲销原因 小结

VF11&MR8M 冲销原因 小结 1.后台设置路径&#xff1a; SPRO->财务会计->总账会计->业务交易->调整过账/冲销->定义冲销原因 反记账&#xff1a; 2.前台操作使用01–当前期间回转 不会反记账&#xff0c;冲销凭证 过账日期 按 原凭证过账日期&#xff0…

CCF CSP认证 历年题目自练Day23

CCF CSP认证 历年题目自练Day23 题目一 试题编号&#xff1a; 202006-1 试题名称&#xff1a; 线性分类器 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 题目分析&#xff08;个人理解&#xff09; 题目很长&#xff0c;专门吓唬人的&#xff0c;第一行输入…

安卓‘进度条ProgressBar’中‘setIndeterminate()’方法

在进度条的设置中&#xff0c;setIndeterminate()方法是用来设置进度条是否采用‘模糊模式’&#xff08;Indeterminate的意思就是‘不确定的&#xff0c;模糊的&#xff0c;不明确的’ 也就是进度是否是确定的&#xff09; 当设置setIndeterminate(true)参数为真时&#xff0c…

Compose中的Text组件

纵向布局为&#xff1a;Column 横向布局为&#xff1a;Row 设置内容 text属性设置内容。 设置权重 Modifier.weight(1.0f, true)权重设置&#xff0c;第一个参数 Float类型设置占比权重&#xff0c;第二个参数当为true时&#xff0c;元素将占据分配的整个宽度。 fontSize…

李沐深度学习记录3:11模型选择、欠拟合和过拟合

通过多项式拟合探索欠拟合与过拟合 import math import numpy as np import torch from torch import nn from d2l import torch as d2l#生成数据集 max_degree 20 # 多项式的最大阶数 n_train, n_test 100, 100 # 训练和测试数据集大小 true_w np.zeros(max_degree) # …

VMware 17pro安装流程附带密钥手把手教

VMware 17pro centos-8.5.2111-isos-x86_64安装包下载_开源镜像站-阿里云 安装VMware 17pro 下一步 勾选我接营许可协议中的条款点击下一步 更改路径后点击下一步 注意两个都要取消勾选不然会自动更新 下一步即可 最后一步为安装就行&#xff08;我电脑上有VMware 16pro所以我的…

3.绘制一个点(鼠标点击)

愿你出走半生,归来仍是少年&#xff01; 通过鼠标点击交互&#xff0c;实现在gl中绘制点。 1.知识点 1.1.点击坐标转换为Gl坐标 通过canvas的点击事件将会获得鼠标在浏览器客户区中的坐标。通过移除canvas自身位置后可获取鼠标在canvas中的点击位置。同时通过canvas的长宽将坐…

Mini-dashboard 和meilisearch配合使用

下载的meilisearch一般是development模式&#xff0c;内置客户端&#xff0c;修改客户端后需要重要全部编译&#xff0c;花时间太长了。前后端分离才是正道&#xff0c;客户端修改不用重新编译后端。 方法如下&#xff1a; 1、修改配置文件/etc/meilisearch.toml&#xff0c;…

磁盘io使用率高问题排查

Linux系统出现了性能问题&#xff0c;一般我们可以通过top、iostat、free、vmstat等命令来查看初步定位问题。其中iostat可以给我们提供丰富的IO状态数据。 1.小文件读写的磁盘性能瓶颈是寻址&#xff08;随机读写性能更差&#xff09;评估标准:TPS 2.大文件读写的磁盘性能瓶颈…

cereal:支持C++11的开源序列化库

cereal:支持C11的开源序列化库 文章目录 一&#xff1a;引言二、cereal简介三、cereal的下载和使用 一&#xff1a;引言 序列化 (Serialization) 程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中&#xff0c;然后将其写入某个文件或是将它传输到网络中的另…

认识计算机主板

目录 定义主要部件简单图示 主要功能 定义 计算机主板&#xff08;Motherboard&#xff09;是计算机系统中的核心组件之一&#xff0c;也被称为系统板、主板或母板。它是一个电子电路板&#xff0c;用于连接和支持计算机的各种硬件组件&#xff0c;包括中央处理器&#xff08;…