Сопоставление гештальт-образцов
Сопоставление гештальт-образцов , [1] также распознавание образов Ratcliff/Obershelp , [2] — это алгоритм сопоставления строк для определения сходства двух строк . Он был разработан в 1983 году Джоном В. Рэтклиффом и Джоном А. Обершелпом и опубликован в журнале доктора Добба в июле 1988 года. [2]
Алгоритм
[ редактировать ]Сходство двух струн и определяется по формуле, вычисляющей удвоенное количество совпадающих символов разделить на общее количество символов обеих строк. Соответствующие символы определяются как некоторая самая длинная общая подстрока. [3] плюс рекурсивно количество совпадающих символов в несовпадающих областях по обе стороны самой длинной общей подстроки: [2] [4]
где метрика сходства может принимать значение от нуля до единицы:
Значение 1 означает полное совпадение двух строк, тогда как значение 0 означает отсутствие совпадений и даже одной общей буквы.
Образец
[ редактировать ]С 1 | В | я | К | я | М | И | Д | я | А |
---|---|---|---|---|---|---|---|---|---|
SS2 | В | я | К | я | М | А | Н | я | А |
Самая длинная общая подстрока WIKIM
(светло-серый) из 5 символов. Слева больше нет подстроки. Несовпадающие подстроки в правой части: EDIA
и ANIA
. У них снова есть самая длинная общая подстрока IA
(темно-серый) длиной 2.
Метрика сходства определяется:
Характеристики
[ редактировать ]Соответствующие символы Рэтклиффа/Оберсхелпа могут существенно отличаться от каждой самой длинной общей подпоследовательности данных строк. Например и иметь как их единственная самая длинная общая подстрока, и никаких общих символов справа от ее появления, а также слева, что приводит к . Однако самая длинная общая подпоследовательность и является , общей длиной .
Сложность
[ редактировать ]Время выполнения алгоритма в худшем случае и в среднем случае. Изменив метод вычислений, время выполнения можно значительно улучшить. [1]
Коммутативное свойство
[ редактировать ]Реализация алгоритма сопоставления гештальт-образцов в библиотеке Python не является коммутативной : [5]
- Образец
Для двух струн
и
результат метрики для
- является с подстроками
GESTALT P
,A
,T
,E
и для - метрика с подстроками
GESTALT P
,R
,A
,C
,I
. [ почему? ]
Приложения
[ редактировать ]Питон difflib
библиотека, представленная в версии 2.1, [1] реализует аналогичный алгоритм, предшествовавший алгоритму Рэтклиффа-Оберсхелпа. Из-за неблагоприятного поведения этой метрики сходства во время выполнения были реализованы три метода. Два из них возвращают верхнюю границу за более быстрое время выполнения. [1] Самый быстрый вариант сравнивает только длину двух подстрок: [6]
- ,
Вторая верхняя граница вычисляет двойную сумму всех используемых символов. которые происходят в делится на длину обеих строк, но последовательность игнорируется.
# Dqr Implementation in Python
def quick_ratio(s1: str, s2: str) -> float:
"""Return an upper bound on ratio() relatively quickly."""
length = len(s1) + len(s2)
if not length:
return 1.0
intersect = collections.Counter(s1) & collections.Counter(s2)
matches = sum(intersect.values())
return 2.0 * matches / length
Тривиально применяется следующее:
- и
- .
Ссылки
[ редактировать ]- ^ Jump up to: Перейти обратно: а б с д difflib — Помощники для вычисления дельт в документации Python
- ^ Jump up to: Перейти обратно: а б с Распознавание образов Национального института стандартов и технологий Рэтклиффа / Оберсхелпа
- ^ Хотя две строки могут иметь несколько самых длинных общих подстрок, Рэтклифф (1988), по-видимому, предполагает, что существует только одна.
- ^ Илья Ильянков: Сравнение алгоритмов Яро-Винклера и Рэтклиффа/Оберсхелпа при проверке орфографии , май 2014 г. (PDF)
- ^ Как работает Pythons SequenceMatcher? на stackoverflow.com
- ^ Заимствовано из Python 3.7.0, строки difflib.py 38–41 и 676–686.
Дальнейшее чтение
[ редактировать ]- Рэтклифф, Джон В.; Метценер, Дэвид (июль 1988 г.). «Сопоставление с образцом: гештальт-подход». Журнал доктора Добба (46).