Тонкая настройка семантического поиска
например. Предварительно обученный результат BERT для косинусного сходства предложений
======================
Query: milk with chocolate flavor
Top 10 most similar sentences in corpus:
Milka milk chocolate 100 g (Score: 0.8672)
Alpro, Chocolate soy drink 1 ltr (Score: 0.6821)
Danone, HiPRO 25g Protein chocolate flavor 330 ml (Score: 0.6692)
в приведенном выше примере я ищу молоко, результат должен быть сначала связан с молоком, но здесь он в первую очередь возвращает шоколад. как мне настроить подобие для результата?
Я погуглил, но не нашел подходящего решения, пожалуйста, помогите мне.
Код:
import scipy
import numpy as np
from sentence_transformers import models, SentenceTransformer
model = SentenceTransformer('distilbert-base-multilingual-cased')
corpus = [
"Alpro, Chocolate soy drink 1 ltr",
"Milka milk chocolate 100 g",
"Danone, HiPRO 25g Protein chocolate flavor 330 ml"
]
corpus_embeddings = model.encode(corpus)
queries = [
'milk with chocolate flavor',
]
query_embeddings = model.encode(queries)
# Calculate Cosine similarity of query against each sentence i
closest_n = 10
for query, query_embedding in zip(queries, query_embeddings):
distances = scipy.spatial.distance.cdist([query_embedding], corpus_embeddings, "cosine")[0]
results = zip(range(len(distances)), distances)
results = sorted(results, key=lambda x: x[1])
print("\n======================\n")
print("Query:", query)
print("\nTop 10 most similar sentences in corpus:")
for idx, distance in results[0:closest_n]:
print(corpus[idx].strip(), "(Score: %.4f)" % (1-distance))
1 ответ
попробовать порог на расстоянии
import scipy
импортировать numpy как np из моделей импорта предложения_transformers, модель SentenceTransformer = SentenceTransformer('distilbert-base-multingual-cased')
corpus = ["Alpro, Шоколадный соевый напиток 1 л", "Молочный шоколад Milka 100 г", "Danone, HiPRO 25 г Протеиновый шоколад со вкусом 330 мл"] corpus_embeddings = model.encode (corpus)
query = ['молоко со вкусом шоколада',]query_embeddings = model.encode(запросы)
Вычислить косинусное подобие запроса для каждого предложения i
closest_n = 10 для запроса, query_embeddings в zip(запросы, query_embeddings): distance = scipy.spatial.distance.cdist([query_embedding], corpus_embeddings, «косинус»)[0]
results = zip(range(len(distances)), distances)
results = sorted(results, key=lambda x: x[1])
print("\n======================\n")
print("Query:", query)
print("\nTop 10 most similar sentences in corpus:")
for idx, distance in results[0:closest_n]:
if 1-distance>0.7:
print(corpus[idx].strip(), "(Score: %.4f)" % (1-distance))