|
|
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
Предлагаю мой вариант решения проблемы дубликатов. Пользователю представляются на рассмотрение пары (строка, потенциальный дубликат). Для каждой пары пользователь может нажать кнопку: "справа дубликат", или "слева дубликат". Всего пар - N(N - 1) / 2, желательно не предоставлять 499500 пар на рассмотрение, а предоставить как можно меньше, при этом желательно, чтобы как можно больше настоящих дубликатов все же были выданы пользователю на рассмотрение. Если для каждой строки выбрать начинающиеся на ту же букву - будет ~30000 пар - все еще очень много. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2008, 16:58 |
|
||
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
gpПредлагаю мой вариант решения проблемы дубликатов. Пользователю представляются на рассмотрение пары (строка, потенциальный дубликат). Для каждой пары пользователь может нажать кнопку: "справа дубликат", или "слева дубликат". Всего пар - N(N - 1) / 2, желательно не предоставлять 499500 пар на рассмотрение, а предоставить как можно меньше, при этом желательно, чтобы как можно больше настоящих дубликатов все же были выданы пользователю на рассмотрение. Если для каждой строки выбрать начинающиеся на ту же букву - будет ~30000 пар - все еще очень много. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. Ну, не знаю... Есть же нормальные (хоть и старые) алгоритмы. Например, SOUNDEX: строится ХЭШ-значение для слова по определнному алгоритму. Хэш получается вида Бххх, где Б-первая буква слова, ххх - цифровой код на основании анализа согласных букв слова (все гласные пропускаются)... Это можно оформить в функцию (хранимую процедуру) и выдавать только те записи, где Soundex(left) == Soundex(right). Есть только одно "но": я встречал описание данного алгоритма исключительно для латиницы. Для кириллицы, ИМХО, он должен быть слегка видоизменен... Но, судя по Вашему примеру, Вам этот алгоритм подойдет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2008, 07:33 |
|
||
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
Здесь смотри: тынЦ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2008, 11:13 |
|
||
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
Результат с soundex примерно такой же как с difference, разницы я не увидел, только к тому же нету нормы, разве что считать difference(soundex(a), soundex(b)) С кирилицей вилы. Разве что транслитерировать втупую, и опять soundex / difference. Суть была больше в интерфейсе для сопоставления. Человек сидит, и тупо просматривает пары, нажимает одну из трех кнопок - слева дубликат, справа дубликат, вообще не дубликат По ходу устранения дубликатов, желательно обновлять вид, чтобы не показывать пары с удаленными записями. Вот только не понятно, как поступать при указании дубликата записи, которая сама потом окажется дубликатом? Наверное, нужно скорее две кнопки - дубликаты - не дубликаты, а уже после завершения просмотра, показать группы выявленных взаимных дубликатов, и потребовать указать оригинал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2008, 17:47 |
|
||
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
gpРезультат с soundex примерно такой же как с difference, разницы я не увидел, только к тому же нету нормы, разве что считать soundex(a), soundex(b)) Это как раз математически принципиально. soundex(a) = soundex(b) задает отношение эквивалентности на множестве проверяемых элементов, а difference(a,b) < Limit - отношение толератности, не транзитивное. Практически это может вести к коллизиям типа: ABCD ABCY АВXD ABXY и сколько элементов оставлять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 11:09 |
|
||
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
авторЭто как раз математически принципиально. soundex(a) = soundex(b) задает отношение эквивалентности на множестве проверяемых элементов, а difference(a,b) < Limit - отношение толератности, не транзитивное. Практически это может вести к коллизиям типа: ABCD ABCY АВXD ABXY и сколько элементов оставлять? А кто говорил об эквивалентности? Она то как раз и противопоказана. Главное - не пытаться заставить машину делать то, что ей не противопоказано делать, а именно - принимать решения. Как вам вот это: select soundex('sushi') == S200 select soundex('sashimi') == S250 select soundex('susha') == S200 С отношением эквивалентности я гарантировано теряю синонимы sushi != sashimi, и получаю бредовое sushi == susha Задача стоит не в том, чтобы машина принимала решение, а в том, чтобы свести перебор пользователем N^2 записей перебору значительно меньшего колличества, предположительно C N ln(N). При этом, я сортирую дубликаты в порядке злостности, для этого я использую пространство с метрикой (5 - difference(a,b) - case when lower(a)=lower(b) then 1 else 0 end), а отношение эквивалентности будет задано пользователем, уже в другом пространстве. Вообще говоря, метрика может быть более адекватной, но это не суть. PS Я знаю разницу между суши и сашими :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 14:52 |
|
||
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
gpА кто говорил об эквивалентности? Она то как раз и противопоказана. Главное - не пытаться заставить машину делать то, что ей не противопоказано делать, а именно - принимать решения. Дубликат == эквивалент: Если А дубликат Б и Б дубликат В то А дубликат В. gp Как вам вот это: select soundex('sushi') == S200 select soundex('sashimi') == S250 select soundex('susha') == S200 С отношением эквивалентности я гарантировано теряю синонимы sushi != sashimi, и получаю бредовое sushi == sushaТеряете, ибо неподходяще выбран критерий дублирования, вот и все. gp Задача стоит не в том, чтобы машина принимала решение, а в том, чтобы свести перебор пользователем N^2 записей перебору значительно меньшего колличества, предположительно C N ln(N).Именно. Тупой алгоритм понимает, что это одно и тоже, но не спобен понять тонкой разницы - кого же оставить. З.Ы. Зачем N^2 ? Чтобы действительно (N-1)*N/2 : Код: plaintext При этом, я сортирую дубликаты в порядке злостности, для этого я использую пространство с метрикой (5 - difference(a,b) - case when lower(a)=lower(b) then 1 else 0 end), а отношение эквивалентности будет задано пользователем, уже в другом пространстве. Вообще говоря, метрика может быть более адекватной, но это не суть. PS Я знаю разницу между суши и сашими :) Разница как раз в объеме работы для юзера. Если есть критерий дублирования, то юзеру (ЛПР) можно вывалить всю очередную пачку эквивалентов чтобы он выбрал один из них как правильный. При этом один элемент будет предявлен ЛПР максимум один раз. Если есть только критерий схожести, то придется идти по парам, и один элемент может быть предъявлен ЛПР несколько раз. Типа Комп: Берем ABCD. На него похожи ABCY и АВXD. ЛПР: Это все разные вещи. Комп: Берем ABCY. На него похожи ABCD (ой , ЛПР уже сказал что они разные - не буду переспрашивать), ну хорошо, а ABXY? ЛПР: ABCY фтопку, ABXY оставить. Комп: Берем АВXD. На него похож ABXY. ЛПР: Это все разные вещи. Комп: ГОТОВО. 7 предъявлений при 4х элементах. ABXY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2008, 17:57 |
|
||
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
ModelR Комп: Берем ABCD. На него похожи ABCY и АВXD. ЛПР: Это все разные вещи. Комп: Берем ABCY. На него похожи ABCD (ой , ЛПР уже сказал что они разные - не буду переспрашивать), ну хорошо, а ABXY? ЛПР: ABCY фтопку, ABXY оставить. Комп: Берем АВXD. На него похож ABXY. ЛПР: Это все разные вещи. Комп: ГОТОВО. Сдесь у Вас ошибка. Дело в том, что с отношением эквивалентности вы не получите пары {ABCY,ABXY} потому что из свойства транзитивности: Из ABCY = ABXY следует ABXY = ABCD и ABXY = АВXD, тогда почему в первой строчке вы не указали ABXY? И ошибка эта именно из за того, что отношение эквивалентности не позволяет построить такой алгоритм. Представьте, что вы расположили точки на тетрадном листе в клетку. Нужно найти все пары тех, что ближе полусантиметра друг от друга. Образно говоря, то что предлагаете вы - это считать парами все, что находится в пределах одной клетки, хотя пара точек из соседних клеток может оказаться гораздо ближе друг к другу, чем точки одной клетки, что я вам и проиллюстрировал на примере (sushi sashimi susha), и в приложенной иллюстрации. ModelRТеряете, ибо неподходяще выбран критерий дублирования, вот и все. Он, для вашего алгоритма - всегда выбран не подходяще, потому что критерий дублирования - прерогатива пользователя, а не машины. PS Предложение ввести кнопку - "это все не дубликаты" - надо будет принять к сведению, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 14:11 |
|
||
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
Так вам надо дубликаты или синонимы? Заметьте - это разные вещи (!). Дубликаты подразумевают, что soundex(a) = soundex(b) с учетом возможных ошибок написания со слуха (вспомните парные глухие и звонкие согласные: Б-П, Г-К, З-С, Д-Т, В-Ф и т.д.). Например: Дубликатами-кандидатами по soundex() будут Иванов, Иванова, Ивановы, Ивонов, Ивонв и т.д.(какие только "изумительные" ошибки не делают при вводе Фамилии, Имени, Отчества), а дальше уже пользователь выберет реальные дубликаты Синонимы - слова близкие по смыслу, но разные по написанию. Поэтому они не будут являться дубликатами (Например, ключ - родник - источник или автомобиль - машина или компьютер-машина-ПиСюк). Здесь уже не поможет анализ слова, надо делать смысловой анализатор (aka искуственный интеллект). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 15:01 |
|
||
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
Я автоматизирую поиск дубликатов, тоесть записей, которые в реальном мире соответствуют одной и той же сущности. Причем здесь синонимы? Какие смысловые анализаторы? Это обычные опечатки, в основном, и родовая травма доставшейся "в наследство" базы, где можно даже создать два бренда с одинаковым названием, без разницы в регистре слов, так что теперь даже самый тривиальный уникальный индекс нельзя наложить на поле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 18:48 |
|
||
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
gp ModelR Комп: Берем ABCD. На него похожи ABCY и АВXD. ЛПР: Это все разные вещи. Комп: Берем ABCY. На него похожи ABCD (ой , ЛПР уже сказал что они разные - не буду переспрашивать), ну хорошо, а ABXY? ЛПР: ABCY фтопку, ABXY оставить. Комп: Берем АВXD. На него похож ABXY. ЛПР: Это все разные вещи. Комп: ГОТОВО. Сдесь у Вас ошибка. Дело в том, что с отношением эквивалентности вы не получите пары {ABCY,ABXY} потому что из свойства транзитивности: Из ABCY = ABXY следует ABXY = ABCD и ABXY = АВXD, тогда почему в первой строчке вы не указали ABXY? И ошибка эта именно из за того, что отношение эквивалентности не позволяет построить такой алгоритм.Конечно не позволяет. Дык написано же - похожи . Т.е. это как раз не для случая эквивалентности, а для толерантности (схожести). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 19:30 |
|
||
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
1. Крайне желательно иметь следующие варианты: - B,(C, D, E, ..) - полные дубликаты A (позволяет системе удалить B,(C, D, E, ..) и переконфигурировать ссылки) - А и B,(C, D, E, ..) описывают один объект, но в каждом из них присутствует информация об объекте, которой нет в других - Исключить пары из дальнейшего анализа дубликатов. 2. В случае сложных объектов часто нужно иметь возможность сравнивать не только сами объекты, но и их связи. 3. Часто нужно быть готовым к тому, что строки, использующиеся для идентификации объектов (а их может быть не одна) введены на разных языках и/или трансилитирированы 4. Нужно быть готовым, что удаление дубликатов - это перманентная активность 5. В некоторых ситуациях дубликаты могут находится в разных таблицах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2008, 09:46 |
|
||
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
drev1. Крайне желательно иметь следующие варианты: - B,(C, D, E, ..) - полные дубликаты A (позволяет системе удалить B,(C, D, E, ..) и переконфигурировать ссылки) - А и B,(C, D, E, ..) описывают один объект, но в каждом из них присутствует информация об объекте, которой нет в других - Исключить пары из дальнейшего анализа дубликатов. 2. В случае сложных объектов часто нужно иметь возможность сравнивать не только сами объекты, но и их связи. 3. Часто нужно быть готовым к тому, что строки, использующиеся для идентификации объектов (а их может быть не одна) введены на разных языках и/или трансилитирированы 4. Нужно быть готовым, что удаление дубликатов - это перманентная активность 5. В некоторых ситуациях дубликаты могут находится в разных таблицах 6. Кандидаты, найденные тем же алгоритмом, должны быть показаны пользователю в момент заполнения новой записи. Применение этой функции в интерфейсе должно быть обязательным, а не факультативным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2008, 14:15 |
|
||
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
gp drev 6. Кандидаты, найденные тем же алгоритмом, должны быть показаны пользователю в момент заполнения новой записи. Применение этой функции в интерфейсе должно быть обязательным, а не факультативным. 1. это не всегда возможно, например, в случае независимого ввода и слияния 2. это не всегда удобно, например, в случае большого количества возможных дубликатов 3. это не всегда осмысленно, например, в случае ввода данных человеком, который не сможет распознать дубликат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2008, 08:03 |
|
||
|
Поиск дубликатов по схожести
|
|||
|---|---|---|---|
|
#18+
drev 1. это не всегда возможно, например, в случае независимого ввода и слияния 2. это не всегда удобно, например, в случае большого количества возможных дубликатов 3. это не всегда осмысленно, например, в случае ввода данных человеком, который не сможет распознать дубликат Ну да, и вообще степень запущенности может быть такой, что проще создать заново чем править:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2008, 10:28 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35233173&tid=1543940]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 240ms |
| total: | 407ms |

| 0 / 0 |
