У меня есть 2 списка потенциально перекрывающихся названий фильмов, но, возможно, написанных в другой форме.
Они находятся в 2 разных кадрах данных из панд. Итак, я попытался использовать функцию map()
с библиотекой fuzzywuzzy
следующим образом:
df1.title.map(lambda x: process.extractOne(x, choices=df2.title, score_cutoff=95))
Что дает хорошие качественные результаты. Но временная сложность такова, что я могу запустить его только на очень небольшом подмножестве обоих фреймов данных. Когда я пытаюсь увеличить размер фреймов данных, он быстро становится непригодным для использования.
Затем я попытался заменить fuzzywuzzy
на difflib
. И это намного быстрее. Но я не могу добиться желаемых результатов.
Сначала я попробовал:
df1.title.map(lambda x: difflib.get_close_matches(x, df2.title, n=1)
И это было быстро, но качество результатов было плохим. Даже отсутствуют некоторые простые изменения верхнего/нижнего регистра. Игра с cutoff
не помогла.
Поэтому я подумал, что использую неправильный инструмент. В документах и примерах я видел get_close_matches
для отдельных слов. В названиях есть разные слова.
SequenceMatcher
лучше?
И если да, то как мне вписать его в map()
, чтобы он делал то же самое, что и вышеупомянутые функции: возвращал только лучший результат, и только если результат выше определенного соотношения?