Высокопроизводительное сравнение нечетких строк в Python, используйте Левенштейн или diffflib [закрыто]
130
Я выполняю нормализацию клинических сообщений (проверку орфографии), в которой я проверяю каждое данное слово по медицинскому словарю на 900 000 слов. Меня больше беспокоит временная сложность / производительность.
Я хочу провести нечеткое сравнение строк, но не уверен, какую библиотеку использовать.
Сходство Диффлиба и Левенштейна действительно весьма интересно.
Редактирование 2018: Если вы работаете над определением похожих строк, вы также можете проверить minhashing - здесь есть отличный обзор . Минхешинг прекрасно умеет находить сходство в больших текстовых коллекциях за линейное время. Моя лаборатория создала приложение, которое обнаруживает и визуализирует повторное использование текста с помощью minhashing здесь: https://github.com/YaleDHLab/intertext
Это супер круто! Что ты думаешь об этом тогда? Левенштейн просто плох для строк длиной в заголовок?
Ульф Аслак
3
Это действительно зависит от того, что вы пытаетесь уловить в своей метрике сходства ...
Duhaime
2
Я думаю, что некоторые разногласия между difflib и levenshtein могут быть объяснены эвристикой autojunk, используемой difflib. Что будет, если отключить?
Майкл
2
Это хороший вопрос. Фильтр autojunk вступает в силу только в том случае, если количество наблюдений> 200, поэтому я не уверен, сильно ли повлиял бы на этот конкретный набор данных (названия книг), но его стоит изучить ...
Duhaime
2
@duhaime, спасибо за подробный анализ. Я новичок в подобных сюжетах и понятия не имею, как их интерпретировать. Как называются сюжеты, чтобы я мог найти их и узнать о них?
Зак Янг
104
diffflib.SequenceMatcher использует алгоритм Ratcliff / Obershelp , он вычисляет удвоенное количество совпадающих символов, деленное на общее количество символов в двух строках.
Левенштейн использует алгоритм Левенштейна, он вычисляет минимальное количество правок, необходимых для преобразования одной строки в другую.
сложность
SequenceMatcher представляет собой квадратичное время для наихудшего случая и имеет поведение ожидаемого случая, сложным образом зависящее от количества общих элементов в последовательностях. ( отсюда )
Левенштейна - это O (m * n), где n и m - длина двух входных строк.
Производительность
Согласно исходному коду модуля Левенштейна: Левенштейн имеет некоторое перекрытие с difflib (SequenceMatcher). Он поддерживает только строки, а не произвольные типы последовательностей, но, с другой стороны, он намного быстрее.
Большое спасибо за информацию. Я добавил больше деталей. вот оно: как I am doing clinical message normalization (spell check) in which I check each given word against 900,000 word medical dictionary. I am more concern about the time complexity/performance.вы думаете, в этом случае оба действуют одинаково.
diffflib.SequenceMatcher использует алгоритм Ratcliff / Obershelp , он вычисляет удвоенное количество совпадающих символов, деленное на общее количество символов в двух строках.
Левенштейн использует алгоритм Левенштейна, он вычисляет минимальное количество правок, необходимых для преобразования одной строки в другую.
сложность
SequenceMatcher представляет собой квадратичное время для наихудшего случая и имеет поведение ожидаемого случая, сложным образом зависящее от количества общих элементов в последовательностях. ( отсюда )
Левенштейна - это O (m * n), где n и m - длина двух входных строк.
Производительность
Согласно исходному коду модуля Левенштейна: Левенштейн имеет некоторое перекрытие с difflib (SequenceMatcher). Он поддерживает только строки, а не произвольные типы последовательностей, но, с другой стороны, он намного быстрее.
источник
I am doing clinical message normalization (spell check) in which I check each given word against 900,000 word medical dictionary. I am more concern about the time complexity/performance.
вы думаете, в этом случае оба действуют одинаково.