地理空间向量搜索:构建一个AI驱动的地理感知新闻搜索

地理空间向量搜索:构建一个AI驱动的地理感知新闻搜索

img

介绍

向量数据库对于地理空间应用非常重要,因为它们有效地组织和处理地理信息。它们以整齐的方式组织有关地点的信息,使得准确展示河流、道路和边界等物体变得容易。这些数据库使用智能系统连接有关地点的详细信息,从而提供空间数据的完整图景。

它们在处理地图上不同特征之间的关系方面也非常出色,例如判断两条线是否相交或某个点是否在形状内部。这有助于进行高级空间分析,使得理解特定区域内发生的事情变得更加容易。对于快速在地图上找到事物,向量数据库使用特殊方法加速这一过程,通过更快地获取特定地点的信息。此外,它们还有专门用于询问与位置相关的问题和概念的语言。

在这里插入图片描述

向量数据库还与其他制图工具良好协作,因为它们遵循某些标准。这使得不同软件和系统之间共享信息变得容易。这些数据库不仅存储形状;还跟踪地点的详细信息,例如名称、图片和数字。这使得向地图中添加额外信息变得简单。

Qdrant:支持地理空间搜索的向量数据库

Qdrant DB的地理特性使其成为地理空间搜索中一个强大的工具,特别是在向量数据库的领域中。

在这里插入图片描述

以下是Qdrant DB的地理特性的关键方面,以及它们如何使其独特于其他向量数据库:

  1. 地理过滤器: Qdrant引入了一种地理过滤器功能,允许用户使用多边形来细化查询结果。此功能是传统半径和矩形过滤器的扩展,为空间查询提供了更大的灵活性。地理过滤器允许用户定义复杂的地理形状以细化搜索。这在需要根据复杂空间边界过滤数据点的场景中特别有用,提供了更高级的地理空间查询能力。Qdrant的地理过滤器功能,特别是多边形过滤,使其与许多其他向量数据库区分开来。
  2. 地理哈希层: Qdrant采用地理哈希层将世界划分为矩形。在空间索引期间,每个条目被分配到与其位置相对应的地理哈希。此方法通过首先识别潜在的地理哈希,然后检查这些哈希内的位置候选者,从而优化空间查询。地理哈希层通过有效缩小搜索空间来增强查询性能。
  3. 载荷支持: Qdrant不仅支持向量数据的存储,还包括与向量相关的额外载荷。该数据库允许根据载荷值进行结果过滤,包括各种数据类型和查询条件,例如地理位置。在Qdrant中对载荷的支持将其地理空间能力扩展到仅仅基于位置的查询之外。用户可以根据与向量相关的各种属性筛选和检索数据。

新闻API与PyCountry:创建新闻文章数据集

构建一个地理感知新闻搜索引擎的想法来源于位置基础信息在新闻消费中的日益重要性。它的灵感来自于地理空间技术和向量数据库的能力,认识到改善用户体验并提供更具上下文相关性的新闻的潜力。

主要目标是创建一个平台,不仅利用向量数据库的结构化和高效框架,还集成先进的空间分析工具,确保用户根据其地理兴趣和偏好接收量身定制的新闻内容。

让我们看看如何利用向量数据库进行地理感知的新闻搜索。

要创建新闻文章数据集,您需要一个API密钥,我们将使用新闻API,您可以从这里获取。

NewsAPI.org提供用户友好的API,可以从超过30,000个全球来源访问新闻。该API在非商业项目中免费可用,包括开源项目和开发中的商业项目。但是,需要注册以获取“API密钥”。

为了检索国家名称,我们将使用PyCountry模块。PyCountry是一个旨在简化与国家相关数据工作的Python模块。该模块提供一系列功能,包括检索国家信息,例如其官方名称、通用名称以及ISO 3166代码(包括alpha-2和alpha-3)。

我们将首先安装依赖项。

%%capture
pip install -q newsapi-python
pip install -q pycountry

使用API密钥,我们将编写代码,以便我们提供的国家输入的新闻类型将保存到CSV文件中。

# 导入必要的库
import csv
from newsapi.newsapi_client import NewsApiClient
import pycountry

# 用你的API密钥初始化NewsAPI客户端
newsapi = NewsApiClient(api_key='your-api-key')

