Концепция нечеткого поиска в базе данных


13

Я думал об этом и пытался найти решения о том, как нечеткий поиск в базе данных, если, например, пользователь вводит орфографическую ошибку. Есть какие-то явные проблемы с логикой этого? Будет ли это работать и было ли это сделано раньше?

Наш стол мы хотим найти:

**tblArticles**
Body - Soundex_Body - CharacterCoded_Body

Поэтому мы храним необработанное текстовое тело для физического отображения. Другие 2 столбца используются для поиска, который рассчитывается следующим образом:

Саундэкс

Тело разделено на слова и переведено в версию soundex. IE, получающееся тело могло бы быть чем-то вроде:

H252 B54 C23 E33... etc

Таким образом, кто-то может войти в «динозавр», а текст статьи гласит «динозавр», оба они оценивают как B26. Затем мы запускаем LIKE для значения soundex поискового термина.

Кодировка персонажа

Учитывая отображение символов, которое отображает символы в простые числа, IE:

h = 2
e = 3
l = 5
o = 7
p = 11
c = 13

help = 2*3*5*11     =   330
hello = 2*3*5*5*7   =   1050
hell = 2*3*5*5      =   150
hlep = 2*5*3*11     =   330
cello = 13*3*5*5*7  =   6825

Если пользователь хотел напечатать «привет», но он переключил два или более символов, например, «hlelo», он оценил бы одно и то же число. Разделите необработанное тело на слова, просто закодируйте каждое слово и сохраните в базе данных, получив поле, которое выглядит следующим образом:

330 6825 330 1050... etc

Затем мы можем подобрать поиск по этому значению, чтобы он соответствовал опечаткам.

Преимущества

  • Опечатки защищены от
  • Фонетическое неверное написание защищено от
  • Больше не родной английский говорящий дружелюбный
  • Будет работать на любом языке (где работает soundex)

Комментарии и мысли? Этакий многослойный поиск. Конечно, вы можете взвесить возвращаемые значения, чтобы сделать его еще лучше (например, буквальное совпадение текста стоит больше), но действительно ли это хорошее решение для орфографических ошибок и поиска не носителями английского языка?


Было бы интересно увидеть, как это сравнивается с Trigram Search.
— Рич

Я хотел бы иметь что-то вроде этого для WordPress ...
— Кит Менке

Делает ли использование простых чисел для вашей функции хеширования невозможным столкновение слов, которое не включает идентичные методы? Кажется, что должно быть возможно иметь длинное слово с большим количеством букв младшего значения, которое хэшируется до того же значения, что и короткое слово с несколькими буквами высокого значения, но я не знаю много теории чисел, поэтому это, вероятно, хорошо доказано, так или иначе ...
— Glenatron

1
@Glen Afaik умножая простые числа всегда генерирует уникальное число. Однако анаграммы будут сталкиваться, но я не знаю, какая это большая проблема, в этом и заключается смысл быстрого поиска анаграмм.
— Том

@Glen: см. Теорему об уникальной факторизации для уникальности.
— Стивен Эверс

Ответы:


2

Есть ряд других алгоритмов поиска. Смит-Уотерман - один из лучших для человеческого текста, в то время как BLAST (пока) - лучший для поиска последовательностей ДНК. Когда вам представлен текст с различными орфографическими ошибками, такими как hlepвместо help, то вы ищете минимальное расстояние редактирования .

Для библиотеки для реализации ряда этих функций в CLR в SQL Server 2005 (и более поздних версиях) посмотрите исходный проект forge подделки SimMetrics . Сообщение в блоге о SimMetrics .
http://staffwww.dcs.shef.ac.uk/people/S.Chapman/simmetrics.html

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


2

Apache Solr, поддерживает синонимы и исправления орфографии - хотя это все еще немного грубо по краям.

Нечеткие поиски могут быть реализованы с помощью Ngrams,

Портер Стеммер: http://tartarus.org/~martin/PorterStemmer/

и языковая база данных, такая как http://wordnet.princeton.edu/

... но такие проекты, как Xapian и Solr, справятся с этим.

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


1

Некоторое время назад я делал что-то подобное для адресов, которые проверяли бы, сколько изменений потребуется, чтобы преобразовать одну строку в другую, и возвращали числовое значение в диапазоне от 0 до 1, чтобы определить, насколько близко они совпадают.

Это сработало замечательно, поскольку возвращало большое значение для таких элементов, как N / North, St / Street, EastMain / MainEast и т. Д. Идея пришла из этой ссылки CodeProject.


Является ли код, который вы написали для сопоставления адресов с открытым исходным кодом?
— Thismatters

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

0

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

Soundex не будет соответствовать "Дик == Ричард", "Кит == Кристофер" или "Мисс. == Миссис".

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.