Elasticsearch:多语言语义搜索

这篇具有很好参考价值的文章主要介绍了Elasticsearch:多语言语义搜索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在此示例中,我们将使用多语言嵌入模型 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 的过程中,我们需要记下如下的信息:

elasticsearch 多语言,Elasticsearch,Elastic,AI,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 多语言,Elasticsearch,Elastic,AI,elasticsearch,大数据,搜索引擎,全文检索

然后我们创建一个客户端对象来实例化 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 多语言,Elasticsearch,Elastic,AI,elasticsearch,大数据,搜索引擎,全文检索

使用所需的映射创建 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)

elasticsearch 多语言,Elasticsearch,Elastic,AI,elasticsearch,大数据,搜索引擎,全文检索

摄入数据

让我们索引一些数据。 请注意,我们使用 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)

elasticsearch 多语言,Elasticsearch,Elastic,AI,elasticsearch,大数据,搜索引擎,全文检索

多语言语义搜索

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

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

再次注意,查询以 “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"))

elasticsearch 多语言,Elasticsearch,Elastic,AI,elasticsearch,大数据,搜索引擎,全文检索

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

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

elasticsearch 多语言,Elasticsearch,Elastic,AI,elasticsearch,大数据,搜索引擎,全文检索

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

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

elasticsearch 多语言,Elasticsearch,Elastic,AI,elasticsearch,大数据,搜索引擎,全文检索

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

有关 jupyter 的文件可以在地址下载。文章来源地址https://www.toymoban.com/news/detail-712713.html

到了这里,关于Elasticsearch:多语言语义搜索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch:使用 Transformers 和 Elasticsearch 进行语义搜索

    什么语义搜索( semantic search )呢?根据搜索查询的意图和上下文含义(而不仅仅是)检索结果。语义/向量搜索是一种强大的技术,可以大大提高搜索结果的准确性和相关性。 与传统的基于的搜索方法不同,语义搜索使用单词的含义和上下文来理解查询背后的意

    2024年02月08日
    浏览(53)
  • Elasticsearch:如何在 Elastic 中实现图片相似度搜索

    作者:Radovan Ondas 在本文章,我们将了解如何通过几个步骤在 Elastic 中实施相似图像搜索。 开始设置应用程序环境,然后导入 NLP 模型,最后完成为你的图像集生成嵌入。 Elastic 图像相似性搜索概览 Elasticsearch:如何在 Elastic 中实现图片相似度搜索 第一步是为你的应用程序设

    2024年01月22日
    浏览(48)
  • Elasticsearch:语义搜索即服务处于卓越搜索的中心

    作者:来自 Elastic Sherry Ger, Stephen Brown 对于许多企业来说,搜索卓越中心(center of excellence - COE)向其用户提供搜索服务,从不同的数据源中整理知识,并将搜索功能集成到其内部和外部应用程序中。Elasticsearch,这个 “支撑着互联网上大约 90% 的搜索栏” 的分布式搜索平台,

    2024年04月11日
    浏览(34)
  • Elasticsearch:使用 ELSER 进行语义搜索

    Elastic Learned Sparse EncodeR(或 ELSER)是一种由 Elastic 训练的 NLP 模型,使你能够使用稀疏向量表示来执行语义搜索。 语义搜索不是根据搜索词进行字面匹配,而是根据搜索查询的意图和上下文含义检索结果。 本教程中的说明向你展示了如何使用 ELSER 对数据执行语义搜索。 提示

    2024年02月11日
    浏览(47)
  • Elasticsearch:使用 ELSER 文本扩展进行语义搜索

    在今天的文章里,我来详细地介绍如何使用 ELSER  进行文本扩展驱动的语义搜索。 如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考如下的链接来进行安装: 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kiba

    2024年02月07日
    浏览(48)
  • Elasticsearch:使用 ELSER v2 进行语义搜索

    在我之前的文章 “Elasticsearch:使用 ELSER 进行语义搜索”,我们展示了如何使用 ELESR v1 来进行语义搜索。在使用 ELSER 之前,我们必须注意的是: 重要 :虽然 ELSER V2 已正式发布,但 ELSER V1 仍处于 [预览] 状态。此功能处于技术预览阶段,可能会在未来版本中更改或删除。 E

    2024年02月22日
    浏览(43)
  • 使用 Elasticsearch、OpenAI 和 LangChain 进行语义搜索

    在本教程中,我将引导您使用 Elasticsearch、OpenAI、LangChain 和 FastAPI 构建语义搜索服务。 LangChain 是这个领域的新酷孩子。 它是一个旨在帮助你与大型语言模型 (LLM) 交互的库。 LangChain 简化了与 LLMs 相关的许多日常任务,例如从文档中提取文本或在向量数据库中对它们建立索引

    2024年02月08日
    浏览(41)
  • Elasticsearch:语义搜索 - Semantic Search in python

    当 OpenAI 于 2022 年 11 月发布 ChatGPT 时,引发了人们对人工智能和机器学习的新一波兴趣。 尽管必要的技术创新已经出现了近十年,而且基本原理的历史甚至更早,但这种巨大的转变引发了各种发展的“寒武纪大爆炸”,特别是在大型语言模型和生成 transfors 领域。 一些怀疑论

    2024年02月14日
    浏览(55)
  • 【NLP】什么是语义搜索以及如何实现 [Python、BERT、Elasticsearch]

    语义搜索是一种先进的信息检索技术,旨在通过理解搜索查询和搜索内容的上下文和含义来提高搜索结果的准确性和相关性。与依赖于匹配特定单词或短语的传统基于的搜索不同,语义搜索会考虑查询的意图、上下文和语义。 语义搜索在搜索结果的精度和相关性至关重

    2024年02月04日
    浏览(47)
  • Elasticsearch:一年中最神奇的时刻:利用语义搜索寻找最喜庆的哈利·波特时刻

    作者:iulia 我不了解你,但对我来说,圣诞节通常意味着开始(又一个)哈利·波特马拉松。 虽然我全年都是魔法世界的粉丝,但霍格沃茨的圣诞节还是有一些额外的节日气氛。 你是否曾经希望有办法找到该系列中最快乐、最愉快、最充满礼物的时刻,但您只是没有时间梳理

    2024年02月19日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包