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 <garydgreg...@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); }); }