У меня есть 2 списка из более чем миллиона имен с немного разными соглашениями об именах. Цель здесь состоит в том, чтобы сопоставить те записи, которые похожи, с логикой достоверности 95%.
Мне известно, что есть библиотеки, которые я могу использовать, например, модуль FuzzyWuzzy в Python.
Однако с точки зрения обработки кажется, что потребуется слишком много ресурсов, чтобы каждая строка в 1 списке сравнивалась с другой, что в этом случае, по-видимому, требует 1 миллиона, умноженного на еще миллион итераций.
Есть ли другие более эффективные методы решения этой проблемы?
ОБНОВИТЬ:
Поэтому я создал функцию группирования и применил простую нормализацию удаления пробелов, символов и преобразования значений в нижний регистр и т. д.
for n in list(dftest['YM'].unique()):
n = str(n)
frame = dftest['Name'][dftest['YM'] == n]
print len(frame)
print n
for names in tqdm(frame):
closest = process.extractOne(names,frame)
Используя pythons pandas, данные загружаются в меньшие сегменты, сгруппированные по годам, а затем с помощью модуля FuzzyWuzzy используется process.extractOne
для получения наилучшего совпадения.
Результаты все еще несколько разочаровывают. Во время теста приведенный выше код используется на тестовом фрейме данных, содержащем всего 5 тысяч имен, и занимает почти целый час.
Тестовые данные разделены по.
- Имя
- Год Месяц Дата Рождения
И я сравниваю их по ведрам, где их YM находятся в одном и том же ведре.
Может ли проблема быть из-за модуля FuzzyWuzzy, который я использую? Цените любую помощь.
LTD
илиINC
, и, возможно, даже небуквенные символы. - person Alec   schedule 16.08.2016unique
ing оба списка, чтобы уменьшить оба списка на несколько порядков, чтобы квадратичные (нечеткие) сравнения не были такими болезненными. - person acdr   schedule 16.08.2016O(mn)
, вы можете вычислить расстояние Левенштейна между двумя строками и посмотреть, находятся ли они в пределах вашего порога приемлемости. - person Nick Zuber   schedule 16.08.2016