diff options
author | Rocky Madden <git@rockymadden.com> | 2012-11-20 15:24:46 -0700 |
---|---|---|
committer | Rocky Madden <git@rockymadden.com> | 2012-11-20 15:24:46 -0700 |
commit | 11a858e84ae72be76ce6ebb9d5730bb152fa35f2 (patch) | |
tree | be072bf4c19d50cc4e2d9d91950363e8e27b70e3 /core | |
parent | c92a5365eeb76ffc3d41015650b92e58fde094ce (diff) | |
download | stringmetric-11a858e84ae72be76ce6ebb9d5730bb152fa35f2.tar.gz stringmetric-11a858e84ae72be76ce6ebb9d5730bb152fa35f2.tar.bz2 stringmetric-11a858e84ae72be76ce6ebb9d5730bb152fa35f2.zip |
Optimized for tableswitch.
Diffstat (limited to 'core')
-rwxr-xr-x | core/source/core/scala/org/hashtree/stringmetric/phonetic/MetaphoneAlgorithm.scala | 30 | ||||
-rwxr-xr-x | core/source/core/scala/org/hashtree/stringmetric/similarity/NGramMetric.scala | 3 |
2 files changed, 17 insertions, 16 deletions
diff --git a/core/source/core/scala/org/hashtree/stringmetric/phonetic/MetaphoneAlgorithm.scala b/core/source/core/scala/org/hashtree/stringmetric/phonetic/MetaphoneAlgorithm.scala index a4fc811..944025c 100755 --- a/core/source/core/scala/org/hashtree/stringmetric/phonetic/MetaphoneAlgorithm.scala +++ b/core/source/core/scala/org/hashtree/stringmetric/phonetic/MetaphoneAlgorithm.scala @@ -2,7 +2,7 @@ package org.hashtree.stringmetric.phonetic import org.hashtree.stringmetric.{ FilterableStringAlgorithm, StringAlgorithm, StringFilter } import org.hashtree.stringmetric.filter.StringFilterDelegate -import scala.annotation.tailrec +import scala.annotation.{ switch, tailrec } /** An implementation of the Metaphone [[org.hashtree.stringmetric.StringAlgorithm]]. */ object MetaphoneAlgorithm extends StringAlgorithm with FilterableStringAlgorithm { @@ -97,18 +97,20 @@ object MetaphoneAlgorithm extends StringAlgorithm with FilterableStringAlgorithm } private[this] def transcodeHead(ca: Array[Char]) = { - if (ca.length == 0) ca - else if (ca.length == 1) if (ca.head == 'x') Array('s') else ca - else - ca.head match { - case 'a' if (ca(1) == 'e') => ca.tail - case 'g' if (ca(1) == 'n') => ca.tail - case 'k' if (ca(1) == 'n') => ca.tail - case 'p' if (ca(1) == 'n') => ca.tail - case 'w' if (ca(1) == 'r') => ca.tail - case 'w' if (ca(1) == 'h') => 'w' +: ca.drop(2) - case 'x' => 's' +: ca.tail - case _ => ca - } + (ca.length: @switch) match { + case 0 => ca + case 1 => if (ca.head == 'x') Array('s') else ca + case _ => + ca.head match { + case 'a' if (ca(1) == 'e') => ca.tail + case 'g' if (ca(1) == 'n') => ca.tail + case 'k' if (ca(1) == 'n') => ca.tail + case 'p' if (ca(1) == 'n') => ca.tail + case 'w' if (ca(1) == 'r') => ca.tail + case 'w' if (ca(1) == 'h') => 'w' +: ca.drop(2) + case 'x' => 's' +: ca.tail + case _ => ca + } + } } }
\ No newline at end of file diff --git a/core/source/core/scala/org/hashtree/stringmetric/similarity/NGramMetric.scala b/core/source/core/scala/org/hashtree/stringmetric/similarity/NGramMetric.scala index 0932b0a..586552c 100755 --- a/core/source/core/scala/org/hashtree/stringmetric/similarity/NGramMetric.scala +++ b/core/source/core/scala/org/hashtree/stringmetric/similarity/NGramMetric.scala @@ -18,7 +18,7 @@ object NGramMetric extends StringMetric with FilterableConfigurableStringMetric[ if (ca1.length < n || ca2.length < n) None // Because length is less than n, it is not possible to compare. else if (ca1.sameElements(ca2)) Some(1d) - else { + else NGramAlgorithm.compute(ca1)(n).flatMap { ca1bg => NGramAlgorithm.compute(ca2)(n).map { ca2bg => val ms = scoreMatches((ca1bg.map(_.mkString), ca2bg.map(_.mkString))) @@ -26,7 +26,6 @@ object NGramMetric extends StringMetric with FilterableConfigurableStringMetric[ ms.toDouble / math.max(ca1bg.length, ca2bg.length) } } - } } override def compare(string1: String, string2: String)(n: Int) |