|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
28.12.2012, 08:23 | #1 |
Форумчанин
Регистрация: 25.09.2008
Сообщений: 209
|
Базы данных: нечёткий поиск строк
Здравствуйте!
Возникла проблема, которая видится довольно типичной. На всякий случай дам предысторию вопроса. Сразу скажу, что в теории и практики БД не силён Есть несколько (пусть для определённости, две) баз данных, в которых должна содержаться идентичная информация. Например, в моём случае, информация об изделиях, в частности, о радиоэлементах. И базы данных есть производственная, а вторая - у конструкторов. Каждый радиоэлемент идентифицируется своим обозначением - текстовая строка. В общем виде он идентифицируется несколькими полями, но я думаю это уже не принципиальные детали, хотя не факт. Проблема в том, что исторически базы данных были получены из различных источников. На производстве их забивали одни люди, в конструкторском отделе - другие, поэтому куча несогласованностей и главное, конечно же, ошибок. Стоит задача свести эти базы воедино. Решение проблемы сводится к вопросу поиска "нечёткого" поиска по базе данных. То есть, имеется база данных, в которой некоторое текстовое поле ("обозначение") идентифицирует искомый объект. Оператор в клиентской программе вводит предполагаемое обозначение искомого объекта и запускает процедуру поиска. Проблема в том, что база данных содержит ошибки, к тому же, ошибки могут возникнуть при вводе искомого обозначения. Поэтому требуемый результат поиска - список "подходящих" объектов. Некоторые ошибки типичны (например, вместо нолика "0" стоит большая буква "О", русские буквы забиты схожими в латинице (или наоборот), некоторые не совсем типичны: поставлен лишний пробел, пробела не хватает, пропущена или указана лишняя цифра и т.п. Возможно ли каким-либо образом средствами баз данных (в наличии оракл) организовать такой поиск, нет ли штатных средств для этого? Например, встречал множество различных алгоритмов и даже готовых функций по "нечёткому" сравнению строк, решение "в лоб" - выковырять ключевое поле, по которому производится поиск, в массив, а затем организовать поиск по массиву. Может, возможно это сделать более цивилизованными средствами, как-нибудь привинтить к БД? Или более того - технология соответствующая имеется? |
28.12.2012, 08:45 | #2 |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,834
|
Придумать какой-нибудь алгоритм нормализации, по принципу Soundex. К примеру, выкидывать пробелы и знаки препинания, приводить артикулы к одной длине, дополняя пробелами, заменять нули на "О" и т. п. Может даже хватить обычной функции replace. Потом нормализированные части как-то склеивать в строку и сравнивать с нормализованной строкой на другой стороне.
В разработке: воспроизводственный контур ИТ
|
28.12.2012, 10:41 | #3 | |
Форумчанин
Регистрация: 25.09.2008
Сообщений: 209
|
Цитата:
Но с нормализацией как раз и приходим к исходной задаче. Имеем теперь уже лишнее, нормализованное поле, по которому проводим поиск. Но поиск всё тот же - "нечёткий", т.к. нормализация устранит ошибки "первого" типа, ошибки другого типа - пропуск или ввод лишних символов не учитываются и простым sql-запросом, насколько понимаю, этого не сделать. т.е. функцию хоррошего сравнения двух строк сделать не вопрос, вопрос в том, как её вставить в базу данных. Ну ладно у меня сейчас БД небольшая, не больше полумиллиона записей, можно в массив отдублировать и перебирать его. Ну а как их больше будет? Нет ли стандартных механизмов? Вот в поисковике гугла, к примеру, если орфографическую ошибку сделал, пропустил или лишнюю букву в слове набрал - тот сразу подставляет правильный вариант. Как он его находит? хотя... русских слов-то как раз не так уж и много, можно удалённой процедурой искать подходящие. |
|
28.12.2012, 16:36 | #4 | |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,834
|
Цитата:
Придумываем функцию хеширования или "рафинирования", -- не знаю, как правильно назвать. Можно даже попробовать поискать теорию, как работает алгоритм в Google. Скорее всего, она проработана и открыта, а не конкретно Google или "Яндекс" ее придумал.
В разработке: воспроизводственный контур ИТ
Последний раз редактировалось Vapaamies; 28.12.2012 в 16:39. |
|
05.03.2014, 11:01 | #5 |
Форумчанин
Регистрация: 25.09.2008
Сообщений: 209
|
Забыл отписаться. В оракле, (начиная с 9го, если не ошибаюсь) нечёткий поиск - штатная функция
|
05.03.2014, 20:50 | #6 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
|
05.03.2014, 21:13 | #7 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
06.03.2014, 09:34 | #8 |
Форумчанин
Регистрация: 28.06.2010
Сообщений: 189
|
Я когда-то использовал функцию (Levenshtein distance), которая определяет на сколько символов отличаются две строки. Потом сравнивал это кол-во символов с заданным числом (на сколько максимум могут отличаться) и делал вывод - похожа строка или нет.
В твоем случае можно было бы применить к нормализованным строкам. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
поиск строк и копирование ячеек с этих строк | Santla789 | Microsoft Office Excel | 2 | 19.11.2012 11:15 |
Поиск из базы данных в Delphi | ДваДваВо7 | Помощь студентам | 0 | 30.05.2012 20:19 |
Извлечение нескольких строк из базы данных в отдельную ячейку. Проблема. | MF-er | Microsoft Office Excel | 12 | 20.07.2011 08:32 |
Поиск для базы данных в Delphi | Марк Охман | БД в Delphi | 5 | 17.03.2011 01:08 |
Несколько задач на делфи: графика, программирование с пом. строк и базы данных. | Pina_Kolada | Помощь студентам | 3 | 25.12.2010 14:53 |