# HG changeset patch # User Claus Gittinger # Date 1573202193 -3600 # Node ID 28c398151366d5531402560d2045e66bc0324a6b # Parent b21db1463c69918c133726096391992de806720f #BUGFIX by exept class: PhoneticStringUtilities::DoubleMetaphoneStringComparator comment/format in: #performInitialProcessing #phoneticStringsFor: changed: #inputKey: class: PhoneticStringUtilities::PhoneticStringComparator comment/format in: #does:soundLike: class: PhoneticStringUtilities::PhoneticStringComparator class added: #does:soundLike: comment/format in: #encode: diff -r b21db1463c69 -r 28c398151366 PhoneticStringUtilities.st --- a/PhoneticStringUtilities.st Fri Nov 08 09:07:32 2019 +0100 +++ b/PhoneticStringUtilities.st Fri Nov 08 09:36:33 2019 +0100 @@ -511,15 +511,40 @@ !PhoneticStringUtilities::PhoneticStringComparator class methodsFor:'utilities'! +does:aString soundLike:anotherString + "return true, if aString sounds similar to anotherString" + + ^ self new does:aString soundLike:anotherString. + + " + PhoneticStringUtilities::SoundexStringComparator does:'miller' soundLike:'miler'. + + PhoneticStringUtilities::SoundexStringComparator does:'miller' soundLike:'milner'. + + PhoneticStringUtilities::SoundexStringComparator does:'müller' soundLike:'mueller'. + + PhoneticStringUtilities::KoelnerPhoneticCodeStringComparator does:'müller' soundLike:'mueller'. + PhoneticStringUtilities::DoubleMetaphoneStringComparator does:'müller' soundLike:'mueller'. + " +! + encode:word + "return a phonetic encoding for a word. + This can eg. be used as key to map/hash similar sounding words" + ^ (self new phoneticStringsFor:word) first " SoundexStringComparator encode:'Fischer' -> 'F260' + SoundexStringComparator encode:'Fiescher' -> 'F260' Caverphone2StringComparator encode:'Fischer' -> 'FSKA111111' - KoelnerPhoneticCodeStringComparator encode:'Fischer' -> '387' + Caverphone2StringComparator encode:'Fiescher' -> 'FSKA111111' MRAStringComparator encode:'Fischer' -> 'FSCHR' - SpanishPhoneticCodeStringComparator encode:'Fischer' -> '24429' + MRAStringComparator encode:'Fiescher' -> 'FSCHR' + SpanishPhoneticCodeStringComparator encode:'Fischer' -> '24429' + SpanishPhoneticCodeStringComparator encode:'Fiescher' -> '24429' + DoubleMetaphoneStringComparator encode:'Fischer' -> 'FXR' + DoubleMetaphoneStringComparator encode:'Fiescher' -> 'FXR' " "Created: / 02-08-2017 / 01:15:50 / cg" @@ -528,17 +553,19 @@ !PhoneticStringUtilities::PhoneticStringComparator methodsFor:'api'! does:aString soundLike:anotherString + "return true, if aString sounds similar to anotherString" + |translations1 translations2| - translations1 := self phoneticStringsFor:aString. - translations2 := self phoneticStringsFor:anotherString. + translations1 := self phoneticStringsFor:aString. + translations2 := self phoneticStringsFor:anotherString. ^ translations1 contains:[:t1 | - translations2 contains:[:t2 | t1 = t2]] + translations2 contains:[:t2 | t1 = t2] + ] " - PhoneticStringUtilities::SoundexStringComparator new - does:'miller' soundLike:'miler'. + PhoneticStringUtilities::SoundexStringComparator new does:'miller' soundLike:'miler'. PhoneticStringUtilities::SoundexStringComparator new does:'miller' soundLike:'milner'. @@ -1227,7 +1254,13 @@ ! inputKey: aString - inputKey := aString asUppercase + inputKey := aString asUppercase. + "/ care for diareses + (inputKey includesAny:'ÄÖÜ') ifTrue:[ + inputKey := inputKey copyReplaceString:'Ä' withString:'AE'. + inputKey := inputKey copyReplaceString:'Ö' withString:'OE'. + inputKey := inputKey copyReplaceString:'Ü' withString:'UE'. + ]. ! primaryTranslation @@ -1266,13 +1299,20 @@ phoneticStringsFor:aString "Private - Answers an array of alternate phonetic strings for the given input string." - - inputKey := aString. + + self initialize. + self inputKey:aString. self performInitialProcessing. self processRemainingCharacters. ^ Array with:primaryTranslation with:secondaryTranslation "Modified (format): / 28-07-2017 / 11:25:02 / cg" + + " + PhoneticStringUtilities::DoubleMetaphoneStringComparator new phoneticStringsFor:'muller' + PhoneticStringUtilities::DoubleMetaphoneStringComparator new phoneticStringsFor:'mueller' + PhoneticStringUtilities::DoubleMetaphoneStringComparator new phoneticStringsFor:'müller' + " ! ! !PhoneticStringUtilities::DoubleMetaphoneStringComparator methodsFor:'initialization'! @@ -1362,19 +1402,22 @@ ! performInitialProcessing + |ch1| + inputKey size > 1 ifTrue:[ - (#( 'GN' 'KN' 'PN' 'WR' 'PS' ) includes:(inputKey copyFrom:1 to:2)) ifTrue:[ + (inputKey startsWithAnyOf:#( 'GN' 'KN' 'PN' 'WR' 'PS' )) ifTrue:[ startIndex := startIndex + 1 ]. ]. - (self keyAt:1) = $X ifTrue:[ + ch1 := self keyAt:1. + ch1 = $X ifTrue:[ self addPrimaryTranslation:'S'; addSecondaryTranslation:'S'. startIndex := startIndex + 1 ]. - (self keyAt:1) isVowel ifTrue:[ + ch1 isVowel ifTrue:[ self addPrimaryTranslation:'A'; addSecondaryTranslation:'A'.