PostgreSQL: поиск предложений, наиболее близких к данному предложению

postgresql full-text-search tf-idf cosine-similarity

947 просмотра

2 ответа

У меня есть таблица изображений с заголовками предложений. Учитывая новое предложение, я хочу найти изображения, которые лучше всего соответствуют ему, основываясь на том, насколько близко новое предложение к сохраненным старым предложениям.

Я знаю, что могу использовать @@оператор с, to_tsqueryно tsqueryпринимает конкретные слова в качестве запросов.

Одна проблема в том, что я не знаю, как преобразовать данное предложение в значимый запрос. В предложении могут быть знаки препинания и цифры.

Однако я также чувствую, что мне нужно что-то вроде косинусного сходства, но я не знаю, как получить это из PostgresQL. Я использую последнюю версию GA и с удовольствием использую версию для разработчиков, если это решит мою проблему.

Автор: Real Geek N Источник Размещён: 12.07.2019 11:35

Ответы (2)


4 плюса

Решение

Полнотекстовый поиск (FTS)

Вы можете использовать plainto_tsquery()для (в соответствии с документацией ) ...

производить tsqueryигнорирование пунктуации

SELECT plainto_tsquery('english', 'Sentence: with irrelevant words (and punctuation) in it.')

 plainto_tsquery
------------------
 'sentenc' & 'irrelev' & 'word' & 'punctuat'

Используйте это как:

SELECT *
FROM   tbl
WHERE  to_tsvector('english', sentence) @@ plainto_tsquery('english', 'My new sentence');

Но это все еще довольно строго и только обеспечивает очень ограниченную терпимость к подобию.

Сходство триграмм

Может лучше подходить для поиска сходства , даже в некоторой степени преодолевать опечатки.

Установите дополнительный модуль pg_trgm, создайте индекс GiST и используйте оператор подобия% в поиске ближайшего соседа :

В основном, с индексом GiST триграммы sentence:

-- SELECT set_limit(0.3);  -- adjust tolerance if needed

SELECT *
FROM   tbl
WHERE  sentence % 'My new sentence'
ORDER  BY sentence <-> 'My new sentence'
LIMIT  10;

Больше:

Объединить оба

Вы даже можете объединить FTS и сходство триграмм:

Автор: Erwin Brandstetter Размещён: 05.01.2016 05:04

1 плюс

ответ довольно поздний, но я добавляю на всякий случай. Если вы добавите «: *» в конце слов, это вызовет аналогичные. Пример: JS autocomlete -> Codeigniter:

штрих-код = $ this-> input-> get ("term"). "*";

Запрос: $ query = 'select * from tablaneme где xx @@? LIMIT 15 '; $ barcodequery = $ this-> db-> query ($ query, array (explode ("", $ barcode)))) -> result_array ();

Автор: Savaş Hasçelik Размещён: 12.06.2019 11:59
Вопросы из категории :
32x32