Gestaltmönstermatchning
Gestaltmönstermatchning , även Ratcliff/Obershelp-mönsterigenkänning, är en strängmatchningsalgoritm för att bestämma likheten mellan två strängar . Den utvecklades 1983 av John W. Ratcliff och John A. Obershelp och publicerades i Dr. Dobb's Journal i juli 1988.
Algoritm
Likheten mellan två strängar och bestäms av formeln, som beräknar två gånger antalet matchande tecken dividerat av det totala antalet tecken i båda strängarna. De matchande tecknen definieras som den längsta gemensamma delsträngen plus rekursivt antalet matchande tecken i de icke-matchande områdena på båda sidor om den längsta gemensamma delsträngen:
där likhetsmåttet kan ha ett värde mellan noll och ett:
Värdet 1 står för den fullständiga matchningen av de två strängarna, medan värdet 0 betyder att det inte finns någon matchning och inte ens en vanlig bokstav.
Prov
S 1 | W | jag | K | jag | M | E | D | jag | A |
---|---|---|---|---|---|---|---|---|---|
S 2 | W | jag | K | jag | M | A | N | jag | A |
Den längsta vanliga delsträngen är WIKIM
(grå) med 5 tecken. Det finns ingen ytterligare delsträng till vänster. De icke-matchande delsträngarna på höger sida är EDIA
och ANIA
. De har återigen en längsta gemensamma delsträng IA
(mörkgrå) med längden 2. Likhetsmåttet bestäms av:
Egenskaper
Komplexitet
Algoritmens exekveringstid är i värsta fall och i ett genomsnittligt fall . Genom att ändra beräkningsmetoden kan exekveringstiden förbättras avsevärt.
Kommutativ egenskap
Det kan visas att gestaltmönstermatchningsalgoritmen inte är kommutativ :
- Exempel
För de två strängarna
och
det metriska resultatet för
-
är med delsträngarna
GESTALT P
,A
,T
,E
och för -
är måttet med delsträngarna
GESTALT P
,R
,A
,C
,I
.
Ansökningar
Python difflib
- biblioteket, som introducerades i version 2.1, implementerar en liknande algoritm som föregår Ratcliff-Obershelp-algoritmen. På grund av det ogynnsamma körtidsbeteendet för detta likhetsmått har tre metoder implementerats. Två av dem returnerar en övre gräns på en snabbare körningstid. Den snabbaste varianten jämför bara längden på de två delsträngarna:
- ,
# Drqr-implementering i Python def real_quick_ratio ( s1 : str , s2 : str ) -> float : """Returnera en övre gräns på ratio() mycket snabbt.""" l1 , l2 = len ( s1 ), len ( s2 ) längd = l1 + l2 om inte längd : retur 1,0 retur 2,0 * min ( l1 , l2 ) / längd
Den andra övre gränsen beräknar två gånger summan av alla använda tecken som förekommer i dividerat med längden på båda strängarna men sekvensen ignoreras.
- ,
# Dqr-implementering i Python def quick_ratio ( s1 : str , s2 : str ) -> float : """Returnera en övre gräns på ratio() relativt snabbt.""" length = len ( s1 ) + len ( s2 ) om inte längd : retur 1,0 skär = samlingar . Räknare ( s1 ) & samlingar . Räknare ( s2 ) matchar = summa ( skär . värden ()) returnerar 2,0 * matchningar / längd
Trivialt gäller följande:
- och
- .
- ^ a b c d difflib — Hjälpare för att beräkna delta i Python-dokumentationen
- ^ a b c National Institute of Standards and Technology Ratcliff/Obershelp mönstrar igenkänning
- ^ Ilya Ilyankou: Jämförelse av Jaro-Winkler och Ratcliff/Obershelp-algoritmer i stavningskontroll, maj 2014 (PDF)
- ^ Hur fungerar Pythons SequenceMatcher? på stackoverflow.com
- ^ Lånad från Python 3.7.0, difflib.py raderna 38–41 och 676–686
Vidare läsning
- Ratcliff, John W.; Metzener, David (juli 1988). "Pattern Matching: The Gestalt Approach". Dr. Dobb's Journal (46).