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);
});
}