#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:
--- 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'.