# 无限循环以保持程序运行,直到用户决定退出
while True:
    # 从用户输入中获取国家名称
    input_country = input("国家: ")
    input_countries = [f'{input_country.strip()}']
    countries = {}

    # 使用pycountry模块遍历所有国家,并将它们的代码存储在字典中
    for country in pycountry.countries:
        countries[country.name] = country.alpha_2

    # 检查输入的国家名称是有效还是无效,使用唯一代码
    codes = [countries.get(country.title(), 'Unknown code') for country in input_countries]

    # 获取用户感兴趣的新闻类别
    option = input("您感兴趣的类别是什么?\n1.商业\n2.娱乐\n3.综合\n4.健康\n5.科学\n6.技术\n\n在此输入: ")

    # 基于用户的选择获取头条新闻
    top_headlines = newsapi.get_top_headlines(category=f'{option.lower()}', language='en', country=f'{codes[0].lower()}')
    Headlines = top_headlines['articles']

    # 以良好的可读性显示新闻,并写入CSV
    if Headlines:
        with open('news_data.csv', 'w', newline='', encoding='utf-8') as csvfile:
            csv_writer = csv.writer(csvfile)
            csv_writer.writerow(['新闻文章', '国家'])

            for articles in Headlines:
                # 检查标题中是否存在'-'并相应格式化
                if "-" in articles['title']:
                    b = articles['title'][::-1].index("-")
                    if "news" in (articles['title'][-b+1:]).lower():
                        news_title = f"{articles['title'][-b+1:]}: {articles['title'][:-b-2]}"
                    else:
                        news_title = f"{articles['title'][-b+1:]} 新闻: {articles['title'][:-b-2]}"
                else:
                    news_title = articles['title']

                # 将数据写入CSV
                csv_writer.writerow([news_title, input_country])

                # 打印以便用户阅读
                print(news_title)

        print(f"CSV文件 'news_data.csv' 为 {input_country} 成功创建,包含新闻文章。")
    else:
        print(f"抱歉,未找到 {input_country} 的文章。发生了错误!")

    # 询问用户是否想要再次搜索
    option = input("您想要再次搜索吗[是/否]?")
    if option.lower() != 'yes':
        break

我运行上述代码11次,并将它们保存在11个不同的文件中。然后我将它们合并成一个数据框。

import pandas as pd
from sklearn.utils import shuffle

# 文件名列表
file_names = ['/content/news_data.csv', '/content/news_data1.csv', '/content/news_data2.csv', '/content/news_data3.csv',
              '/content/news_data4.csv', '/content/news_data5.csv', '/content/news_data6.csv', '/content/news_data7.csv',
              '/content/news_data9.csv', '/content/news_data8.csv','/content/news_data10.csv']

# 创建一个空的DataFrame来存储合并的数据
merged_data = pd.DataFrame()

# 读取并合并每个CSV文件到DataFrame中
for file in file_names:
    df = pd.read_csv(file)
    merged_data = pd.concat([merged_data, df], ignore_index=True)

# 打乱DataFrame
shuffled_data = shuffle(merged_data)

# 显示打乱的DataFrame
print(shuffled_data)

让我们分配国家的纬度和经度。在我们的数据集中,我们有国家名称,我们将使用每个国家的中间纬度和经度。

GeoPy: 获取纬度和经度

我们将首先将未命名的列重命名为ID,因为ID是向量搜索中最重要的部分。

import pandas as pd
data = pd.read_csv("/content/News Article.csv")
data = data.rename(columns = {'Unnamed: 0':'Id'})
data.sample(3)

然后,我们将安装GeoPy依赖项。

GeoPy是一个Python库,旨在简化地理编码任务,这涉及将地址转换为地理坐标*(纬度和经度),反之亦然。该库提供许多功能,例如地理编码,使得将诸如“1600 Amphitheatre Parkway, Mountain View, CA”* 的地址转换为相应的地理坐标成为可能。此外,GeoPy还支持反向地理编码,允许用户基于给定的坐标获取位置详细信息或地址。该库还提供了计算地球表面两点之间距离的工具,使用各种度量。值得注意的是,GeoPy支持多种地理编码服务,包括OpenStreetMap Nominatim、Google Geocoding API和Bing Maps API。

%%capture
pip install geopy

通过使用Nominatim API,我们将定义一个辅助函数,通过它获取我们数据集中纬度和经度的列。

