cmpstr 2.0.3 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +75 -503
  3. package/dist/CmpStr.esm.js +4863 -0
  4. package/dist/CmpStr.esm.js.map +1 -0
  5. package/dist/CmpStr.esm.min.js +8 -0
  6. package/dist/CmpStr.esm.min.js.map +1 -0
  7. package/dist/CmpStr.umd.js +4875 -0
  8. package/dist/CmpStr.umd.js.map +1 -0
  9. package/dist/CmpStr.umd.min.js +8 -0
  10. package/dist/CmpStr.umd.min.js.map +1 -0
  11. package/dist/cjs/CmpStr.js +663 -0
  12. package/dist/cjs/CmpStr.js.map +1 -0
  13. package/dist/cjs/CmpStrAsync.js +336 -0
  14. package/dist/cjs/CmpStrAsync.js.map +1 -0
  15. package/dist/cjs/index.js +15 -0
  16. package/dist/cjs/index.js.map +1 -0
  17. package/dist/cjs/metric/Cosine.js +101 -0
  18. package/dist/cjs/metric/Cosine.js.map +1 -0
  19. package/dist/cjs/metric/DamerauLevenshtein.js +110 -0
  20. package/dist/cjs/metric/DamerauLevenshtein.js.map +1 -0
  21. package/dist/cjs/metric/DiceSorensen.js +91 -0
  22. package/dist/cjs/metric/DiceSorensen.js.map +1 -0
  23. package/dist/cjs/metric/Hamming.js +82 -0
  24. package/dist/cjs/metric/Hamming.js.map +1 -0
  25. package/dist/cjs/metric/Jaccard.js +76 -0
  26. package/dist/cjs/metric/Jaccard.js.map +1 -0
  27. package/dist/cjs/metric/JaroWinkler.js +114 -0
  28. package/dist/cjs/metric/JaroWinkler.js.map +1 -0
  29. package/dist/cjs/metric/LCS.js +89 -0
  30. package/dist/cjs/metric/LCS.js.map +1 -0
  31. package/dist/cjs/metric/Levenshtein.js +94 -0
  32. package/dist/cjs/metric/Levenshtein.js.map +1 -0
  33. package/dist/cjs/metric/Metric.js +445 -0
  34. package/dist/cjs/metric/Metric.js.map +1 -0
  35. package/dist/cjs/metric/NeedlemanWunsch.js +95 -0
  36. package/dist/cjs/metric/NeedlemanWunsch.js.map +1 -0
  37. package/dist/cjs/metric/SmithWaterman.js +98 -0
  38. package/dist/cjs/metric/SmithWaterman.js.map +1 -0
  39. package/dist/cjs/metric/qGram.js +91 -0
  40. package/dist/cjs/metric/qGram.js.map +1 -0
  41. package/dist/cjs/phonetic/Cologne.js +112 -0
  42. package/dist/cjs/phonetic/Cologne.js.map +1 -0
  43. package/dist/cjs/phonetic/Metaphone.js +172 -0
  44. package/dist/cjs/phonetic/Metaphone.js.map +1 -0
  45. package/dist/cjs/phonetic/Phonetic.js +413 -0
  46. package/dist/cjs/phonetic/Phonetic.js.map +1 -0
  47. package/dist/cjs/phonetic/Soundex.js +135 -0
  48. package/dist/cjs/phonetic/Soundex.js.map +1 -0
  49. package/dist/cjs/utils/DeepMerge.js +144 -0
  50. package/dist/cjs/utils/DeepMerge.js.map +1 -0
  51. package/dist/cjs/utils/DiffChecker.js +500 -0
  52. package/dist/cjs/utils/DiffChecker.js.map +1 -0
  53. package/dist/cjs/utils/Filter.js +189 -0
  54. package/dist/cjs/utils/Filter.js.map +1 -0
  55. package/dist/cjs/utils/HashTable.js +175 -0
  56. package/dist/cjs/utils/HashTable.js.map +1 -0
  57. package/dist/cjs/utils/Normalizer.js +144 -0
  58. package/dist/cjs/utils/Normalizer.js.map +1 -0
  59. package/dist/cjs/utils/Pool.js +196 -0
  60. package/dist/cjs/utils/Pool.js.map +1 -0
  61. package/dist/cjs/utils/Profiler.js +229 -0
  62. package/dist/cjs/utils/Profiler.js.map +1 -0
  63. package/dist/cjs/utils/Registry.js +148 -0
  64. package/dist/cjs/utils/Registry.js.map +1 -0
  65. package/dist/cjs/utils/TextAnalyzer.js +358 -0
  66. package/dist/cjs/utils/TextAnalyzer.js.map +1 -0
  67. package/dist/esm/CmpStr.js +662 -0
  68. package/dist/esm/CmpStr.js.map +1 -0
  69. package/dist/esm/CmpStrAsync.js +331 -0
  70. package/dist/esm/CmpStrAsync.js.map +1 -0
  71. package/dist/esm/index.js +7 -0
  72. package/dist/esm/index.js.map +1 -0
  73. package/dist/esm/metric/Cosine.js +99 -0
  74. package/dist/esm/metric/Cosine.js.map +1 -0
  75. package/dist/esm/metric/DamerauLevenshtein.js +108 -0
  76. package/dist/esm/metric/DamerauLevenshtein.js.map +1 -0
  77. package/dist/esm/metric/DiceSorensen.js +89 -0
  78. package/dist/esm/metric/DiceSorensen.js.map +1 -0
  79. package/dist/esm/metric/Hamming.js +77 -0
  80. package/dist/esm/metric/Hamming.js.map +1 -0
  81. package/dist/esm/metric/Jaccard.js +74 -0
  82. package/dist/esm/metric/Jaccard.js.map +1 -0
  83. package/dist/esm/metric/JaroWinkler.js +112 -0
  84. package/dist/esm/metric/JaroWinkler.js.map +1 -0
  85. package/dist/esm/metric/LCS.js +87 -0
  86. package/dist/esm/metric/LCS.js.map +1 -0
  87. package/dist/esm/metric/Levenshtein.js +92 -0
  88. package/dist/esm/metric/Levenshtein.js.map +1 -0
  89. package/dist/esm/metric/Metric.js +442 -0
  90. package/dist/esm/metric/Metric.js.map +1 -0
  91. package/dist/esm/metric/NeedlemanWunsch.js +93 -0
  92. package/dist/esm/metric/NeedlemanWunsch.js.map +1 -0
  93. package/dist/esm/metric/SmithWaterman.js +96 -0
  94. package/dist/esm/metric/SmithWaterman.js.map +1 -0
  95. package/dist/esm/metric/qGram.js +89 -0
  96. package/dist/esm/metric/qGram.js.map +1 -0
  97. package/dist/esm/phonetic/Cologne.js +114 -0
  98. package/dist/esm/phonetic/Cologne.js.map +1 -0
  99. package/dist/esm/phonetic/Metaphone.js +174 -0
  100. package/dist/esm/phonetic/Metaphone.js.map +1 -0
  101. package/dist/esm/phonetic/Phonetic.js +409 -0
  102. package/dist/esm/phonetic/Phonetic.js.map +1 -0
  103. package/dist/esm/phonetic/Soundex.js +137 -0
  104. package/dist/esm/phonetic/Soundex.js.map +1 -0
  105. package/dist/esm/utils/DeepMerge.js +139 -0
  106. package/dist/esm/utils/DeepMerge.js.map +1 -0
  107. package/dist/esm/utils/DiffChecker.js +498 -0
  108. package/dist/esm/utils/DiffChecker.js.map +1 -0
  109. package/dist/esm/utils/Filter.js +187 -0
  110. package/dist/esm/utils/Filter.js.map +1 -0
  111. package/dist/esm/utils/HashTable.js +173 -0
  112. package/dist/esm/utils/HashTable.js.map +1 -0
  113. package/dist/esm/utils/Normalizer.js +142 -0
  114. package/dist/esm/utils/Normalizer.js.map +1 -0
  115. package/dist/esm/utils/Pool.js +194 -0
  116. package/dist/esm/utils/Pool.js.map +1 -0
  117. package/dist/esm/utils/Profiler.js +227 -0
  118. package/dist/esm/utils/Profiler.js.map +1 -0
  119. package/dist/esm/utils/Registry.js +142 -0
  120. package/dist/esm/utils/Registry.js.map +1 -0
  121. package/dist/esm/utils/TextAnalyzer.js +356 -0
  122. package/dist/esm/utils/TextAnalyzer.js.map +1 -0
  123. package/dist/types/CmpStr.d.ts +472 -0
  124. package/dist/types/CmpStrAsync.d.ts +233 -0
  125. package/dist/types/index.d.ts +51 -0
  126. package/dist/types/metric/Cosine.d.ts +57 -0
  127. package/dist/types/metric/DamerauLevenshtein.d.ts +50 -0
  128. package/dist/types/metric/DiceSorensen.d.ts +57 -0
  129. package/dist/types/metric/Hamming.d.ts +49 -0
  130. package/dist/types/metric/Jaccard.d.ts +48 -0
  131. package/dist/types/metric/JaroWinkler.d.ts +50 -0
  132. package/dist/types/metric/LCS.d.ts +50 -0
  133. package/dist/types/metric/Levenshtein.d.ts +50 -0
  134. package/dist/types/metric/Metric.d.ts +261 -0
  135. package/dist/types/metric/NeedlemanWunsch.d.ts +47 -0
  136. package/dist/types/metric/SmithWaterman.d.ts +48 -0
  137. package/dist/types/metric/index.d.ts +41 -0
  138. package/dist/types/metric/qGram.d.ts +56 -0
  139. package/dist/types/phonetic/Cologne.d.ts +46 -0
  140. package/dist/types/phonetic/Metaphone.d.ts +50 -0
  141. package/dist/types/phonetic/Phonetic.d.ts +189 -0
  142. package/dist/types/phonetic/Soundex.d.ts +49 -0
  143. package/dist/types/phonetic/index.d.ts +30 -0
  144. package/dist/types/utils/DeepMerge.d.ts +70 -0
  145. package/dist/types/utils/DiffChecker.d.ts +137 -0
  146. package/dist/types/utils/Filter.d.ts +97 -0
  147. package/dist/types/utils/HashTable.d.ts +86 -0
  148. package/dist/types/utils/Normalizer.d.ts +76 -0
  149. package/dist/types/utils/Pool.d.ts +63 -0
  150. package/dist/types/utils/Profiler.d.ts +129 -0
  151. package/dist/types/utils/Registry.d.ts +57 -0
  152. package/dist/types/utils/TextAnalyzer.d.ts +199 -0
  153. package/dist/types/utils/Types.d.ts +313 -0
  154. package/package.json +62 -49
  155. package/src/CmpStr.d.ts +0 -70
  156. package/src/CmpStr.js +0 -917
  157. package/src/CmpStrAsync.d.ts +0 -19
  158. package/src/CmpStrAsync.js +0 -197
  159. package/src/algorithms/cosine.js +0 -86
  160. package/src/algorithms/damerau.js +0 -78
  161. package/src/algorithms/dice.js +0 -65
  162. package/src/algorithms/hamming.js +0 -44
  163. package/src/algorithms/jaccard.js +0 -34
  164. package/src/algorithms/jaroWinkler.js +0 -106
  165. package/src/algorithms/lcs.js +0 -58
  166. package/src/algorithms/levenshtein.js +0 -70
  167. package/src/algorithms/needlemanWunsch.js +0 -72
  168. package/src/algorithms/qGram.js +0 -63
  169. package/src/algorithms/smithWaterman.js +0 -78
  170. package/src/algorithms/soundex.js +0 -152
  171. package/src/index.d.ts +0 -3
  172. package/src/index.js +0 -47
