Strenglikhetsalgoritmer Sammenlignet

Forskning Og Tester

vi testet flere algoritmer for å sammenligne strenger, og valgte den som bedre passer vårt behov.

Algoritmer testing tabell

vi sammenlignet Streng A Og Streng B for å ha beregninger på de forskjellige algoritmer.

Regler for strenglikhet kan variere fra sak til sak. Hvis du vil vurdere» nisje «og» chien » lignende, vil du bruke en strenglikhetsalgoritme som oppdager anagrammer. Ikke i vårt tilfelle. En app som heter «nisje» og en annen som heter «chien» er svært sannsynlig å være to helt forskjellige apps.

etter litt brainstorming og forskning kom vi opp med noen algoritmemetoder som ville hjelpe vår sak. Cosinusalgoritmen viste seg å være irrelevant for oss, for eksempel ser det ikke ut til å ta hensyn til brevordren, noe som fører til en indeks på 1 (lignende streng) på et anagram («nisje «og»chien»).

Her er hva vi la merke til:

Levenshtein-Algoritmen

Levenshtein-avstanden er det minste antall redigeringer med enkelt tegn som kreves for å endre ett ord til det andre, så resultatet er et positivt heltall, følsomt for strenglengde . Som gjør det vanskeligere å tegne mønster.

for eksempel,

  • Levenshtein-avstanden mellom» foo «og» bar «er 3
  • Levenshtein-avstanden mellom» beauties «og» beautiful «er også 3
  • for oss mennesker er»beauties»/» beautiful «- paret mye mer lik»foo»/» bar » – paret. Men Levenshtein-avstanden er den samme.

metriske vi bruker her er den inverse Av Levenshtein avstanden (1 / levenshtein_distance ) så resultatet er en prosentandel og blir lettere lest av oss. Men problemet nevnt ovenfor forblir det samme.

hvor 1 er resultatet av å sammenligne identiske strenger, har «ShazamIphone» og «ShazamAndroid» en likhet på 0,167. «chien » og» nisje » har en likhet på 0,25.

Så Fra levenshtein algoritmen synspunkt Chien / Nisje er mer lik «ShazamIphone» / «ShazamAndroid» fordi færre endringer er nødvendig for å få fra «chien» til «nisje», enn å få fra» ShazamIphone «til»ShazamAndroid».

Trigram Sammenligning

en trigram algoritme er et tilfelle av n-gram, en sammenhengende sekvens av n (tre, i dette tilfellet) elementer fra en gitt prøve. I vårt tilfelle er et søknadsnavn et eksempel og et tegn er et element.
så sekvensen «martha» har 4 trigrams { mar art rth tha }.

Vi kan bruke Trigram-metoden til å sammenligne to strenger.

Tar for eksempel «martha» Og det samme ordet med en skrivefeil, «marhta», og vi kan beregne deres trigrams:

Trigrams «martha»: { mar art rth tha }

for å måle likheten deler vi antall matchende trigrams i begge strengene: 1 { mar} ved antall unike trigrams: 7 { mar art rth tha arh rht hta }

The result is 1/7 = 14%

for å balansere ulempen med de ytre tegnene (noe for å styrke likheten til strenger som starter og slutter med de samme trigrams), puter vi strengen med emner på hver side, noe som resulterer i disse tilfellene i tre trigrams «_ma», «ha_» og «ta_».

Trigrams » martha «: { _ma mar art rth tha ha_ }

Trigrams «marhta»: {_ma mar arh rht hta ta_}

etter å ha gjort det, er antall matchende trigrams opp til: 2 { _ma mar }
antallet av alle unike trigrams: 9 { _ma mar art rth tha arh rht hta ha_ }

The result is now 2/9 = 22%

Ved hjelp av denne metoden for å sammenligne» Twitter v1 «og» Twitter v2 » vi har:

antall matchende trigrams: 7 { _tw twi wit itt tte ter er_ }
antall alle unike trigrams: 11 { tw twi wit itt tte ter er_ _v1 _v2 v1_ v2_ }

The result is 7/11 = 63%

grensen For trigrammetoden for å sammenligne strenger er at korte strenger med en (eller to..) ulike trigrams har en tendens til å produsere en lavere likhet enn lange.

det er slik vi får en 0.2 likhet mellom «ShazamAndroid» Og «ShazamIphone», som de har flere forskjellige trigrams.

antall matchende trigrams er: 5 { _sh sha haz aza zam}
antallet av alle unike trigrams: 20

da det er en sterk avhengighet med strenglengde, gir det ikke en god sammenligning for oss.

Jaro-Winkler Algoritme

«i informatikk og statistikk Er jaro-Winkler-avstanden en strengmetrisk for å måle redigeringsavstanden mellom to sekvenser.

Uformelt Er jaro-avstanden mellom to ord det minste antall transposisjoner med enkelt tegn som kreves for å endre ett ord til det andre.

jaro-Winkler-avstanden bruker en prefiksskala som gir gunstigere karakterer til strenger som samsvarer fra begynnelsen for en angitt prefikslengde»

Kilde: Wikipedia.

Å Gi «mer betydning» til ord med identiske prefikser gjorde jaro-Winkler-avstanden til å virke veldig interessant for vår brukstilfelle.

Starter fra begynnelsen Med jaro avstandsformelen, her hvordan det fungerer. Ikke panikk, vi går trinnvis:

Jaro-Avstanden mellom to sekvenser s1 og s2 er definert av:

jaro avstand formel

dj er jaro-avstanden
m er antall matchende tegn (tegn som vises i s1 og i s2)
t er halvparten av antall transposisjoner (sammenlign i-th-tegnet til s1 og i-th-tegnet til s2 dividert med 2)
|s1| er lengden på den første strengen
|s2| er lengden på den andre strengen

med et eksempel. La oss ta «martha» og «marhta».

m = 6
t = 2/2 =1 (2 couples of non matching characters, the 4-th and 5-th) { t/h ; h/t }
|s1| = 6
|s2| = 6

Bare ved å erstatte tall er formelen, får vi:

dj = (⅓) ( 6/6 + 6/6 + (6–1)/6) = ⅓ 17/6 = 0,944Jaro distance = 94,4%

Nå vet vi Hva som er jaro-avstanden, la oss hoppe Til jaro-Winkler-avstanden.

jaro-Winkler-likheten bruker en prefiksskala p som gir gunstigere rangeringer til strenger som samsvarer fra begynnelsen for en angitt prefikslengde l.

p er en konstant skaleringsfaktor for hvor mye poengsummen justeres oppover for å ha felles prefikser. Standardverdien for denne konstanten i Winklers arbeid er p=0,1.

l er lengden på vanlig prefiks ved starten av strengen(opptil maksimalt 4 tegn).

jaro-Winkler avstandsformel

så tilbake til» martha «/» marhta » – eksemplet, la oss ta et prefiks lengde på l = 3 (som refererer til «mar»). Vi kommer til:

dw = 0,944 + ( (0,1*3)(1–0,944)) = 0,944 + 0,3*0,056 = 0,961Jaro-Winkler distance = 96,1%

Ved Hjelp Av JaroWinkler-formelen går Vi fra jaro-avstanden ved 94% likhet med 96%.

i vårt tilfelle starter de fleste lignende apper med samme prefiks («twitter v1» vs «twitter v2″eller» ShazamIphone » vs «ShazamAndroid» etc. Se Algoritmene testing tabellen ovenfor). Så det er et viktig kriterium å ta hensyn til.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.