# 初始化Nominatim API
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="MyApp")

# 获取纬度和经度的函数
def get_lat_lon(country):
    location = geolocator.geocode(country)
    if location:
        return pd.Series({'lat': location.latitude, 'lon': location.longitude})
    else:
        return pd.Series({'lat': None, 'lon': None})

# 应用该函数创建新列
data[['lat', 'lon']] = data['Country'].apply(get_lat_lon)
data.head()

现在,让我们将新闻文章转换为向量。

将文本转换为向量

Hugging Face提供了一系列用于各种目的的预训练模型。对于我们的语义搜索,我们将探索multi-qa-MiniLM-L6-cos-v1-Model,这是专为此任务设计的。

该模型属于句子转换器系列,将句子和段落映射到一个384维的稠密向量空间,专门用于语义搜索。在215百万个来自不同来源的问题-答案对的多样化数据集上进行训练,是一个强大的工具。

请记住模型的局限性,例如512个单词的限制;超出此限制的任何文本将被截断。此外,请注意,该模型是在输入文本最多为250个单词的情况下训练的,可能会影响其在较长文本上的表现。

在我们的案例中,我们使用*“News Articles”*列,其中大多数句子最多有50个单词。使用句子转换模型,我们将创建一个向量列,以保存从新闻文章文本转换而来的所有向量。

from sentence_transformers import SentenceTransformer
from tqdm import tqdm
tqdm.pandas()
# 加载模型
model = SentenceTransformer('multi-qa-MiniLM-L6-cos-v1')
# 使用模型编码所有新闻文章
data["vector"] = data["News Article"].progress_apply(lambda x: model.encode(x.lower()))
data.head()

既然我们的向量已经准备好了,让我们进入地理空间向量搜索。

地理空间向量搜索

现在,我们需要创建一个集合来存储我们创建的向量。我们将初始化一个向量数据库并创建一个集合。由于其先进的地理过滤能力,我在这里使用Qdrant向量数据库。

from qdrant_client import QdrantClient
from qdrant_client.http.models import *
client = QdrantClient(":memory:")
client.recreate_collection(
 collection_name="geo_collection",
 vectors_config=VectorParams(size=384, distance=Distance.DOT)
)

我们将为*“geo_collection”*集合中的“新闻文章”字段创建一个有效载荷索引,通过应用特定参数的文本索引,例如单词分词、最小和最大Token长度,以及可选的小写转换。

client.create_payload_index(
 collection_name="geo_collection",
 field_name="News Article",
 field_schema=models.TextIndexParams(
 type="text",
 tokenizer=models.TokenizerType.WORD,
 min_token_len=2,
 max_token_len=30,
 lowercase=True,
 )
)

现在,我们将定义一个辅助函数,逐行插入我们创建的集合。

def post_qdrant(row):
    """为了简单起见,逐行插入每一行。可以通过一次插入多行进行优化。"""

    # 创建没有向量、纬度和经度的有效载荷
    row_payload = row.iloc[:-3].to_dict()

    # 将纬度和经度添加到有效载荷中,作为“location”键下的字典
    row_payload["location"] = row[["lat", "lon"]].to_dict()

    # 从“vector”列中提取向量并将其转换为列表
    row_vector = row["vector"].tolist()

    # 从“Id”列中提取唯一标识符
    row_id = row["Id"]

    # 使用提供的客户端向Qdrant API执行POST请求
    operation_info = client.upsert(
        collection_name="geo_collection",
        wait=True,
        points=[
            PointStruct(id=row_id, vector=row_vector, payload=row_payload),
        ]
    )

然后,我们将把辅助函数应用于我们的数据集。

data.progress_apply(lambda x: post_qdrant(x), axis=1)

您可以通过调用搜索端点来使用语义搜索查询数据库。我输入了搜索词*“scientific breakthrough”*并将搜索结果限制为5。

search_term = "scientific breakthrough"
search_result = client.search(
 collection_name="geo_collection",
 query_vector=model.encode(search_term),
 limit=5
)
search_result

在这里,您可以看到搜索结果的分数。它们按降序排列。与我们的搜索词非常接近的搜索结果在所有结果中得分最高。

