Gestaltová shoda - Gestalt Pattern Matching - Wikipedia
Gestaltová shoda,[1] taky Ratcliff / Obershelp rozpoznávání vzorů,[2] je algoritmus shody řetězců pro stanovení podobnost ze dvou struny. Byl vyvinut v roce 1983 společností John W. Ratcliff a John A. Obershelp a zveřejněna v Dr. Dobb's Journal v červenci 1988.[2]
Algoritmus
Podobnost dvou řetězců a je určeno vzorcem, který počítá dvojnásobný počet shody postavy děleno celkovým počtem znaků obou řetězců. Odpovídající znaky jsou definovány jako nejdelší společný podřetězec (LCS) plus rekurzivně počet odpovídajících znaků v neshodných oblastech na obou stranách LCS:[2]
kde metrika podobnosti může nabývat hodnoty mezi nulou a jednou:
Hodnota 1 znamená úplnou shodu dvou řetězců, zatímco hodnota 0 znamená, že neexistuje shoda a dokonce ani jedno společné písmeno.
Vzorek
S1 | Ž | Já | K. | Já | M | E | D | Já | A |
---|---|---|---|---|---|---|---|---|---|
S2 | Ž | Já | K. | Já | M | A | N | Já | A |
Nejdelší běžný podřetězec je WIKIM
(šedá) s 5 znaky. Vlevo není další podřetězec. Neshodné podřetězce na pravé straně jsou EDIA
a ANIA
. Opět mají nejdelší společný podřetězec IA
(tmavě šedá) s délkou 2. Metrika podobnosti je určena:
Vlastnosti
Složitost
Čas provedení algoritmu je v nejhorším případě a v průměrném případě. Změnou výpočetní metody lze významně zlepšit dobu provádění.[1]
Komutativní vlastnost
Je možné ukázat, že algoritmus pro porovnávání vzorů Gestalt není komutativní: [4]
- Vzorek
Pro dva řetězce
a
metrický výsledek pro
- je s podřetězci
GESTALT P
,A
,T
,E
a pro - metrika je s podřetězci
GESTALT P
,R
,A
,C
,Já
.
Aplikace
Algoritmus se stal základem Krajta difflib
knihovna, která byla představena ve verzi 2.1.[1] Kvůli nepříznivému běhovému chování této metriky podobnosti byly implementovány tři metody. Dva z nich vrátí horní hranice v rychlejší době provedení.[1] Nejrychlejší varianta porovnává pouze délku dvou podřetězců:[5]
- ,
# Implementace Drqr v Pythonudef real_quick_ratio(s1: str, s2: str) -> plovák: "" "Vrácení horní hranice poměru () velmi rychle." "" l1, l2 = len(s1), len(s2) délka = l1 + l2 -li ne délka: vrátit se 1.0 vrátit se 2.0 * min(l1, l2) / délka
Druhá horní hranice vypočítá dvojnásobný součet všech použitých znaků které se vyskytují v děleno délkou obou řetězců, ale sekvence je ignorována.
- ,
# Implementace Dqr v Pythonudef quick_ratio(s1: str, s2: str) -> plovák: "" "Pomalu rychle vrátí horní mez poměru ()." "" délka = len(s1) + len(s2) -li ne délka: vrátit se 1.0 protínají = sbírky.Čelit(s1) & sbírky.Čelit(s2) zápasy = součet(protínají.hodnoty()) vrátit se 2.0 * zápasy / délka
Zásadně platí následující:
- a
- .
Reference
- ^ A b C d difflib - Pomocníci pro výpočet delt uvnitř dokumentace Pythonu
- ^ A b C Národní institut pro standardy a technologie Rozpoznávání vzorů Ratcliff / Obershelp
- ^ Ilya Ilyankou: Porovnání algoritmů Jaro-Winkler a Ratcliff / Obershelp při kontrole pravopisu, Květen 2014 (PDF)
- ^ Jak funguje Pythons SequenceMatcher? na stackoverflow.com
- ^ Půjčeno od Pythonu 3.7.0, řádků difflib.py 38–41 a 676–686
Další čtení
- John W. Ratcliff a David Metzener: Matching Pattern: The Gestalt Approach, Dr. Dobb's Journal, číslo 46, červenec 1988