Часткове узгодження імен у мільйонах записів


10

Ми розробили веб-додаток для відповідності імен. Він функціонує шляхом розбиття імен на частини, а значення Soundex кожної частини зберігається в базі даних. Показник відстані Левенштейн використовуються для застосування процентного відповідності звуку, а також написання проти даного імені.

Під час виконання ми завантажуємо всі записи в пам'ять і застосовуємо відстань Левенштейна до всіх значень Soundex та написання всіх частин усіх імен.

Спочатку це справно працювало, оскільки було максимум 20 тисяч імен, але зараз один з наших клієнтів має 30 мільйонів імен. Завантаження цього величезного списку в пам’яті для кожного запиту та застосування цього типу відповідності є пафосним підходом, використовуючи багато пам’яті та часу на виконання.

Ми шукаємо пропозиції найближчим часом пошукати в базі даних 30 мільйонів записів або більше з відсотковою відповідністю звуку та орфографії.

Основна функціональність

Кінцевий користувач вводить ім'я, яке має відповідати, і мінімальний відсоток. Ми повинні показати всі ті імена в базі даних, для яких будь-яка частина імені збігається з будь-якою частиною даного імені до заданого відсотка. Повне ім'я не потрібно узгоджувати, будь-яка частина, якщо збігається до відсотка, є успішною. Наприклад.

Given Name: Helen Hunt
Name in DB: Holly Hunter 

Обидві частини обох імен точно не збігаються, але до деякої міри, припустимо 80%, тому якщо користувач введе 80%, то ім'я в БД повинно бути показане як відповідне ім'я.


1
Ви використовуєте SQL Server? Я бачу, ви позначили це asp.net. Думаючи про можливість складання CLR, яка б запобігла мережевому трафіку і дозволила SQL-серверу керувати пам'яттю.
RubberChickenLeader

@WindRaven ми використовуємо і SQL Server, і Oracle
bjan

1
Чи це не та сама проблема веб-сканування, яку вирішує Google?
candied_orange

@bjan, де зберігаються імена? вони зберігаються на SQL сервері?
RubberChickenLeader

Що ви шукаєте? Топ-100 імен, які найкраще відповідають даному запиту?
Doc Brown

Відповіді:


6

Не знаючи повної інформації про те, що вам потрібно, ви, ймовірно, хочете зробити одне з наступних:

Я не знаю повністю, що пов'язано з установкою та конфігурацією сфінкса; але я маю враження, що ти можеш вказати його на базу даних, розповісти, які поля індексувати, як зважувати результати, і він поверне вам упорядкований список відповідних записів.

Для користувацьких або критично важливих завдань використовуйте наявний інструмент пошуку.

Якщо ви просто відчуваєте себе академічним ... Грайте з ngram:

Таблиця пошуку nграм може слугувати вашим початковим набором потенційних відповідностей, а ви можете використовувати відстані Левенштейна, щоб підрізати та сортувати результати.

Припускаючи, що ви хочете здійснити пошук people, ви можете зробити щось на кшталт:

_ people _________
personId: int
name: varchar
soundex_name: varchar

_ people_ngrams __
personId: int
ngramId: int

_ ngrams _________
ngramId: int
ngram: char(3)
count: int

Ви можете періодично відновлювати свої nграм або будувати їх на ходу. У будь-якому випадку простий, наївний алгоритм пошуку може виглядати так:

search_ngrams = ngrammify(soundex(search_string));

notable_ngrams = select top 10 *
  from ngrams
  where ngram in (search_ngrams)
  order by count asc;

possible_matches = select top 1000 distinct people.*
  from people_ngrams, people
  where ngramId in (notable_ngrams);

best_matches = top 100 possible_matches
  ordered by Levenshtein_distance(match, soundex(search_string));

Використовуючи щось подібне до цього (але з тюнінгуванням трохи більше ngram "популярності", чорні списки, білі списки тощо), я бачив подібний алгоритм нечітко злиття записів між наборами даних масово, а також полегшити нечіткий нестандартний пошук комунальні послуги та поточні записи щодо усунення дублювання.

Тепер, у моєму випадку, я не відповідав мільйонам записів, я шукав, щоб вибрати найкращі можливі злиття між двома наборами даних у порядку сотень тисяч записів кожен. І ми хотіли, щоб це спрацювало досить швидко - протягом декількох хвилин. (Швидкий, що 100 000 * 100 000?) І ми мали успіх.

Тож при правильній настройці подібні речі можуть бути спритними та ефективними. Ми в кінцевому підсумку змогли створити об'єднаний набір на скромній, датованій двоядерній машині за кілька хвилин, при цьому "сумнівні" злиття автоматично позначені для ручного огляду. Але знадобилося багато часу, щоб знайти ngram популярності / релевантності солодкого місця, а також правильні пороги відстані рядків, чорні списки та білі списки ... тощо

ЦЕ СКАЗУВАТИ , ви можете справді засмоктатися в дірку, працюючи над цим речей. Для будь-яких речей на рівні виробництва в реальному масштабі, як правило, слід використовувати добре створений інструмент, який вже зроблений та оптимізований для такого типу пошуку.

Як Сфінкса чи Люцена .


Я просто шукав нечіткий посібник з довідника Sphinx 2.2.11-випуску, і здається, що він відповідає точному слову, тоді як мені потрібно частково співставити слова. Виправте мене, якщо я помиляюся з цього приводу.
bjan

@bjan Так. Дивлячись на документи далі, я не впевнений, що нечіткий пошук Сфінкса - це саме те, що ви шукаєте. Він може використовувати звукову морфологію . Але, виходячи з вашої недавньої редагування, ви, можливо, захочете прокрутити свій власний ngram + рядок-відстань. І, як я вже говорив вище, може знадобитися деякий час, коли налаштувати алгоритм та пороги, щоб вийти правильно; але, це неможливо. І, якщо вам потрібен такий рівень гнучкості ...
svidgen

@bjan О, я також повністю забув про Lucene . Я не впевнений, що це робить і те, що вам потрібно; але, це досить дивно популярно, і на це варто звернути увагу, перш ніж спустити свій власний. Документи Люцена згадують нечіткі пошуки та ранжирування за допомогою рядкової відстані Левенштейна.
svidgen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.