#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