如果你已经看够了传统的基于关键词的搜索引擎,我们有一个好消息:语义文本搜索已经在这里了!通过使用向量数据库,你可以在无需停留太久地找到你需要的结果。这项技术最近已经被用于搜索白宫演讲,现在你也可以在自己的Jupyter笔记本中实现它。
那么,什么是向量数据库?
向量数据库是一种特殊的数据库,它存储的不是文本本身,而是文本的“向量表示”。这种向量表示是通过将文本转换为数学向量形式而创建的。这使得文本可以被量化,并且可以用数学方式进行比较和匹配。向量数据库可用于许多不同的应用程序,而在本文中,我们将着重介绍如何在你的Jupyter笔记本中实现语义搜索。
在本文的示例中,我们将使用Python和Elasticsearch。Elasticsearch是一种开源搜索引擎,它可以存储和搜索海量的文本数据。对于我们的目的,我们将使用elasticsearch-dsl Pyton包,该软件包提供了简单的API,使得使用Elasticsearch变得更加容易。
首先,我们需要安装所需的软件包。使用以下命令来安装elasticsearch-dsl:
pip install elasticsearch-dsl
接下来,我们需要创建一个文本数据集,并将它们转换为向量表示。我们可以使用spaCy自然语言处理库中的预训练模型来实现这一点。使用以下命令来安装spaCy:
pip install spacy
然后,我们可以运行以下命令来加载英语模型:
import spacy
nlp = spacy.load(‘en_core_web_lg’)
现在,我们可以使用加载的模型来将文本转换为向量表示。例如,在以下代码片段中,我们将文本“Hello World”转换为其向量表示:
doc = nlp(“Hello World”)
vector = doc.vector
接下来,我们需要将转换后的向量存储在向量数据库中。我们可以使用Elasticsearch的bulk API来实现这一点。以下是示例代码:
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
es = Elasticsearch()
docs = [
{
“_index”: “documents”,
“_type”: “document”,
“_id”: “1”,
“text”: “The quick brown fox jumps over the lazy dog.”,
“vector”: nlp(“The quick brown fox jumps over the lazy dog.”).vector.tolist()
},
{
“_index”: “documents”,
“_type”: “document”,
“_id”: “2”,
“text”: “Lorem ipsum dolor sit amet, consectetur adipiscing elit.”,
“vector”: nlp(“Lorem ipsum dolor sit amet, consectetur adipiscing elit.”).vector.tolist()
}
]
actions = [
{
“_index”: item[“_index”],
“_type”: item[“_type”],
“_id”: item[“_id”],
“_source”: item
}
for item in docs
]
for success, info in bulk(es, actions):
if not success:
print(‘A document failed:’, info)
现在,我们已经将文本转换为向量表示,并将它们存储在了向量数据库中。接下来,我们可以使用Elasticsearch的similarity查询来执行语义搜索。以下是示例代码:
query = “The quick brown fox”
doc = nlp(query)
vector = doc.vector.tolist()
search_body = {
“query”: {
“script_score”: {
“query”: {
“match_all”: {}
},
“script”: {
“source”: “cosineSimilarity(params.query_vector, ‘vector’) + 1.0”,
“params”: {
“query_vector”: vector
}
}
}
}
}
response = es.search(
index=”documents”,
body=search_body
)
以下是Elasticsearch查询结果中的一部分:
{
“_index”: “documents”,
“_type”: “document”,
“_id”: “1”,
“_score”: 2.0,
“_source”: {
“text”: “The quick brown fox jumps over the lazy dog.”,
“vector”: [
0.3149769606590271,
0.5075449948310852,
…
-0.5487145185470581
]
}
}
如你所见,我们已经成功地执行了语义搜索!现在,你可以在自己的Jupyter笔记本中实现它,快速搜索你的文本数据集。这项技术也可以用于许多其他应用程序,例如推荐系统,图像搜索等。让你的搜索引擎更加专业、智能、快速和准确!
了解更多有趣的事情:https://blog.ds3783.com/