如果你已经看够了传统的基于关键词的搜索引擎,我们有一个好消息:语义文本搜索已经在这里了!通过使用向量数据库,你可以在无需停留太久地找到你需要的结果。这项技术最近已经被用于搜索白宫演讲,现在你也可以在自己的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/