@@ -0,0 +1,110 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ 'use strict';
3
+
4
+ var Metric = require('./Metric.js');
5
+ var Pool = require('../utils/Pool.js');
6
+
7
+ /**
8
+ * Damerau-Levenshtein Distance
9
+ * src/metric/DamerauLevenshtein.ts
10
+ *
11
+ * @see https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance
12
+ *
13
+ * The Damerau-Levenshtein distance extends the classical Levenshtein algorithm by
14
+ * including transpositions (swapping of two adjacent characters) as a single edit
15
+ * operation, in addition to insertions, deletions, and substitutions.
16
+ *
17
+ * This metric is particularly useful for detecting and correcting common
18
+ * typographical errors.
19
+ *
20
+ * @module Metric/DamerauLevenshtein
21
+ * @author Paul Köhler (komed3)
22
+ * @license MIT
23
+ */
24
+ /**
25
+ * DamerauLevenshteinDistance class extends the Metric class to implement the Damerau-Levenshtein algorithm.
26
+ */
27
+ class DamerauLevenshteinDistance extends Metric.Metric {
28
+ /**
29
+ * Constructor for the DamerauLevenshteinDistance class.
30
+ *
31
+ * Initializes the Damerau-Levenshtein metric with two input strings or
32
+ * arrays of strings and optional options.
33
+ *
34
+ * @param {MetricInput} a - First input string or array of strings
35
+ * @param {MetricInput} b - Second input string or array of strings
36
+ * @param {MetricOptions} [opt] - Options for the metric computation
37
+ */
38
+ constructor(a, b, opt = {}) {
39
+ // Call the parent Metric constructor with the metric name and inputs
40
+ // Metric is symmetrical
41
+ super('damerau', a, b, opt, true);
42
+ }
43
+ /**
44
+ * Calculates the normalized Damerau-Levenshtein distance between two strings.
45
+ *
46
+ * @param {string} a - First string (always the shorter string for memory efficiency)
47
+ * @param {string} b - Second string
48
+ * @param {number} m - Length of the first string (a)
49
+ * @param {number} n - Length of the second string (b)
50
+ * @param {number} maxLen - Maximum length of the strings
51
+ * @return {MetricCompute<DamerauRaw>} - Object containing the similarity result and raw distance
52
+ */
53
+ compute(a, b, m, n, maxLen) {
54
+ // Get three reusable arrays from the Pool for the DP rows
55
+ const len = m + 1;
56
+ const [test, prev, curr] = Pool.Pool.acquireMany('uint16', [len, len, len]);
57
+ // Initialize the first row (edit distances from empty string to a)
58
+ for (let i = 0; i <= m; i++) prev[i] = i;
59
+ // Fill the DP matrix row by row (over the longer string)
60
+ for (let j = 1; j <= n; j++) {
61
+ // Cost of transforming empty string to b[0..j]
62
+ curr[0] = j;
63
+ // Get the character code of the current character in b
64
+ const cb = b.charCodeAt(j - 1);
65
+ for (let i = 1; i <= m; i++) {
66
+ // Get the character code of the current character in b
67
+ const ca = a.charCodeAt(i - 1);
68
+ // If characters are the same, no cost for substitution
69
+ const cost = ca === cb ? 0 : 1;
70
+ // Calculate minimum of deletion, insertion, substitution
71
+ let val = Math.min(
72
+ curr[i - 1] + 1, // Insertion
73
+ prev[i] + 1, // Deletion
74
+ prev[i - 1] + cost // Substitution
75
+ );
76
+ // Check for transposition
77
+ if (
78
+ i > 1 &&
79
+ j > 1 &&
80
+ ca === b.charCodeAt(j - 2) &&
81
+ cb === a.charCodeAt(i - 2)
82
+ ) {
83
+ // Transposition
84
+ val = Math.min(val, test[i - 2] + cost);
85
+ }
86
+ // Set the cost for the current cell
87
+ curr[i] = val;
88
+ }
89
+ // Rotate rows: test <= prev, prev <= curr, curr <= test
90
+ test.set(prev);
91
+ prev.set(curr);
92
+ }
93
+ // The last value in prev is the Damerau-Levenshtein distance
94
+ const dist = prev[m];
95
+ // Release arrays back to the pool
96
+ Pool.Pool.release('uint16', test, len);
97
+ Pool.Pool.release('uint16', prev, len);
98
+ Pool.Pool.release('uint16', curr, len);
99
+ // Normalize by the length of the longer string
100
+ return {
101
+ res: maxLen === 0 ? 1 : Metric.Metric.clamp(1 - dist / maxLen),
102
+ raw: { dist, maxLen }
103
+ };
104
+ }
105
+ }
106
+ // Register the Damerau-Levenshtein distance in the metric registry
107
+ Metric.MetricRegistry.add('damerau', DamerauLevenshteinDistance);
108
+
109
+ exports.DamerauLevenshteinDistance = DamerauLevenshteinDistance;
110
+ //# sourceMappingURL=DamerauLevenshtein.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DamerauLevenshtein.js","sources":["../../../src/metric/DamerauLevenshtein.ts"],"sourcesContent":[null],"names":["Metric","Pool","MetricRegistry"],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ 'use strict';
3
+
4
+ var Metric = require('./Metric.js');
5
+ var Pool = require('../utils/Pool.js');
6
+
7
+ /**
8
+ * Dice-Sørensen Coefficient
9
+ * src/metric/DiceSorensen.ts
10
+ *
11
+ * @see https://en.wikipedia.org/wiki/Dice-S%C3%B8rensen_coefficient
12
+ *
13
+ * This module implements the Dice-Sørensen coefficient, a statistic used to gauge
14
+ * the similarity of two samples. It is commonly used in natural language processing
15
+ * and information retrieval to compare the similarity between two sets of data,
16
+ * such as text documents. The coefficient is defined as twice the size of the
17
+ * intersection divided by the sum of the sizes of the two sets.
18
+ *
19
+ * The implementation includes methods to compute bigrams from strings and calculate
20
+ * the coefficient based on these bigrams. It handles edge cases, such as empty
21
+ * strings and identical strings, to ensure accurate results.
22
+ *
23
+ * @module Metric/DiceSorensenCoefficient
24
+ * @author Paul Köhler (komed3)
25
+ * @license MIT
26
+ */
27
+ /**
28
+ * DiceSorensenCoefficient class extends the Metric class to implement the Dice-Sørensen coefficient.
29
+ */
30
+ class DiceSorensenCoefficient extends Metric.Metric {
31
+ /**
32
+ * Constructor for the DiceSorensen class.
33
+ *
34
+ * Initializes the DiceSorensen metric with two input strings or
35
+ * arrays of strings and optional options.
36
+ *
37
+ * @param {MetricInput} a - First input string or array of strings
38
+ * @param {MetricInput} b - Second input string or array of strings
39
+ * @param {MetricOptions} [opt] - Options for the metric computation
40
+ */
41
+ constructor(a, b, opt = {}) {
42
+ // Call the parent Metric constructor with the metric name and inputs
43
+ // Metric is symmetrical
44
+ super('dice', a, b, opt, true);
45
+ }
46
+ /**
47
+ * Computes the bigrams of a given string.
48
+ *
49
+ * @param {string} str - The input string
50
+ * @return {Set<string>} - A set of bigrams (two-character sequences) from the string
51
+ */
52
+ _bigrams(str) {
53
+ const len = str.length - 1;
54
+ const bigrams = Pool.Pool.acquire('set', len);
55
+ // Generate bigrams by iterating through the string
56
+ for (let i = 0; i < len; i++) bigrams.add(str.substring(i, i + 2));
57
+ return bigrams;
58
+ }
59
+ /**
60
+ * Calculates the Dice-Sørensen coefficient between two strings.
61
+ *
62
+ * @param {string} a - First string
63
+ * @param {string} b - Second string
64
+ * @return {MetricCompute<DiceRaw>} - Object containing the similarity result and raw distance
65
+ */
66
+ compute(a, b) {
67
+ // Generate bigrams for both strings
68
+ const setA = this._bigrams(a);
69
+ const setB = this._bigrams(b);
70
+ // Calculate the intersection of bigrams
71
+ let intersection = 0;
72
+ for (const bigram of setA) if (setB.has(bigram)) intersection++;
73
+ // Calculate the size of the union of both sets
74
+ const sizeA = setA.size,
75
+ sizeB = setB.size;
76
+ const size = sizeA + sizeB;
77
+ // Release sets back to the pool
78
+ Pool.Pool.release('set', setA, sizeA);
79
+ Pool.Pool.release('set', setB, sizeB);
80
+ // Return the result as a MetricCompute object
81
+ return {
82
+ res: size === 0 ? 1 : Metric.Metric.clamp((2 * intersection) / size),
83
+ raw: { intersection, size }
84
+ };
85
+ }
86
+ }
87
+ // Register the Dice-Sørensen coefficient in the metric registry
88
+ Metric.MetricRegistry.add('dice', DiceSorensenCoefficient);
89
+
90
+ exports.DiceSorensenCoefficient = DiceSorensenCoefficient;
91
+ //# sourceMappingURL=DiceSorensen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiceSorensen.js","sources":["../../../src/metric/DiceSorensen.ts"],"sourcesContent":[null],"names":["Metric","Pool","MetricRegistry"],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ 'use strict';
3
+
4
+ var Metric = require('./Metric.js');
5
+
6
+ /**
7
+ * Hamming Distance
8
+ * src/metric/Hamming.ts
9
+ *
10
+ * @see https://en.wikipedia.org/wiki/Hamming_distance
11
+ *
12
+ * The Hamming distance is a metric for comparing two strings of equal length. It
13
+ * measures the number of positions at which the corresponding symbols are different.
14
+ *
15
+ * This implementation allows for optional padding of the shorter string to equalize
16
+ * lengths, otherwise it throws an error if the strings are of unequal length.
17
+ *
18
+ * @module Metric/HammingDistance
19
+ * @author Paul Köhler (komed3)
20
+ * @license MIT
21
+ */
22
+ /**
23
+ * HammingDistance class extends the Metric class to implement the Hamming distance.
24
+ */
25
+ class HammingDistance extends Metric.Metric {
26
+ /**
27
+ * Constructor for the Hamming class.
28
+ *
29
+ * Initializes the Hamming distance metric with two input strings or
30
+ * arrays of strings and optional options.
31
+ *
32
+ * @param {MetricInput} a - First input string or array of strings
33
+ * @param {MetricInput} b - Second input string or array of strings
34
+ * @param {MetricOptions} opt - Options for the metric computation
35
+ */
36
+ constructor(a, b, opt = {}) {
37
+ // Call the parent Metric constructor with the metric name and inputs
38
+ // Metric is symmetrical
39
+ super('hamming', a, b, opt, true);
40
+ }
41
+ /**
42
+ * Calculates the Hamming distance between two strings.
43
+ *
44
+ * @param {string} a - First string
45
+ * @param {string} b - Second string
46
+ * @param {number} m - Length of the first string
47
+ * @param {number} n - Length of the second string
48
+ * @param {number} maxLen - Maximum length of the strings
49
+ * @return {MetricCompute<HammingRaw>} - Object containing the similarity result and raw distance
50
+ * @throws {Error} - If strings are of unequal length and padding is not specified
51
+ */
52
+ compute(a, b, m, n, maxLen) {
53
+ // Check for equal string length
54
+ if (m !== n) {
55
+ // Optional: use padding to equalize string length
56
+ if (this.options.pad !== undefined) {
57
+ if (m < maxLen) a = a.padEnd(maxLen, this.options.pad);
58
+ if (n < maxLen) b = b.padEnd(maxLen, this.options.pad);
59
+ m = n = maxLen;
60
+ }
61
+ // Standard: Error for unequal length
62
+ else
63
+ throw new Error(
64
+ `strings must be of equal length for Hamming Distance, a=${m} and b=${n} given, ` +
65
+ `use option.pad for automatic adjustment`
66
+ );
67
+ }
68
+ // Calculate the Hamming distance
69
+ let dist = 0;
70
+ for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) dist++;
71
+ // Return the result as a MetricCompute object
72
+ return {
73
+ res: m === 0 ? 1 : Metric.Metric.clamp(1 - dist / m),
74
+ raw: { dist }
75
+ };
76
+ }
77
+ }
78
+ // Register the Hamming distance in the metric registry
79
+ Metric.MetricRegistry.add('hamming', HammingDistance);
80
+
81
+ exports.HammingDistance = HammingDistance;
82
+ //# sourceMappingURL=Hamming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hamming.js","sources":["../../../src/metric/Hamming.ts"],"sourcesContent":[null],"names":["Metric","MetricRegistry"],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ 'use strict';
3
+
4
+ var Metric = require('./Metric.js');
5
+ var Pool = require('../utils/Pool.js');
6
+
7
+ /**
8
+ * Jaccard Index
9
+ * src/metric/Jaccard.ts
10
+ *
11
+ * @see https://en.wikipedia.org/wiki/Jaccard_index
12
+ *
13
+ * The Jaccard Index (or Jaccard similarity coefficient) measures the similarity
14
+ * between two sets by dividing the size of their intersection by the size of
15
+ * their union. In string similarity, it is often used to compare sets of characters,
16
+ * tokens, or n-grams. The result is a value between 0 and 1, where 1 means the
17
+ * sets are identical and 0 means they have no elements in common.
18
+ *
19
+ * @module Metric/JaccardIndex
20
+ * @author Paul Köhler (komed3)
21
+ * @license MIT
22
+ */
23
+ /**
24
+ * JaccardIndex class extends the Metric class to implement the Jaccard Index algorithm.
25
+ */
26
+ class JaccardIndex extends Metric.Metric {
27
+ /**
28
+ * Constructor for the JaccardIndex class.
29
+ *
30
+ * Initializes the Jaccard Index metric with two input strings or
31
+ * arrays of strings and optional options.
32
+ *
33
+ * @param {MetricInput} a - First input string or array of strings
34
+ * @param {MetricInput} b - Second input string or array of strings
35
+ * @param {MetricOptions} [opt] - Options for the metric computation
36
+ */
37
+ constructor(a, b, opt = {}) {
38
+ // Call the parent Metric constructor with the metric name and inputs
39
+ // Metric is symmetrical
40
+ super('jaccard', a, b, opt, true);
41
+ }
42
+ /**
43
+ * Calculates the Jaccard Index between two strings.
44
+ *
45
+ * @param {string} a - First string
46
+ * @param {string} b - Second string
47
+ * @param {number} m - Length of the first string
48
+ * @param {number} n - Length of the second string
49
+ * @return {MetricCompute<JaccardRaw>} - Object containing the similarity result and raw values
50
+ */
51
+ compute(a, b, m, n) {
52
+ // Acquire two sets from the Pool
53
+ const [setA, setB] = Pool.Pool.acquireMany('set', [m, n]);
54
+ // Fill setA and setB with unique characters from a and b
55
+ for (const A of a) setA.add(A);
56
+ for (const B of b) setB.add(B);
57
+ // Calculate intersection size
58
+ let intersection = 0;
59
+ for (const c of setA) if (setB.has(c)) intersection++;
60
+ // Calculate union size (setA + elements in setB not in setA)
61
+ const union = setA.size + setB.size - intersection;
62
+ // Release sets back to the pool
63
+ Pool.Pool.release('set', setA, m);
64
+ Pool.Pool.release('set', setB, n);
65
+ // Return the result as a MetricCompute object
66
+ return {
67
+ res: union === 0 ? 1 : Metric.Metric.clamp(intersection / union),
68
+ raw: { intersection, union }
69
+ };
70
+ }
71
+ }
72
+ // Register the Jaccard index in the metric registry
73
+ Metric.MetricRegistry.add('jaccard', JaccardIndex);
74
+
75
+ exports.JaccardIndex = JaccardIndex;
76
+ //# sourceMappingURL=Jaccard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Jaccard.js","sources":["../../../src/metric/Jaccard.ts"],"sourcesContent":[null],"names":["Metric","Pool","MetricRegistry"],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ 'use strict';
3
+
4
+ var Metric = require('./Metric.js');
5
+ var Pool = require('../utils/Pool.js');
6
+
7
+ /**
8
+ * Jaro-Winkler Distance
9
+ * src/metric/JaroWinkler.ts
10
+ *
11
+ * @see https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance
12
+ *
13
+ * The Jaro-Winkler distance is a string similarity metric that gives more weight
14
+ * to matching characters at the start of the strings. It is especially effective
15
+ * for short strings and typographical errors, and is widely used in record linkage
16
+ * and duplicate detection.
17
+ *
18
+ * @module Metric/JaroWinkler
19
+ * @author Paul Köhler (komed3)
20
+ * @license MIT
21
+ */
22
+ /**
23
+ * JaroWinklerDistance class extends the Metric class to implement the Jaro-Winkler algorithm.
24
+ */
25
+ class JaroWinklerDistance extends Metric.Metric {
26
+ /**
27
+ * Constructor for the JaroWinklerDistance class.
28
+ *
29
+ * Initializes the Jaro-Winkler metric with two input strings or
30
+ * arrays of strings and optional options.
31
+ *
32
+ * @param {MetricInput} a - First input string or array of strings
33
+ * @param {MetricInput} b - Second input string or array of strings
34
+ * @param {MetricOptions} [opt] - Options for the metric computation
35
+ */
36
+ constructor(a, b, opt = {}) {
37
+ // Call the parent Metric constructor with the metric name and inputs
38
+ // Metric is symmetrical
39
+ super('jaro-winkler', a, b, opt, true);
40
+ }
41
+ /**
42
+ * Calculates the Jaro-Winkler similarity between two strings.
43
+ *
44
+ * @param {string} a - First string
45
+ * @param {string} b - Second string
46
+ * @param {number} m - Length of the first string
47
+ * @param {number} n - Length of the second string
48
+ * @return {MetricCompute<JaroWinklerRaw>} - Object containing the similarity result and raw values
49
+ */
50
+ compute(a, b, m, n) {
51
+ // Find matches
52
+ const matchWindow = Math.max(0, Math.floor(n / 2) - 1);
53
+ // Use Pool for boolean arrays
54
+ const matchA = Pool.Pool.acquire('uint16', m);
55
+ const matchB = Pool.Pool.acquire('uint16', n);
56
+ // Initialize match arrays
57
+ for (let i = 0; i < m; i++) matchA[i] = 0;
58
+ for (let i = 0; i < n; i++) matchB[i] = 0;
59
+ // Find matches within the match window
60
+ let matches = 0;
61
+ for (let i = 0; i < m; i++) {
62
+ const start = Math.max(0, i - matchWindow);
63
+ const end = Math.min(i + matchWindow + 1, n);
64
+ for (let j = start; j < end; j++) {
65
+ if (!matchB[j] && a[i] === b[j]) {
66
+ matchA[i] = 1;
67
+ matchB[j] = 1;
68
+ matches++;
69
+ break;
70
+ }
71
+ }
72
+ }
73
+ // Set initial values for transpositions, jaro distance, prefix and result
74
+ let transpos = 0,
75
+ jaro = 0,
76
+ prefix = 0,
77
+ res = 0;
78
+ // If matches are found, proceed with further calculations
79
+ if (matches > 0) {
80
+ // Count transpositions
81
+ let k = 0;
82
+ for (let i = 0; i < m; i++) {
83
+ if (matchA[i]) {
84
+ while (!matchB[k]) k++;
85
+ if (a[i] !== b[k]) transpos++;
86
+ k++;
87
+ }
88
+ }
89
+ transpos /= 2;
90
+ // Calculate Jaro similarity
91
+ jaro = (matches / m + matches / n + (matches - transpos) / matches) / 3;
92
+ // Calculate common prefix length (max 4)
93
+ for (let i = 0; i < Math.min(4, m, n); i++) {
94
+ if (a[i] === b[i]) prefix++;
95
+ else break;
96
+ }
97
+ // Step 5: Calculate Jaro-Winkler similarity
98
+ res = jaro + prefix * 0.1 * (1 - jaro);
99
+ }
100
+ // Release arrays back to the pool
101
+ Pool.Pool.release('uint16', matchA, m);
102
+ Pool.Pool.release('uint16', matchB, n);
103
+ // Return the result as a MetricCompute object
104
+ return {
105
+ res: Metric.Metric.clamp(res),
106
+ raw: { matchWindow, matches, transpos, jaro, prefix }
107
+ };
108
+ }
109
+ }
110
+ // Register the Jaro-Winkler distance in the metric registry
111
+ Metric.MetricRegistry.add('jaroWinkler', JaroWinklerDistance);
112
+
113
+ exports.JaroWinklerDistance = JaroWinklerDistance;
114
+ //# sourceMappingURL=JaroWinkler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JaroWinkler.js","sources":["../../../src/metric/JaroWinkler.ts"],"sourcesContent":[null],"names":["Metric","Pool","MetricRegistry"],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ 'use strict';
3
+
4
+ var Metric = require('./Metric.js');
5
+ var Pool = require('../utils/Pool.js');
6
+
7
+ /**
8
+ * Longest Common Subsequence (LCS)
9
+ * src/metric/LCS.ts
10
+ *
11
+ * @see https://en.wikipedia.org/wiki/Longest_common_subsequence
12
+ *
13
+ * The Longest Common Subsequence (LCS) metric measures the length of the longest
14
+ * subsequence common to both strings. Unlike substrings, the characters of a
15
+ * subsequence do not need to be contiguous, but must appear in the same order.
16
+ *
17
+ * The LCS is widely used in diff tools, bioinformatics, and approximate string
18
+ * matching.
19
+ *
20
+ * @module Metric/LCS
21
+ * @author Paul Köhler (komed3)
22
+ * @license MIT
23
+ */
24
+ /**
25
+ * LCSMetric class extends the Metric class to implement the Longest Common Subsequence algorithm.
26
+ */
27
+ class LCSMetric extends Metric.Metric {
28
+ /**
29
+ * Constructor for the LCSMetric class.
30
+ *
31
+ * Initializes the LCS metric with two input strings or
32
+ * arrays of strings and optional options.
33
+ *
34
+ * @param {MetricInput} a - First input string or array of strings
35
+ * @param {MetricInput} b - Second input string or array of strings
36
+ * @param {MetricOptions} [opt] - Options for the metric computation
37
+ */
38
+ constructor(a, b, opt = {}) {
39
+ // Call the parent Metric constructor with the metric name and inputs
40
+ // Metric is symmetrical
41
+ super('lcs', a, b, opt, true);
42
+ }
43
+ /**
44
+ * Calculates the normalized LCS similarity between two strings.
45
+ *
46
+ * @param {string} a - First string
47
+ * @param {string} b - Second string
48
+ * @param {number} m - Length of the first string
49
+ * @param {number} n - Length of the second string
50
+ * @param {number} maxLen - Maximum length of the strings
51
+ * @return {MetricCompute<LCSRaw>} - Object containing the similarity result and raw LCS length
52
+ */
53
+ compute(a, b, m, n, maxLen) {
54
+ // Get two reusable arrays from the Pool for the DP rows
55
+ const len = m + 1;
56
+ const [prev, curr] = Pool.Pool.acquireMany('uint16', [len, len]);
57
+ // Initialize the first row to zeros
58
+ for (let i = 0; i <= m; i++) prev[i] = 0;
59
+ // Fill the DP matrix row by row (over the longer string)
60
+ for (let j = 1; j <= n; j++) {
61
+ curr[0] = 0;
62
+ // Get the character code of the current character in b
63
+ const cb = b.charCodeAt(j - 1);
64
+ for (let i = 1; i <= m; i++) {
65
+ // If characters match, increment the LCS length
66
+ if (a.charCodeAt(i - 1) === cb) curr[i] = prev[i - 1] + 1;
67
+ // Otherwise, take the maximum of the left or above cell
68
+ else curr[i] = Math.max(prev[i], curr[i - 1]);
69
+ }
70
+ // Copy current row to previous for next iteration
71
+ prev.set(curr);
72
+ }
73
+ // The last value in prev is the LCS length
74
+ const lcs = prev[m];
75
+ // Release arrays back to the pool
76
+ Pool.Pool.release('uint16', prev, len);
77
+ Pool.Pool.release('uint16', curr, len);
78
+ // Normalize by the length of the longer string
79
+ return {
80
+ res: maxLen === 0 ? 1 : Metric.Metric.clamp(lcs / maxLen),
81
+ raw: { lcs, maxLen }
82
+ };
83
+ }
84
+ }
85
+ // Register the Longest Common Subsequence (LCS) in the metric registry
86
+ Metric.MetricRegistry.add('lcs', LCSMetric);
87
+
88
+ exports.LCSMetric = LCSMetric;
89
+ //# sourceMappingURL=LCS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LCS.js","sources":["../../../src/metric/LCS.ts"],"sourcesContent":[null],"names":["Metric","Pool","MetricRegistry"],"mappings":"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"}