[ScoredPoint(id=23, version=0, score=0.5760013461112976, payload={'Id': 23, 'News Article': "纽约邮报新闻:'科学突破'导致发现50年来第一种能杀死耐药细菌的抗生素", 'Country': '美国', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None),
 ScoredPoint(id=40, version=0, score=0.3289460241794586, payload={'Id': 40, 'News Article': '未来主义新闻:科学家担心会读懂你思想的设备', 'Country': '新西兰', 'location': {'lat': -41.5000831, 'lon': 172.8344077}}, vector=None, shard_key=None),
 ScoredPoint(id=103, version=0, score=0.3289460241794586, payload={'Id': 103, 'News Article': '未来主义新闻:科学家担心会读懂你思想的设备', 'Country': '加拿大', 'location': {'lat': 61.0666922, 'lon': -107.991707}}, vector=None, shard_key=None),
 ScoredPoint(id=72, version=0, score=0.31487736105918884, payload={'Id': 72, 'News Article': '大思想新闻:#101次以炸响开始的播客 - 量子计算', 'Country': '美国', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None),
 ScoredPoint(id=48, version=0, score=0.2746903598308563, payload={'Id': 48, 'News Article': '印度时报新闻:4种蘑菇食谱可以帮助冬季提升维生素D', 'Country': '英国', 'location': {'lat': 54.7023545, 'lon': -3.2765753}}, vector=None, shard_key=None)]

现在,让我们尝试将过滤器放在我们将根据 “新闻文章” 关键字进行搜索的位置。只有当搜索词的文本与其中一篇新闻文章匹配时,搜索结果才会出现。

search_term = "为什么对 '三重流行病' 的恐惧激增"
search_result = client.scroll(
 collection_name="geo_collection",
 scroll_filter=Filter(
 must=[
 FieldCondition(
 key="新闻文章",
 match=MatchText(text=search_term)
 )
 ]
 ),
 limit=3,
 with_payload=True,
)
search_result

我们将搜索结果限制为3,但我们只得到了一个结果,因为它只遵循确切匹配。

([Record(id=34, payload={'Id': 34, '新闻文章': 'The Hill News: 为什么对 '三重流行病' 的恐惧激增', 'Country': 'United States', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None)],
 None)

现在,让我们放置一个地理过滤器边界框,在其中定义右下角和左上角的边界。

地理边界框搜索涉及使用左上角 (top_left) 和右下角 (bottom_right) 的坐标定义地球表面的矩形区域。在这里,矩形是通过经度和纬度值指定的,这个矩形内的地点将匹配该条件。

search_term = "科学突破"

search_result = client.search(
    collection_name="geo_collection",
    query_vector=model.encode(search_term),
    query_filter=Filter(
        must=[
            FieldCondition(
                key="location",
                geo_bounding_box=models.GeoBoundingBox(
                    bottom_right=models.GeoPoint(
                        lat=61.0666922,
                        lon=-107.991707,
                    ),
                    top_left=models.GeoPoint(
                        lat=22.351115,
                        lon=-3.2765753,
                    ),
                ),
            )
        ]
    ),
    limit=6
)

search_result

以下是结果,我们再次以降序获得分数。我们得到的结果均在我们为纬度和经度设定的边界内。

[ScoredPoint(id=23, version=0, score=0.5760013461112976, payload={'Id': 23, '新闻文章': "New York Post News: '科学突破' 导致发现50年来首个可杀死耐药细菌的抗生素", 'Country': 'United States', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None),
 ScoredPoint(id=103, version=0, score=0.3289460241794586, payload={'Id': 103, '新闻文章': 'Futurism News: 科学家担忧能真实读取你思想的设备', 'Country': 'Canada', 'location': {'lat': 61.0666922, 'lon': -107.991707}}, vector=None, shard_key=None),
 ScoredPoint(id=72, version=0, score=0.31487736105918884, payload={'Id': 72, '新闻文章': 'Big Think News: 从大爆炸开始的播客 #101 - 量子计算', 'Country': 'United states', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None),
 ScoredPoint(id=48, version=0, score=0.2746903598308563, payload={'Id': 48, '新闻文章': 'IndiaTimes News: 4 种蘑菇食谱可帮助冬季提升维生素 D', 'Country': 'United Kingdom', 'location': {'lat': 54.7023545, 'lon': -3.2765753}}, vector=None, shard_key=None),
 ScoredPoint(id=37, version=0, score=0.2717020809650421, payload={'Id': 37, '新闻文章': 'TechCrunch News: 哈佛的机器人外骨骼可以改善步态,减少帕金森病患者的跌倒', 'Country': 'United States', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None),
 ScoredPoint(id=14, version=0, score=0.249062180519104, payload={'Id': 14, '新闻文章': 'Samsung News: Samsung 在 2024 年 Unpacked 前夕预告移动体验的演变', 'Country': 'India', 'location': {'lat': 22.3511148, 'lon': 78.6677428}}, vector=None, shard_key=None)]

除了放置边界框,如果我们想要以经纬度定义的中心为基准,获得圆形区域的搜索结果,我们也可以通过地理半径来实现。

地理半径搜索关注在由中心点和指定半径定义的圆形区域内查找位置。在这里,中心由经度和纬度指定,距离中心指定距离(以米为单位)内的圆形区域内的位置将符合条件。

search_term = "科学突破"

search_result = client.search(
    collection_name="geo_collection",
    query_vector=model.encode(search_term),
    query_filter=Filter(
        must=[
            FieldCondition(
                key="location",
                geo_radius=models.GeoRadius(
                    center=models.GeoPoint(
                        lat=39.783730,
                        lon=-100.445882,
                    ),
                    radius=10_000,
                ),
            )
        ]
    ),
    limit=5
)

search_result

以下是结果,我们可以看到所有结果都来自于我们在代码中定义的同一位置。

[ScoredPoint(id=23, version=0, score=0.5760013461112976, payload={'Id': 23, 'News Article': "纽约邮报新闻:'科学突破'导致了50年来第一种能杀死耐药细菌的抗生素的发现", 'Country': '美国', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None),
 ScoredPoint(id=72, version=0, score=0.31487736105918884, payload={'Id': 72, 'News Article': '大思考新闻:以一声巨响开始的播客#101 - 量子计算', 'Country': '美国', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None),
 ScoredPoint(id=37, version=0, score=0.2717020809650421, payload={'Id': 37, 'News Article': '科技Crunch新闻:哈佛的机器人外骨骼可以改善走路,减少帕金森病患者的跌倒', 'Country': '美国', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None),
 ScoredPoint(id=34, version=0, score=0.2585242688655853, payload={'Id': 34, 'News Article': '山丘新闻:为何对“三疫”恐惧加剧', 'Country': '美国', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None),
 ScoredPoint(id=113, version=0, score=0.24455253779888153, payload={'Id': 113, 'News Article': "福克斯商业新闻:专家对制药巨头礼来公司的新网站表达关切,该网站将患者与肥胖药物联系起来", 'Country': '美国', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None)]

让我们尝试Geo多边形搜索。Geo多边形搜索对于定义不规则形状的区域(例如国家边界)非常有用。多边形由外部和内部环定义,每个环由特定的经纬度点组成。纬度和经度坐标的精确匹配将是位于外部和内部边界之间的点。在这里,我们只设置外部边界。

让我们检查我们的*“新闻文章”*数据将落在的坐标上。

import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

# GeoPolygon 的坐标
polygon_coords = [
    [-130, 70],
    [-120, 0],
    [200, -50],
    [140, 20],
    [40, 100],
]

# 我们数据集中点的坐标
lon = [-100.445882, 78.6677428, -107.991707, -3.2765753, 134.755, 172.8344077]
lat = [39.7837304, 22.3511148, 61.0666922, 54.7023545, -24.7761086, -41.5000831]

# 创建图表
fig, ax = plt.subplots()

# 绘制GeoPolygon
polygon = Polygon(polygon_coords, closed=True, edgecolor='b', alpha=0.3)
ax.add_patch(polygon)

# 绘制点
ax.scatter(lon, lat, color='r', label='数据点')

# 设置轴标签
ax.set_xlabel('经度')
ax.set_ylabel('纬度')

# 显示图例
ax.legend()

# 显示图表
plt.show()

图表将如下所示:

在这里插入图片描述

现在,让我们用Geo多边形坐标进行查询。

polygon_coords = [
 [-130, 70],
 [-120, 0],
 [200, -50],
 [140, 20],
 [40, 100],
]
search_term = "科学突破"
# 使用多边形坐标调整后的GeoPolygon
geo_polygon = models.GeoPolygon(
 exterior=models.GeoLineString(
 points=[
 models.GeoPoint(lon=polygon_coords[0][0], lat=polygon_coords[0][1]),
 models.GeoPoint(lon=polygon_coords[1][0], lat=polygon_coords[1][1]),
 models.GeoPoint(lon=polygon_coords[2][0], lat=polygon_coords[2][1]),
 models.GeoPoint(lon=polygon_coords[3][0], lat=polygon_coords[3][1]),
 models.GeoPoint(lon=polygon_coords[4][0], lat=polygon_coords[4][1]),
 ]
 )
)
# 在搜索查询中使用调整后的GeoPolygon
search_result = client.search(
 collection_name="geo_collection",
 query_vector=model.encode(search_term),
 query_filter=Filter(
 must=[
 FieldCondition(
 key="location",
 geo_polygon=geo_polygon
 )
 ]
 )
)
search_result

以下将是结果。我们这里得到了10个结果。

[ScoredPoint(id=23, version=0, score=0.5760013461112976, payload={'Id': 23, 'News Article': "纽约邮报消息:‘科学突破’导致发现50年以来第一种可杀死耐药细菌的抗生素", 'Country': '美国', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None),
 ScoredPoint(id=40, version=0, score=0.3289460241794586, payload={'Id': 40, 'News Article': '未来主义新闻:科学家对字面上读取你思想的设备表示担忧', 'Country': '新西兰', 'location': {'lat': -41.5000831, 'lon': 172.8344077}}, vector=None, shard_key=None),
 ScoredPoint(id=103, version=0, score=0.3289460241794586, payload={'Id': 103, 'News Article': '未来主义新闻:科学家对字面上读取你思想的设备表示担忧', 'Country': '加拿大', 'location': {'lat': 61.0666922, 'lon': -107.991707}}, vector=None, shard_key=None),
 ScoredPoint(id=72, version=0, score=0.31487736105918884, payload={'Id': 72, 'News Article': '大思想新闻:以一个爆炸开始的播客#101 - 量子计算', 'Country': '美国', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None),
 ScoredPoint(id=48, version=0, score=0.2746903598308563, payload={'Id': 48, 'News Article': '印度时报新闻:4种蘑菇食谱可帮助冬季促进维生素D摄入', 'Country': '英国', 'location': {'lat': 54.7023545, 'lon': -3.2765753}}, vector=None, shard_key=None),
 ScoredPoint(id=37, version=0, score=0.2717020809650421, payload={'Id': 37, 'News Article': '科技Crunch新闻:哈佛的机器人外骨骼可以改善行走,减少帕金森病患者的跌倒', 'Country': '美国', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None),
 ScoredPoint(id=34, version=0, score=0.2585242688655853, payload={'Id': 34, 'News Article': '山新闻:为什么对‘三重流行病’的恐惧在激增', 'Country': '美国', 'location': {'lat': 39.7837304, 'lon': -100.445882}}, vector=None, shard_key=None),
 ScoredPoint(id=57, version=0, score=0.249062180519104, payload={'Id': 57, 'News Article': '三星新闻:三星在Unpacked 2024之前预告大城市移动体验的发展', 'Country': '加拿大', 'location': {'lat': 61.0666922, 'lon': -107.991707}}, vector=None, shard_key=None),
 ScoredPoint(id=79, version=0, score=0.249062180519104, payload={'Id': 79, 'News Article': '三星新闻:三星在Unpacked 2024之前预告大城市移动体验的发展', 'Country': '加拿大', 'location': {'lat': 61.0666922, 'lon': -107.991707}}, vector=None, shard_key=None),
 ScoredPoint(id=14, version=0, score=0.249062180519104, payload={'Id': 14, 'News Article': '三星新闻:三星在Unpacked 2024之前预告大城市移动体验的发展', 'Country': '印度', 'location': {'lat': 22.3511148, 'lon': 78.6677428}}, vector=None, shard_key=None)]

我们的搜索结果明显表明,向量数据库在实现人工智能驱动的地理感知新闻搜索中非常有用。

结论

在 News API 和 PyCountry 的帮助下,我们创建了一个自定义的新闻文章数据集。使用 GeoPy,我们定义了国家的位置,这帮助我们在 Qdrant 向量数据库中进行地理空间向量搜索。结果证明我们从数据库中获得了预期的结果。

猜你喜欢

转载自blog.csdn.net/wjjc1017/article/details/141903720