Задать вопрос
@nano_e_t_4

Как вывести топ n самых не похожих результата?

Всем привет
Играюсь тут с векторными представлениями текстов, возник такой вопрос - как средствами хромадб вывести топ 5 самых не похожих результата?
  • Вопрос задан
  • 55 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Я не знаю что такое хромадб. Но если тебе надо найти 5 самых не похожих
то можно
- кластеризовать результат поиска на 5 кластеров
- взять для каждого кластера близкий вектор

Они и будут максимально непохожие поскольку принадлежат к разным кластерам.

Возможно есть лучшее решение. Но это вполне мне кажется приемлемое.
Ответ написан
Комментировать
rc-dm
@rc-dm
Full-Stack Web Developer
import chromadb
from chromadb.utils import embedding_functions
import numpy as np

# Инициализация ChromaDB
client = chromadb.Client()

# Создание коллекции
collection = client.create_collection(name="text_collection")

# Добавление текстов и их векторных представлений
texts = ["текст 1", "текст 2", "текст 3", "текст 4", "текст 5"]
embeddings = embedding_functions.DefaultEmbeddingFunction()(texts)

for idx, (text, embedding) in enumerate(zip(texts, embeddings)):
    collection.add(ids=[str(idx)], embeddings=[embedding], documents=[text])

# Получение всех векторов из коллекции
all_embeddings = collection.get(include=["embeddings"])["embeddings"]

# Вычисление среднего расстояния для каждого вектора
def cosine_distance(vec1, vec2):
    return 1 - np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))

average_distances = []
for i, vec1 in enumerate(all_embeddings):
    distances = []
    for j, vec2 in enumerate(all_embeddings):
        if i != j:
            distances.append(cosine_distance(vec1, vec2))
    average_distances.append(np.mean(distances))

# Сортировка по убыванию среднего расстояния
sorted_indices = np.argsort(average_distances)[::-1]

# Вывод топ n самых не похожих результатов
n = 5
top_n_indices = sorted_indices[:n]
top_n_texts = [texts[i] for i in top_n_indices]

print("Топ", n, "самых не похожих текстов:")
for text in top_n_texts:
    print(text)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы