You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2023/01/14 14:11:11 UTC

[commons-text] 03/08: Add and use a package-private singleton for CosineSimilarity

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-text.git

commit 9fdc137eafff15a83bf8ca071e9322a7e1452654
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sat Jan 14 08:56:40 2023 -0500

    Add and use a package-private singleton for CosineSimilarity
---
 src/changes/changes.xml                                   |  1 +
 .../apache/commons/text/similarity/CosineDistance.java    |  7 +------
 .../apache/commons/text/similarity/CosineSimilarity.java  | 15 ++++++++++-----
 .../commons/text/similarity/CosineSimilarityTest.java     | 14 ++++----------
 4 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 6b5bf7b9..b3d02cd0 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -51,6 +51,7 @@ The <action> type attribute can be add,update,fix,remove.
     <action                  type="fix" dev="ggregory" due-to="Pavel Belousov, Gary Gregory">TextStringBuidler#hashCode() allocates a String on each call #387.</action>
     <action issue="TEXT-221" type="fix" dev="aherbert" due-to="Remco Riswick">Fix Bundle-SymbolicName to use the package name org.apache.commons.text</action>
     <action                  type="fix" dev="ggregory" due-to="Gary Gregory">Add and use a package-private singleton for RegexTokenizer.</action>
+    <action                  type="fix" dev="ggregory" due-to="Gary Gregory">Add and use a package-private singleton for CosineSimilarity.</action>
     <!-- ADD -->
     <!-- UPDATE -->
     <action                  type="update" dev="ggregory" due-to="Dependabot">Bump actions/cache from 3.0.8 to 3.0.10 #361, #365.</action>
diff --git a/src/main/java/org/apache/commons/text/similarity/CosineDistance.java b/src/main/java/org/apache/commons/text/similarity/CosineDistance.java
index 1544018b..92c71f1c 100644
--- a/src/main/java/org/apache/commons/text/similarity/CosineDistance.java
+++ b/src/main/java/org/apache/commons/text/similarity/CosineDistance.java
@@ -35,11 +35,6 @@ import java.util.Map;
  */
 public class CosineDistance implements EditDistance<Double> {
 
-    /**
-     * Cosine similarity.
-     */
-    private final CosineSimilarity cosineSimilarity = new CosineSimilarity();
-
     @Override
     public Double apply(final CharSequence left, final CharSequence right) {
         final CharSequence[] leftTokens = RegexTokenizer.INSTANCE.tokenize(left);
@@ -47,7 +42,7 @@ public class CosineDistance implements EditDistance<Double> {
 
         final Map<CharSequence, Integer> leftVector = Counter.of(leftTokens);
         final Map<CharSequence, Integer> rightVector = Counter.of(rightTokens);
-        final double similarity = cosineSimilarity.cosineSimilarity(leftVector, rightVector);
+        final double similarity = CosineSimilarity.INSTANCE.cosineSimilarity(leftVector, rightVector);
         return 1.0 - similarity;
     }
 
diff --git a/src/main/java/org/apache/commons/text/similarity/CosineSimilarity.java b/src/main/java/org/apache/commons/text/similarity/CosineSimilarity.java
index edd873c5..54b428f3 100644
--- a/src/main/java/org/apache/commons/text/similarity/CosineSimilarity.java
+++ b/src/main/java/org/apache/commons/text/similarity/CosineSimilarity.java
@@ -21,18 +21,23 @@ import java.util.Map;
 import java.util.Set;
 
 /**
- * Measures the Cosine similarity of two vectors of an inner product space and
- * compares the angle between them.
- *
+ * Measures the Cosine similarity of two vectors of an inner product space and compares the angle between them.
+ * <p>
+ * For further explanation about the Cosine Similarity, refer to http://en.wikipedia.org/wiki/Cosine_similarity.
+ * </p>
  * <p>
- * For further explanation about the Cosine Similarity, refer to
- * http://en.wikipedia.org/wiki/Cosine_similarity.
+ * Instances of this class are immutable and are safe for use by multiple concurrent threads.
  * </p>
  *
  * @since 1.0
  */
 public class CosineSimilarity {
 
+    /**
+     * Singleton instance.
+     */
+    static final CosineSimilarity INSTANCE = new CosineSimilarity();
+
     /**
      * Calculates the cosine similarity for two given vectors.
      *
diff --git a/src/test/java/org/apache/commons/text/similarity/CosineSimilarityTest.java b/src/test/java/org/apache/commons/text/similarity/CosineSimilarityTest.java
index ffc82468..8d968e89 100644
--- a/src/test/java/org/apache/commons/text/similarity/CosineSimilarityTest.java
+++ b/src/test/java/org/apache/commons/text/similarity/CosineSimilarityTest.java
@@ -26,42 +26,36 @@ import java.util.Map;
 
 import org.junit.jupiter.api.Test;
 
-
 public class CosineSimilarityTest {
 
     @Test
     public void testCosineSimilarityReturningDoubleWhereByteValueIsZero() {
-        final CosineSimilarity cosineSimilarity = new CosineSimilarity();
         final Map<CharSequence, Integer> hashMap = new HashMap<>();
-
-        assertThat(cosineSimilarity.cosineSimilarity(hashMap, hashMap)).isEqualTo(0.0, within(0.01));
+        assertThat(CosineSimilarity.INSTANCE.cosineSimilarity(hashMap, hashMap)).isEqualTo(0.0, within(0.01));
     }
 
     @Test
     public void testCosineSimilarityThrowsIllegalArgumentException() {
         assertThatIllegalArgumentException().isThrownBy(() -> {
-            final CosineSimilarity cosineSimilarity = new CosineSimilarity();
             final Map<CharSequence, Integer> map = new HashMap<>();
-            cosineSimilarity.cosineSimilarity(map, null);
+            CosineSimilarity.INSTANCE.cosineSimilarity(map, null);
         });
     }
 
     @Test
     public void testCosineSimilarityWithNonEmptyMap() {
-        final CosineSimilarity cosineSimilarity = new CosineSimilarity();
         final Map<CharSequence, Integer> hashMap = new HashMap<>();
         final Integer integer = -397;
         hashMap.put("3J/$3.L", integer);
         final Map<CharSequence, Integer> hashMapTwo = new HashMap<>();
 
-        assertThat(cosineSimilarity.cosineSimilarity(hashMap, hashMapTwo)).isEqualTo(0.0, within(0.01));
+        assertThat(CosineSimilarity.INSTANCE.cosineSimilarity(hashMap, hashMapTwo)).isEqualTo(0.0, within(0.01));
     }
 
     @Test
     public void testCosineSimilarityWithNull() {
         assertThatIllegalArgumentException().isThrownBy(() -> {
-            final CosineSimilarity cosineSimilarity = new CosineSimilarity();
-            cosineSimilarity.cosineSimilarity(null, null);
+            CosineSimilarity.INSTANCE.cosineSimilarity(null, null);
         });
     }