C/C++

Как реализовать поиск похожей строки в базе данных?

Постараюсь объяснить, что требуется. Это нечто на подобие нейросети.
Представит базу данных с 1 млн строк, каждая строка это набор слов(например):
1. собака кот стул дерево свинья пушка
2. ложка кран кот суп
Количество слов(в каждой строке) большое(например до 100 слов), в каждой строке разное количество слов.
Далее на вход подается строка(набор слов). Задача: найти строки(из базы данных), которые максимально совпадают с заданной строкой. Предположим на 97% совпало со строкой №717392, также на 95% совпало со строкой №1811 и тд.

Сама база данных еще не создана, мне предстоит создать её такой что бы по ней было максимально эффективно искать совпадения.
Как это все лучше реализовать? И желательно что бы шустро работало, так как например поисковик Гугл(если вставить цитату из книги он сразу находит на каком-то сайте её текст).
Vovik13 Artiuhov
Vovik13 Artiuhov
3
Критерий релевантности не определён. Сравниваемые строки могут быть разных размеров!! Слова в сравниваемых строках могут совпадать по значению, но не совпадать по позиции в тексте. Как быть со знаками препинания и регистром символов? Что делать если в сравниваемых строках слова с одинаковым значением встречаются несколько раз и их количество не совпадает? Как поступать с орфографическими ошибками? (задание с звёздочкой)

А вообще-то, надо делать словарь, так как у вас 1.000.000 строк по 100 слов – это максимум 100.000.000 слов, а следовательно они будут повторятся, поэтому проще будет хранить таблицу строк из целочисленных ключей, ссылающихся на таблицу слов по уникальному ключу. Грузить данные придётся частями в несколько запросов, выполняемых в параллельных потоках. Запросы выполнять с использованием хранимых процедур (так быстрее). Выборку делать по принципу поиска абсолютных несовпадений с последующим их исключением (так как чаще строки будут абсолютно не совпадать). Полученные таким образом данные хранить в структурах с полями: int id – номер строки, float q – коэффициент совпадения (0.0 < q <= 1.0), умножив который на 100 получите значение в процентах. Отсортировав вектор структур по коэффициентам от большего к меньшему получите результат, при котором вначале вектора будут лучшие варианты совпадений. Для простоты сортировки в структуре перегрузите operator< и operator>
Роман Огнёв
Роман Огнёв
60 249
Лучший ответ
>Как это все лучше реализовать?
При помощи имеющихся в твоей СУБД встроенных функций оценки совпадений строк. Поскольку СУБД ты заботливо не указал, ничего более конкретного сказать невозможно.
Хочу только заметить, что на данные функции не действуют никакие индексы и все прочие ухищрения, тебе придется сравнить каждую строку с каждой. То есть если у тебя там миллион строк, придется сделать полтриллиона сравнений. И вернется полтриллиона строк с проставленными оценками совпадений.
Ну а гугель работает путем индексации слов и всяких хитромудрых их оценок важности и всего прочего. В твоем случае так оно не сработает, иначе придется написать собственный гугель.
Максим Боян
Максим Боян
50 396
Vovik13 Artiuhov Есть сервис такой findface, он удален из гугла(но на его основе есть телеграмм боты). Он для поиска человека вк по его фото, но также он находит и его двойников(десятки человек). И работает быстро.
Думаете у них стоят супер-мощные сервера, которые сравнивают каждое лицо(его биометрические данные) со всей БД? И это ж много пользователей параллельно ищут.
Мне не надо такое создавать, честно, но мое очень похожее по принципу. надо реально сравнить строку(как набор этих биометрических данных лица) с БД этих строк(типо лиц).
Вот если этот findface, как бы вы сказали он работает?
Вариант: Postgresql - pg_trgm
Алексей Сурков
Алексей Сурков
73 814
"которые максимально совпадают с заданной строкой. "
А где у тебя четкое определение величины совпадения?
Такое, как у гугги у тебя никогда не будет.
Более того, из тебя врядл ли выйдет приемлемый прогер.