Elasticsearch:一年中最神奇的时刻:利用语义搜索寻找最喜庆的哈利·波特时刻
2024年1月29日 | by mebius
作者:iulia
霍格沃茨的圣诞节,有人吗?
我不了解你,但对我来说,圣诞节通常意味着开始(又一个)哈利波特马拉松。 虽然我全年都是魔法世界的粉丝,但霍格沃茨的圣诞节还是有一些额外的节日气氛。
你是否曾经希望有办法找到该系列中最快乐、最愉快、最充满礼物的时刻,但您只是没有时间梳理所有 7 本书和 8 部电影? 输入 Elastic 语义搜索!
让我们踏上一段神奇的旅程,将《哈利波特》书籍转变为 NLP 索引,并使用 Elastic Python 客户端和向量搜索功能进行一些非常酷、非常喜庆的搜索。
介绍哈利波特 Elasticsearch 索引 – 使用语义搜索来搜索哈利波特的节日时刻
神奇的搜索体验
这是通过结合几个关键概念来实现的:
- 首先,我们做 Elastic 最擅长的事情,即搜索。
- 更进一步,我们可以轻松地使用 eland从 Hugging Face 导入支持的模型(例如情感分析),以便从文本中获得更多细微差别。
- 最后,我们可以使用 ELSER 按含义进行搜索,而不是使用通常的关键字/过滤系统。 简单来说,我们用更人性化的理解或语言进行搜索。 (用奇特的术语来说,我们使用相似度分数找到将句子的嵌入空间表示作为向量之间的最小距离。- 但我们不要让圣诞节过于复杂化)
首先,我从 kaggle 数据集中获取了书籍,并在 Python Notebook 中进行了一些额外的处理,以使它们的形状适合我们的索引。 我们重点关注前三本书中的这些示例。
我们将每个句子创建一个文档字典作为我们准备搜索的数据库。 看起来像这样:
[{'text_field': 'Mr and Mrs Dursley of number four Privet Drive were proud to say that they were perfectly normal thank you very much '},
{'text_field': 'They were the last people youd expect to be involved in anything strange or mysterious because they just didtgcodent hold with such nonsense '},
{'text_field': 'Mr Dursley was the director of a firm called Grunnings which made drills '}]
我们在 Elastic 集群上创建一个简单的索引,并使用 python 客户端将每个句子/文档批量上传到其中。 你可以在此处查看存储库以获取完整的项目代码。 我们可以使用如下的命令来下载代码:
git clone https://github.com/iuliaferoli/harry-potter-search
我们已经可以进行一些简单的搜索,例如查找书中所有提到 “Christmas” 的内容:
现状 —— 关键词搜索
response = client.search(index = index, query={
"match" : {
"text_field" : "christmas"
}
})
We get back 203 results, here are the top ones:
meeting before Christmas
Merry Christmas said George
See you at Christmas
Come on Hermione its Christmas
So Ive come for Christmas
当我们搜索特定单词时,这很好; 但当我们试图记住书中的特定场景……或者是电影……以及具体的台词是什么……呃……类似 “Harry getting a present”。 那行得通吗?
We get back 10000 results, here are the top ones:
Have a present
Ive got yeh a present
Wow Harry He had just opened Harrys present a Chudley Cannon hat
Particularly in present company ! ‘Present company ?repeated Snape sardonically
Early Christmas present for you Harry he said
Id be happier if a teacher were present
好吧,所以模型并没有意识到 “being present/linving in the present” 并不是我正在寻找的节日氛围。 让我们为我们的搜索添加一些魔法。
通过情感分析和语义搜索丰富数据
借助 Eland,我们可以导入各种 ML 模型并将它们部署到 Elastic 环境中,从而使我们能够使用新数据对它们进行推理调用,或者丰富现有索引。 有大量兼容模型,但在本例中,我们将使用此处的情感分析文本分类器。
任何模型都可以通过 docker 导入,以获得更轻松的部署体验,并确保满足所有依赖项和版本。
docker run -it --rm elastic/eland
eland_import_hub_model
--cloud-id $CLOUD_ID
-u $USER -p $PASSWORD
--hub-model-id distilbert-base-uncased-finetuned-sst-2-english
--task-type text_classification
--start
我们还可以导入 embedding 模型,使我们能够使用文本相似性进行搜索,以解释同义词或相关词。 这可以使用另一个导入的模型手动完成,或者我们可以使用 ELSER – 这是 Elastic 的开箱即用语义搜索模块。
将模型添加到你的 Elastic 集群后,你可以随时使用它们对文本数据运行推理。 例如,一个简单的调用如下所示:
model_id = "distilbert-base-uncased-finetuned-sst-2-english"
doc_test = {"text_field": "Harry Potter is the best Christmas movie in the world"}
result = MlClient.infer_trained_model(client, model_id =model_id, docs = doc_test)
print(result["inference_results"])
[{'predicted_value': 'POSITIVE', 'prediction_probability': 0.9998637678432463}]
惊人的! 我们现在可以在搜索中考虑情绪,毕竟我们正在寻找该系列中绝对最快乐的部分。
让我们加快这个过程 – 我们可以创建一个管道,使用情感和向量嵌入模型立即评估所有文档,从而丰富我们的整个索引。 所以书中的每个句子都会得到一个积极或消极的情感标签,以及一个向量表示,以帮助我们稍后使用语义搜索。
client.ingest.put_pipeline(
id="sentiment_and_elser",
processors=[
{
"inference": {
"model_id": "distilbert-base-uncased-finetuned-sst-2-english",
"target_field" : "sentiment",
"field_map": {
"Sentence": "text_field"
}
}
},
{
"inference": {
"model_id": ".elser_model_1",
"target_tgcodefield": "ml",
"field_map": {
"Sentence": "text_field"
},
"inference_config": {
"text_expansion": {
"results_field": "tokens"
}
}
}
}
]
)
client.reindex(body={
"source": {
"index": "hp_books"},
"dest": {"index": "hp_books_enriched", "pipeline" : "sentiment_and_elser"}
}, wait_for_completion=False)
现在我们有了一个复杂的索引,其中包含各种 ML 字段,我们可以使用它们来进行神奇的搜索。让我们通过一些节日搜索来尝试一下。
一年中最神奇的时刻
我们现在可以使用添加的语义信息维度来运行相同的搜索。
result = client.search(
index='hp_books_enriched',
size=5,
query={
"text_expansion": {
"ml.tokens": {
"model_id":".elser_model_1",
"model_text":"christmas"
}
}
},
request_timeout=30
)
我们的新结果看起来比之前的搜索有趣得多 – 之前的搜索只是专注于在书中查找 “Christmas”一词,而不是为搜索捕获更多上下文。
Most unfortunate that it should happen on Christmas Day
Christmas morning dawned cold and white
What a jolly holiday its going to be
Td invite you for Christmas but
We can do all our Christmas shopping there !said Hermione
现在的例子怎么样? 希望搜索结果中不再出现语法引起的歧义。
result = client.search(
index='hp_books_enriched',
size=5,
query={
"text_expansion": {
"ml.tokens": {
"model_id":".elser_model_1",
tgcode"model_text":"Harry getting a present"
}
}
},
request_timeout=30
)
现在我们得到:
but how else was I supposed to get Harrys present to him ?Stick it back in the trunk Harry advised as the Sneakoscope whistled piercingly
Oy !Presents !Harry reached for his glasses and put them on squinting through the semidarkness to the foot of his bed where a small heap of parcels had appeared
Harry opened the last present to find a new handknitted sweater from Mrs Weasley and a large plum cake
There you go Ron yelled happily stuffing a fistful of gold coins into Harrys hand for the Omnioculars !Now youve got to buy me a Christmas present ha !T
Early Christmas present for you Harry he said
好多了! 充满节日气氛!
让我们添加一些情绪。 大多数结果看起来已经相当积极了 —— 所以让我们来挑战一下——我们能找到任何负面的赠送礼物的例子吗?
result = client.search(
index='hp_books_enriched',
size=5,
query={
"bool": {
"should": [{
"text_expansion": {
"ml.tokens": {
"model_id":".elser_model_1",
"model_text":"Harry getting a present"
}
},
}],
"must":[
{
"match" : {
"sentiment.predicted_value": "NEGATIVE"
}
}]}})
Yet another unusual thing about Harry was how little he looked forward to his birthdays
哎哟。 好吧,我们不会再这样做了。 让我们以积极的态度离开吧。
该系列中最积极的段落是什么?
(表明我们也可以选择一次在搜索中仅使用其中一个模型,在本例中 – 仅使用情绪)
query={
"match" : {
"sentiment.predicted_value": "POSITIVE"
}
}
response = client.search(index = "hp_books_enriched",query=query, sort="sentiment.prediction_probability:desc")
The most positive sentences in the series:
A really really happy memory
that means ‘great happiness
it was incredible
Dinner that night was a very enjoyable affair
Relief warm sweeping glorious relief swept over Harry
It was all delicious
A powerful one
Excellent !said Harry happily
Brilliant mind
Tonight will be an excellent time to do it
啊 —— 现在心情很好,又去看电影了。
祝大家节日快乐,寻找愉快!
文章来源于互联网:Elasticsearch:一年中最神奇的时刻:利用语义搜索寻找最喜庆的哈利波特时刻
相关推荐: Elasticsearch:ES|QL 查询展示
目录 准备数据 在 Dev Tools 里进行查询 基本语法 ES|QL 源命令 查询数据 针对 ip 进行搜索: 文本搜索 计算值 使用 DISSECT 使用 GROK 聚合 编辑 创建直方图 针对数字字段的桶分析 丰富数据 元数据运用 ES|QL 多值字…