Я пытаюсь найти лучший алгоритм для моего конкретного приложения. Я искал на SO, Google, читал различные статьи о расстояниях Левенштейна и т. Д., Но, честно говоря, это немного выходит за рамки моей компетенции. И большинство, кажется, обнаруживают, насколько похожи две входные строки, как расстояние Хемминга между строками.
То, что я ищу, - это другое, поиск нечетких записей (и я уверен, что для него есть название, которого я не знаю в Google). Я уверен, что кто-то уже решил эту проблему раньше, и я ищу рекомендацию, чтобы указать мне правильное направление для моего дальнейшего исследования.
В моем случае мне нужен нечеткий поиск в базе данных записей музыкальных исполнителей и их альбомов. Как вы можете себе представить, в базе данных будут миллионы записей, поэтому алгоритм, который хорошо масштабируется, имеет решающее значение. На мой вопрос не важно, что Artist и Album находятся в разных столбцах, база данных может просто хранить все слова в одном столбце, если это поможет при поиске.
База данных для поиска:
|-------------------|---------------------|
| Artist | Album |
|-------------------|---------------------|
| Alanis Morissette | Jagged Little Pill |
| Moby | Everything is Wrong |
| Air | Moon Safari |
| Pearl Jam | Ten |
| Nirvana | Nevermind |
| Radiohead | OK Computer |
| Beck | Odelay |
|-------------------|---------------------|
Текст запроса будет содержать от одного слова во всей конкатенации Artist_Album до всей вещи. Текст запроса поступает из OCR и, скорее всего, имеет транспонирование в один символ, но, скорее всего, слова не имеют правильного порядка. Кроме того, в поиске могут быть дополнительные слова, которые не являются частью альбома (например, текст обложки). Например, «OK Computer» может быть вверху альбома, а «Radiohead» - под ним, или в некоторых альбомах текст размещен в столбцах, которые перемешивают порядок слов.
Возможные строки поиска:
C0mputer Rad1ohead
Pearl Ten Jan
Alanis Jagged Morisse11e Litt1e Pi11
Air Moon Virgin Records
Moby Everything
Обратите внимание, что при использовании OCR некоторые буквы будут выглядеть как цифры или полностью неправильные буквы (Ян вместо Jam). А в случае OK Computer Radiohead и Moby Все неправильно *1022* текст запроса даже не содержит всех слов. В случае Air Moon Safari дополнительные слова Virgin Records ищутся, но Safari отсутствует.
Существует ли общий алгоритм, который мог бы возвращать единственный наиболее вероятный результат из базы данных, и если ни один из них не соответствует некоторому пороговому значению "вероятности", он ничего не возвращает? Я на самом деле разрабатываю это на Python, но это всего лишь бонус, я больше ищу, где начать исследования.