2012-01-25 2 views
3

У меня есть ~ 25.000 различных имен в базе данных SQL, и я хотел бы выполнить сравнение расстояний между ними для нормализации, например. John Doe & Jhon Doe.Сравнение больших массивов

Когда db было всего около 1000 имен, я использовал для хранения всех различных имен в массиве. Затем я использовал бы два цикла for-loops на этом массиве, тем самым сравнивая каждый элемент в массиве с каждым из остальных. Когда расстояние редактирования дало совпадение, скажем,> 0,9, я бы выполнил SQL-запрос, заменяя одно значение для другого во всех записях.

С моей гораздо большей базой данных это невозможно. Что бы вы сделали, ребята?

ps: Мне также интересны любые многопоточные решения для этого, потому что процесс уходит сейчас.

имп: Я кодирование в Java

+0

- это имена в одной таблице? какую функцию вы используете для сравнения имен? –

+0

Возможно ли это на стороне БД? Если это так, я предпочитаю это. В противном случае может быть что-то вроде концепции fork/join может быть полезно. – kosa

+0

Это в основном один большой массив имен, который сравнивается с самим собой. Я не думаю, что это возможно на стороне БД, потому что я вычисляю метрику по каждой комбинации двух имен, чтобы убедиться, что они похожи (для исправления орфографических ошибок и т. Д.). – Freek8

ответ

1

Как насчет вычисления soundex каждого из ваших имен и, возможно, его сохранения в базе данных? Вы даже можете сделать это на стороне БД, например, есть a MySQL SOUNDEX function.

После вычисления soundex каждого имени все, что вам нужно сделать, это группировать строки по одинаковому soundex.

EDIT:

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

+0

Мне действительно не нравится Soundex, но мне нравится использовать его для выбора кандидатов. Тем более, что существует функция mysql soundex. – Freek8

1

Там нет никакого способа вокруг согласования парного: так же эффективно, как он получает.

Если вам нужно сделать вашу запись связи быстрее, попробуйте использовать строку, расстояние метрику, что требует меньше вычислений, чем редактирование расстояние (Bonacci distance, Jaro–Winkler distance и т.д.)

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

+0

Я использую Jaro-Winkler, который является расстоянием редактирования;) проблема заключается не столько во времени, сколько вычисляется смещение jw-distance, а в количестве записей. Я ищу способ разделить работу в разных потоках, например, – Freek8

+0

@ Freek8 Упс, я думал, что [Левенштейнское расстояние] (http://en.wikipedia.org/wiki/Levenshtein_distance) было названо «расстоянием редактирования», (но Wikipedia говорит, что я ошибался, есть много [«дистанций редактирования»] (http://en.wikipedia.org/wiki/Edit_distance) там). Во всяком случае, у вас есть N * (N-1)/2, чтобы сделать независимо от вашего показателя; единственное, что может ускорить ваш процесс, - это быстрее вычислить метрику. – dasblinkenlight

+0

Что вы думаете о подходе soundex от ChrisJ? Я мог бы группировать все записи soundex и только JW-distance на группу. Возможно, я мог бы дать каждой группе отдельную тему! – Freek8

Смежные вопросы