#BUGFIX by exept
authorClaus Gittinger <cg@exept.de>
Fri, 08 Nov 2019 09:36:33 +0100
changeset 5236 28c398151366
parent 5235 b21db1463c69
child 5237 3c1a727eb448
#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:
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'.