Soundex
Soundex är en fonetisk algoritm för att indexera namn efter ljud, som uttalas på engelska. Målet är att homofoner ska kodas till samma representation så att de kan matchas trots mindre skillnader i stavning . Algoritmen kodar huvudsakligen konsonanter; en vokal kommer inte att kodas om det inte är den första bokstaven. Soundex är den mest kända av alla fonetiska algoritmer (delvis eftersom det är en standardfunktion i populär databasprogramvara som IBM Db2 , PostgreSQL , MySQL , SQLite , Ingres , MS SQL Server , Oracle ., Snowflake och SAP ASE .) Förbättringar till Soundex är grunden för många moderna fonetiska algoritmer.
Historia
Soundex utvecklades av Robert C. Russell och Margaret King Odell och patenterades 1918 och 1922. En variant, amerikanska Soundex, användes på 1930-talet för en retrospektiv analys av USA:s folkräkningar från 1890 till 1920. Soundex-koden kom till framträdande plats i 1960-talet när det var föremål för flera artiklar i Communications and Journal of the Association for Computing Machinery, och särskilt när det beskrivs i Donald Knuths The Art of Computer Programming .
National Archives and Records Administration (NARA) upprätthåller de nuvarande reglerna för den officiella implementeringen av Soundex som används av den amerikanska regeringen. Dessa kodningsregler är tillgängliga från NARA, på begäran, i form av Allmän informationsbroschyr 55, "Using the Census Soundex".
Amerikanska Soundex
Soundex-koden för ett namn består av en bokstav följt av tre numeriska siffror : bokstaven är den första bokstaven i namnet och siffrorna kodar de återstående konsonanterna . Konsonanter på en liknande artikulationsplats delar samma siffra så, till exempel, labialkonsonanterna B , F, P och V kodas var och en som siffran 1.
Det korrekta värdet kan hittas enligt följande:
- Behåll den första bokstaven i namnet och släpp alla andra förekomster av a, e, i, o, u, y, h, w.
- Ersätt konsonanter med siffror enligt följande (efter den första bokstaven):
- b, f, p, v → 1
- c, g, j, k, q, s, x, z → 2
- d, t → 3
- l → 4
- m, n → 5
- r → 6
- Om två eller flera bokstäver med samma nummer finns intill i det ursprungliga namnet (före steg 1), behåll bara den första bokstaven; även två bokstäver med samma nummer separerade med 'h' , 'w' eller 'y' kodas som ett enda nummer, medan sådana bokstäver separerade med en vokal kodas två gånger. Denna regel gäller även den första bokstaven.
- Om det finns för få bokstäver i ordet för att tilldela tre siffror, lägg till nollor tills det finns tre siffror. Om det finns fyra eller fler nummer, behåll endast de tre första.
Med denna algoritm returnerar både "Robert" och "Rupert" samma sträng "R163" medan "Rubin" ger "R150". "Ashcraft" och "Ashcroft" ger båda "A261". "Tymczak" ger "T522" inte "T520" (tecknen 'z' och 'k' i namnet kodas som 2 två gånger eftersom en vokal ligger mellan dem). "Pfister" ger "P236" inte "P123" (de två första bokstäverna har samma nummer och kodas en gång som "P") och "Honeyman" ger "H555".
Följande algoritm följs av de flesta SQL-språk (exklusive PostgreSQL [ exempel behövs ] ):
- Spara den första bokstaven. Kartlägg alla förekomster av a, e, i, o, u, y, h, w. till noll(0)
- Ersätt alla konsonanter (inklusive den första bokstaven) med siffror som i [2.] ovan.
- Ersätt alla intilliggande samma siffror med en siffra och ta sedan bort alla noll (0) siffror
- Om den sparade bokstavens siffra är densamma som den resulterande första siffran, ta bort siffran (behåll bokstaven).
- Lägg till 3 nollor om resultatet innehåller mindre än 3 siffror. Ta bort alla utom första bokstaven och 3 siffror efter den (Detta steg är samma som [4.] i förklaringen ovan).
De två algoritmerna ovan ger inte samma resultat i alla fall, främst på grund av skillnaden mellan när vokalerna tas bort. Den första algoritmen används av de flesta programmeringsspråk och den andra används av SQL. Som exempel ger både "Robert" och "Rupert" "R163", medan "Tymczak" ger "T520" och "Honeyman" ger "H555". Vid design av en applikation, som kombinerar SQL och ett programmeringsspråk, måste arkitekten bestämma om all Soundex-kodning ska göras i SQL-servern eller allt i programmeringsspråket. MySQL-implementeringen kan returnera mer än 4 tecken.
Varianter
En liknande algoritm som kallas "Reverse Soundex" sätter prefixet på den sista bokstaven i namnet istället för den första.
Algoritmen New York State Identification and Intelligence System (NYSIIS) introducerades 1970 som en förbättring av Soundex-algoritmen. NYSIIS hanterar vissa n-gram med flera tecken och bibehåller relativ vokalposition, medan Soundex inte gör det.
Daitch–Mokotoff Soundex (D–M Soundex) utvecklades 1985 av släktforskaren Gary Mokotoff och förbättrades senare av släktforskaren Randy Daitch på grund av problem som de stötte på när de försökte tillämpa Russell Soundex på judar med germanska eller slaviska efternamn (som Moskowitz vs. Moskovitz eller Levine vs. Lewin). D–M Soundex kallas ibland för "judisk Soundex" eller "Eastern European Soundex", även om författarna avråder från användningen av dessa namn. D–M Soundex-algoritmen kan returnera så många som 32 individuella fonetiska kodningar för ett enda namn. Resultaten av DM Soundex returneras i ett helt numeriskt format mellan 100000 och 999999. Denna algoritm är mycket mer komplex än Russell Soundex.
Som ett svar på brister i Soundex-algoritmen utvecklade Lawrence Philips Metaphone -algoritmen 1990. Philips utvecklade en förbättring av Metaphone 2000, som han kallade Double Metaphone. Dubbelmetafon innehåller en mycket större kodningsregeluppsättning än sin föregångare, hanterar en delmängd av icke-latinska tecken och returnerar en primär och en sekundär kodning för att ta hänsyn till olika uttal av ett enstaka ord på engelska. Philips skapade Metaphone 3 som en ytterligare revidering 2009 för att tillhandahålla en professionell version som ger en mycket högre andel korrekta kodningar för engelska ord, icke-engelska ord som är bekanta för amerikaner och för- och efternamn som finns i USA. Den tillhandahåller också inställningar som tillåter mer exakt konsonant- och intern vokalmatchning för att tillåta programmeraren att fokusera precisionen av matchningar närmare.