Как ускорить нечеткое сопоставление с помощью Fuzzywuzzy в Python

#python #runtime #levenshtein-distance #fuzzywuzzy

#python #время выполнения #левенштейн-расстояние #fuzzywuzzy

Вопрос:

Я использую Fuzzywuzzy в Python для сопоставления имен людей в 2 списках. Однако время выполнения слишком длинное, поскольку один список содержит 25000 имен, а другой — 39000 имен. Он работает уже 20 часов.

Ранее я использовал тот же код для сопоставления 2 списков, содержащих 6000 и 3000 имен, время выполнения составляло 1 час. Исходя из этого, время выполнения моей текущей работы займет более 50 часов.

Ниже приведен мой код:

 names_array=[]
ratio_array=[]
def match_names(wrong_names,correct_names):
    for row in wrong_names:
        x=process.extractOne(row, correct_names, scorer=fuzz.token_set_ratio)
        names_array.append(x[0])
        ratio_array.append(x[1])
    return names_array,ratio_array

df=pd.read_csv("wrong-country-names.csv",encoding="ISO-8859-1")
wrong_names=df['name'].dropna().values

choices_df=pd.read_csv("country-names.csv",encoding="ISO-8859-1")
correct_names=choices_df['name'].values

name_match,ratio_match=match_names(wrong_names,correct_names)
 

Я выбрал fuzz.token_set_ratio в качестве бомбардира для выполнения этого сопоставления «многие ко многим» на основе имеющихся у меня данных.

Ниже приведены примеры данных:

 wrong_names = ['Alberto Steve', 'David Lee']
correct_names = ['Alberto Lee Steve', 'David Steve Lee'] 
 

В принципе, список неправильных имен не содержит средних имен, чтобы игнорировать это и генерировать разумное совпадение, я выбрал fuzz.token_set_ratio .

Проводя онлайн-исследование, я нашел решение для установки пакета python levenshtein, чтобы ускорить время выполнения в 4-10 раз. Тем не менее, моя работа выполняется уже более 20 часов, я не хочу прерывать текущую работу, поэтому я попробую после этого.

Мне интересно, есть ли другие варианты для улучшения этого.

Заранее спасибо.

Комментарии:

1. Обнаружили ли вы какие-либо другие улучшения производительности?

2. Вы нашли какой-нибудь трюк для ускорения?

3. Как насчет расстояния Левенштейна?

4. Можете ли вы сделать какое-то предположение, например, что первые буквы должны совпадать, потому что они всегда ПЕРВЫЕ (СРЕДНИЕ) ПОСЛЕДНИЕ? Затем отфильтруйте второй ввод, чтобы сопоставлять только * с, скажем, «Альберто Стив», потому что Альберто Стив, вероятно, не Уолтер Уайт, так зачем пытаться сопоставить все Ws. Я не знаком с fuzzywuzzy, это была просто случайная мысль.

5. использование rapidfuzz вместо fuzzywuzzy . rapidfuzz выполняет некоторые строковые операции перед вычислением расстояния Левенштейна, что значительно сокращает время обработки. pip install rapidfuzz и from rapidfuzz import extractOne , fuzz