cmpstr 2.0.2 → 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 -499
  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 -912
  157. package/src/CmpStrAsync.d.ts +0 -19
  158. package/src/CmpStrAsync.js +0 -204
  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,96 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ import { MetricRegistry, Metric } from './Metric.js';
3
+ import { Pool } from '../utils/Pool.js';
4
+
5
+ /**
6
+ * Smith-Waterman Algorithm
7
+ * src/metric/SmithWaterman.ts
8
+ *
9
+ * @see https://en.wikipedia.org/wiki/Smith%E2%80%93Waterman_algorithm
10
+ *
11
+ * The Smith-Waterman algorithm performs local alignment, finding the best matching
12
+ * subsequence between two strings. It is commonly used in bioinformatics for local
13
+ * sequence alignment. Instead of looking at the entire sequence, the Smith–Waterman
14
+ * algorithm compares segments of all possible lengths and optimizes the similarity
15
+ * measure.
16
+ *
17
+ * @module Metric/SmithWatermanDistance
18
+ * @author Paul Köhler (komed3)
19
+ * @license MIT
20
+ */
21
+ /**
22
+ * SmithWatermanDistance class extends the Metric class to implement the Smith-Waterman algorithm.
23
+ */
24
+ class SmithWatermanDistance extends Metric {
25
+ /**
26
+ * Constructor for the SmithWaterman class.
27
+ *
28
+ * Initializes the Smith-Waterman metric with two input strings or
29
+ * arrays of strings and optional options.
30
+ *
31
+ * @param {MetricInput} a - First input string or array of strings
32
+ * @param {MetricInput} b - Second input string or array of strings
33
+ * @param {MetricOptions} [opt] - Options for the metric computation
34
+ */
35
+ constructor(a, b, opt = {}) {
36
+ // Call the parent Metric constructor with the metric name and inputs
37
+ // Metric is symmetrical
38
+ super('smithWaterman', a, b, opt, true);
39
+ }
40
+ /**
41
+ * Calculates the Smith-Waterman local alignment score between two strings.
42
+ *
43
+ * @param {string} a - First string
44
+ * @param {string} b - Second string
45
+ * @param {number} m - Length of the first string
46
+ * @param {number} n - Length of the second string
47
+ * @return {MetricCompute<SmithWatermanRaw>} - Object containing the similarity result and raw score
48
+ */
49
+ compute(a, b, m, n) {
50
+ // Scoring parameters (can be customized via options if needed)
51
+ const { match = 2, mismatch = -1, gap = -2 } = this.options;
52
+ // Get two reusable arrays from the Pool for the DP rows
53
+ const len = m + 1;
54
+ const [prev, curr] = Pool.acquireMany('uint16', [len, len]);
55
+ // Initialize the first row to zeros (Smith-Waterman local alignment)
56
+ for (let i = 0; i <= m; i++) prev[i] = 0;
57
+ let maxScore = 0;
58
+ // Fill the DP matrix row by row (over the longer string)
59
+ for (let j = 1; j <= n; j++) {
60
+ // First column always zero
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
+ // Score for match / mismatch
66
+ const score = a.charCodeAt(i - 1) === cb ? match : mismatch;
67
+ // Calculate the maximum score for current cell
68
+ curr[i] = Math.max(
69
+ 0,
70
+ prev[i - 1] + score, // Diagonal (match/mismatch)
71
+ prev[i] + gap, // Up (gap)
72
+ curr[i - 1] + gap // Left (gap)
73
+ );
74
+ // Track the maximum score in the matrix
75
+ if (curr[i] > maxScore) maxScore = curr[i];
76
+ }
77
+ // Copy current row to previous for next iteration
78
+ prev.set(curr);
79
+ }
80
+ // Release arrays back to the pool
81
+ Pool.release('uint16', prev, len);
82
+ Pool.release('uint16', curr, len);
83
+ // Use the maximum possible score for the shorter string (local alignment)
84
+ const denum = Math.min(m * match, n * match);
85
+ // Return the result as a MetricCompute object
86
+ return {
87
+ res: denum === 0 ? 0 : Metric.clamp(maxScore / denum),
88
+ raw: { score: maxScore, denum }
89
+ };
90
+ }
91
+ }
92
+ // Register the Smith-Waterman algorithm in the metric registry
93
+ MetricRegistry.add('smithWaterman', SmithWatermanDistance);
94
+
95
+ export { SmithWatermanDistance };
96
+ //# sourceMappingURL=SmithWaterman.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmithWaterman.js","sources":["../../../src/metric/SmithWaterman.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAAA,CAAA,CAAA;;;;;;;;;;;;;;;AAeG,CAAA,CAAA;AAaH,CAAA,CAAA;;AAEG,CAAA,CAAA;AACG,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAsB,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwB,CAAA;AAE/D,CAAA,CAAA,CAAA,CAAA;;;;;;;;;AASG,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAc,CAAA,CAAE,CAAc,CAAE,CAAA,CAAA,CAAA,EAAqB,CAAA,CAAA,CAAA,CAAE,CAAA,CAAA;;;CAIjE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE;;AAI9C,CAAA,CAAA,CAAA,CAAA;;;;;;;;AAQG,CAAA,CAAA,CAAA,CAAA;AACgB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAG,CAAS,CAAA,CAAE,CAAS,CAAE,CAAA,CAAS,CAAE,CAAA,CAAS,CAAA,CAAA;;AAGnE,CAAA,CAAA,CAAA,CAAA,MAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAC,EAAE,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAE,CAAA,CAAA,CAAE,GAAG,CAAG,CAAA,CAAA,CAAA,CAAE,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAG3D,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAW,CAAA,CAAA,CAAC,GAAG,CAAC;AACzB,CAAA,CAAA,CAAA,CAAA,MAAM,CAAE,CAAA,CAAA,CAAA,CAAI,EAAE,CAAI,CAAA,CAAA,CAAA,CAAE,GAAG,CAAI,CAAA,CAAA,CAAA,CAAC,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,QAAQ,CAAE,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE,CAAE;;CAGjE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAG,CAAA,CAAI,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,GAAG,CAAC;CAE5C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC;;AAGxB,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAG,CAAA;;AAG3B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,GAAG,CAAC;;CAGb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAE,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC,UAAU,CAAE,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE;AAExC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAG,CAAA;;QAG3B,MAAM,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAC,UAAU,CAAE,CAAC,CAAG,CAAA,CAAA,CAAC,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGrE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAI,CAAE,CAAC,CAAE,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA;UAAE,CAAC;AAAA,UACnB,IAAI,CAAE,CAAC,GAAG,CAAC,CAAE,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;UACf,IAAI,CAAE,CAAC,GAAG,CAAC,CAAE,GAAG,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;CACtB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;;AAGD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAK,CAAI,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAI,CAAA,CAAA,CAAA,CAAE,CAAC,CAAE;;;AAKpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAE,IAAI,CAAE;;;CAKpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,QAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE;CACnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,QAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAI,CAAE,CAAA,CAAA,CAAA,CAAG,CAAE;;AAGnC,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAG,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,KAAK,CAAE;;IAG9C,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAG,CAAA,CAAA,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAE,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,KAAK,CAAE;AACvD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG,CAAE,CAAA,CAAA,CAAE,KAAK,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAE,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA;CAChC,CAAA,CAAA,CAAA,CAAA;;AAIR;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,CAAC,CAAG,CAAA,CAAA,CAAE,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,qBAAqB,CAAE;;;"}
@@ -0,0 +1,89 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ import { MetricRegistry, Metric } from './Metric.js';
3
+ import { Pool } from '../utils/Pool.js';
4
+
5
+ /**
6
+ * q-Gram Similarity
7
+ * src/metric/QGram.ts
8
+ *
9
+ * @see https://en.wikipedia.org/wiki/Q-gram
10
+ *
11
+ * Q-gram similarity is a string-matching algorithm that compares two strings by
12
+ * breaking them into substrings (q-grams) of length Q. The similarity is computed
13
+ * as the size of the intersection of q-gram sets divided by the size of the larger
14
+ * set.
15
+ *
16
+ * This metric is widely used in approximate string matching, information retrieval,
17
+ * and computational linguistics.
18
+ *
19
+ * @module Metric/QGramSimilarity
20
+ * @author Paul Köhler (komed3)
21
+ * @license MIT
22
+ */
23
+ /**
24
+ * QGramSimilarity class extends the Metric class to implement the q-Gram similarity algorithm.
25
+ */
26
+ class QGramSimilarity extends Metric {
27
+ /**
28
+ * Constructor for the QGramSimilarity class.
29
+ *
30
+ * Initializes the q-Gram similarity 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('qgram', a, b, opt, true);
41
+ }
42
+ /**
43
+ * Converts a string into a set of q-grams (substrings of length q).
44
+ *
45
+ * @param {string} str - The input string
46
+ * @param {number} q - The length of each q-gram
47
+ * @return {Set<string>} - Set of q-grams
48
+ */
49
+ _qGrams(str, q) {
50
+ const len = Math.max(0, str.length - q + 1);
51
+ const grams = Pool.acquire('set', len);
52
+ for (let i = 0; i < len; i++) grams.add(str.slice(i, i + q));
53
+ return grams;
54
+ }
55
+ /**
56
+ * Calculates the q-Gram similarity between two strings.
57
+ *
58
+ * @param {string} a - First string
59
+ * @param {string} b - Second string
60
+ * @return {MetricCompute<QGramRaw>} - Object containing the similarity result and raw values
61
+ */
62
+ compute(a, b) {
63
+ // Get q from options or use default "2"
64
+ const { q = 2 } = this.options;
65
+ // Generate q-gram sets for both strings
66
+ const setA = this._qGrams(a, q);
67
+ const setB = this._qGrams(b, q);
68
+ // Calculate intersection size
69
+ let intersection = 0;
70
+ for (const gram of setA) if (setB.has(gram)) intersection++;
71
+ // Calculate the size of the larger set
72
+ const sizeA = setA.size,
73
+ sizeB = setB.size;
74
+ const size = Math.max(sizeA, sizeB);
75
+ // Release sets back to the pool
76
+ Pool.release('set', setA, sizeA);
77
+ Pool.release('set', setB, sizeB);
78
+ // Return the result as a MetricCompute object
79
+ return {
80
+ res: size === 0 ? 1 : Metric.clamp(intersection / size),
81
+ raw: { intersection, size }
82
+ };
83
+ }
84
+ }
85
+ // Register the q-Gram similariry in the metric registry
86
+ MetricRegistry.add('qGram', QGramSimilarity);
87
+
88
+ export { QGramSimilarity };
89
+ //# sourceMappingURL=qGram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qGram.js","sources":["../../../src/metric/qGram.ts"],"sourcesContent":[null],"names":[],"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
+ import {
3
+ PhoneticRegistry,
4
+ PhoneticMappingRegistry,
5
+ Phonetic
6
+ } from './Phonetic.js';
7
+
8
+ /**
9
+ * Cologne Phonetic Algorithm
10
+ * src/phonetic/Cologne.ts
11
+ *
12
+ * @see https://en.wikipedia.org/wiki/Cologne_phonetics
13
+ *
14
+ * Cologne phonetics, also known as `Kölner Phonetik` or the `Cologne process`,
15
+ * is a phonetic algorithm that assigns a sequence of digits, referred to as the
16
+ * phonetic code, to words. The purpose of this method is to ensure that words
17
+ * with identical sounds receive the same code. This algorithm can facilitate a
18
+ * similarity search among words.
19
+ *
20
+ * Cologne phonetics is associated with the well-known Soundex phonetic algorithm,
21
+ * yet it is specifically optimized for the German language. This algorithm was
22
+ * introduced by Hans Joachim Postel in 1969.
23
+ *
24
+ * The Cologne phonetic algorithm works by mapping letters to digits, ignoring
25
+ * certain letters, and applying specific rules to handle character combinations.
26
+ *
27
+ * @module Phonetic/Cologne
28
+ * @author Paul Köhler (komed3)
29
+ * @license MIT
30
+ */
31
+ /**
32
+ * Cologne class extends the Phonetic class to implement the Cologne phonetic algorithm.
33
+ */
34
+ class Cologne extends Phonetic {
35
+ // Default options for the Cologne phonetic algorithm
36
+ static default = { map: 'default', delimiter: ' ', length: -1, dedupe: true };
37
+ /**
38
+ * Constructor for the Cologne class.
39
+ *
40
+ * Initializes the Cologne phonetic algorithm with the mapping and options.
41
+ *
42
+ * @param {PhoneticOptions} [opt] - Options for the Cologne phonetic algorithm
43
+ */
44
+ constructor(opt = {}) {
45
+ super('cologne', opt);
46
+ }
47
+ /**
48
+ * Adjusts the phonetic code by removing all '0's except the first character.
49
+ *
50
+ * @param {string} code - The phonetic code to adjust
51
+ * @returns {string} - The adjusted phonetic code
52
+ */
53
+ adjustCode(code) {
54
+ return code.slice(0, 1) + code.slice(1).replaceAll('0', '');
55
+ }
56
+ }
57
+ // Register the Cologne algorithm in the phonetic registry
58
+ PhoneticRegistry.add('cologne', Cologne);
59
+ // Register the Cologne phonetic mapping
60
+ PhoneticMappingRegistry.add('cologne', 'default', {
61
+ map: {
62
+ a: '0',
63
+ ä: '0',
64
+ e: '0',
65
+ i: '0',
66
+ j: '0',
67
+ o: '0',
68
+ ö: '0',
69
+ u: '0',
70
+ ü: '0',
71
+ y: '0',
72
+ b: '1',
73
+ p: '1',
74
+ d: '2',
75
+ t: '2',
76
+ f: '3',
77
+ v: '3',
78
+ w: '3',
79
+ g: '4',
80
+ k: '4',
81
+ q: '4',
82
+ l: '5',
83
+ m: '6',
84
+ n: '6',
85
+ r: '7',
86
+ c: '8',
87
+ s: '8',
88
+ ß: '8',
89
+ z: '8',
90
+ x: '48'
91
+ },
92
+ ignore: ['h'],
93
+ ruleset: [
94
+ { char: 'p', next: ['h'], code: '3' },
95
+ {
96
+ char: 'c',
97
+ position: 'start',
98
+ next: ['a', 'h', 'k', 'l', 'o', 'q', 'r', 'u', 'x'],
99
+ code: '4'
100
+ },
101
+ {
102
+ char: 'c',
103
+ next: ['a', 'h', 'k', 'o', 'q', 'u', 'x'],
104
+ prevNot: ['s', 'z'],
105
+ code: '4'
106
+ },
107
+ { char: 'd', next: ['c', 's', 'z'], code: '8' },
108
+ { char: 't', next: ['c', 's', 'z'], code: '8' },
109
+ { char: 'x', prev: ['c', 'k', 'q'], code: '8' }
110
+ ]
111
+ });
112
+
113
+ export { Cologne };
114
+ //# sourceMappingURL=Cologne.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cologne.js","sources":["../../../src/phonetic/Cologne.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,174 @@
1
+ // CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
2
+ import {
3
+ PhoneticRegistry,
4
+ PhoneticMappingRegistry,
5
+ Phonetic
6
+ } from './Phonetic.js';
7
+
8
+ /**
9
+ * Metaphone Phonetic Algorithm
10
+ * src/phonetic/Metaphone.ts
11
+ *
12
+ * @see https://en.wikipedia.org/wiki/Metaphone
13
+ *
14
+ * Metaphone is a phonetic algorithm for indexing words by their English pronunciation.
15
+ * It encodes words into a string of consonant symbols, allowing for the comparison of
16
+ * words based on their pronunciation rather than their spelling. Metaphone is more
17
+ * accurate than Soundex for English and is widely used in search, spell-checking,
18
+ * and fuzzy matching.
19
+ *
20
+ * This implementation uses a mapping and a comprehensive ruleset to efficiently
21
+ * transform input words into their Metaphone code. The algorithm drops or transforms
22
+ * letters according to context-sensitive rules, and only retains vowels at the start.
23
+ *
24
+ * @module Phonetic/Metaphone
25
+ * @author Paul Köhler (komed3)
26
+ * @license MIT
27
+ */
28
+ /**
29
+ * Metaphone class extends the Phonetic class to implement the Metaphone phonetic algorithm.
30
+ */
31
+ class Metaphone extends Phonetic {
32
+ // Default options for the Metaphone phonetic algorithm
33
+ static default = {
34
+ map: 'en90',
35
+ delimiter: ' ',
36
+ length: -1,
37
+ pad: '',
38
+ dedupe: false
39
+ };
40
+ /**
41
+ * Constructor for the Metaphone class.
42
+ *
43
+ * Initializes the Metaphone phonetic algorithm with the mapping and options.
44
+ *
45
+ * @param {PhoneticOptions} [opt] - Options for the Metaphone phonetic algorithm
46
+ */
47
+ constructor(opt = {}) {
48
+ super('metaphone', opt);
49
+ }
50
+ /**
51
+ * Generates the Metaphone code for a given word.
52
+ *
53
+ * @param {string} word - The input word to be converted into a Metaphone code
54
+ * @returns {string} - The generated Metaphone code
55
+ */
56
+ encode(word) {
57
+ // Remove duplicate adjacent letters except for C
58
+ word = word.replace(/([A-BD-Z])\1+/gi, (m, c) => (c === 'C' ? m : c));
59
+ // Use the base implementation for rule/mapping application
60
+ return super.encode(word);
61
+ }
62
+ /**
63
+ * Adjusts the Metaphone code by removing vowels except for the first letter.
64
+ *
65
+ * @param {string} code - The Metaphone code to be adjusted
66
+ * @returns {string} - The adjusted Metaphone code
67
+ */
68
+ adjustCode(code) {
69
+ // Remove vowels except for the first letter
70
+ return code.slice(0, 1) + code.slice(1).replace(/[AEIOU]/g, '');
71
+ }
72
+ }
73
+ // Register the Metaphone algorithm in the phonetic registry
74
+ PhoneticRegistry.add('metaphone', Metaphone);
75
+ /**
76
+ * Register the Metaphone phonetic mapping for English.
77
+ *
78
+ * This version is based on the original BASIC implementation from 1990,
79
+ * written by Lawrence Philips.
80
+ *
81
+ * @see https://gist.github.com/Rostepher/b688f709587ac145a0b3
82
+ */
83
+ PhoneticMappingRegistry.add('metaphone', 'en90', {
84
+ map: {
85
+ a: 'A',
86
+ b: 'B',
87
+ c: 'K',
88
+ d: 'T',
89
+ e: 'E',
90
+ f: 'F',
91
+ g: 'K',
92
+ h: 'H',
93
+ i: 'I',
94
+ j: 'J',
95
+ k: 'K',
96
+ l: 'L',
97
+ m: 'M',
98
+ n: 'N',
99
+ o: 'O',
100
+ p: 'P',
101
+ q: 'K',
102
+ r: 'R',
103
+ s: 'S',
104
+ t: 'T',
105
+ u: 'U',
106
+ v: 'F',
107
+ w: 'W',
108
+ x: 'KS',
109
+ y: 'Y',
110
+ z: 'S'
111
+ },
112
+ ruleset: [
113
+ // Drop the first letter if the string begins with `AE`, `GN`, `KN`, `PN` or `WR`
114
+ { char: 'a', position: 'start', next: ['e'], code: '' },
115
+ { char: 'g', position: 'start', next: ['n'], code: '' },
116
+ { char: 'k', position: 'start', next: ['n'], code: '' },
117
+ { char: 'p', position: 'start', next: ['n'], code: '' },
118
+ { char: 'w', position: 'start', next: ['r'], code: '' },
119
+ // Drop `B` if after `M` at the end of the string
120
+ { char: 'b', position: 'end', prev: ['m'], code: '' },
121
+ // `C` transforms into `X` if followed by `H` or `IA`
122
+ { char: 'c', next: ['h'], prevNot: ['s'], code: 'X' },
123
+ { char: 'c', next: ['i'], next2: ['a'], code: 'X' },
124
+ // `C` transforms into `S` if followed by `E`, `I` or `Y`
125
+ { char: 'c', next: ['e', 'i', 'y'], code: 'S' },
126
+ // `D` transforms into `J` if followed by `GE`, `GI` or `GY`
127
+ { char: 'd', next: ['g'], next2: ['e', 'i', 'y'], code: 'J' },
128
+ // Drop `G` if followed by `H` and `H` is not at the end or before a vowel
129
+ {
130
+ char: 'g',
131
+ next: ['h'],
132
+ next2Not: ['', 'a', 'e', 'i', 'o', 'u'],
133
+ code: ''
134
+ },
135
+ // Drop `G` if followed by `N` or `NED` and is at the end of the string
136
+ { char: 'g', trailing: 'n', code: '' },
137
+ { char: 'g', trailing: 'ned', code: '' },
138
+ // `G` transforms into `J` if before `E`, `I` or `Y` and is not a `GG`
139
+ { char: 'g', next: ['e', 'i', 'y'], prevNot: ['g'], code: 'J' },
140
+ // Drop `H` if after a vowel and not before a vowel
141
+ {
142
+ char: 'h',
143
+ prev: ['a', 'e', 'i', 'o', 'u'],
144
+ nextNot: ['a', 'e', 'i', 'o', 'u'],
145
+ code: ''
146
+ },
147
+ // Drop `H` if after `C`, `G`, `P`, `S` or `T`
148
+ { char: 'h', prev: ['c', 'g', 'p', 's', 't'], code: '' },
149
+ // Drop `K` if after `C`
150
+ { char: 'k', prev: ['c'], code: '' },
151
+ // `PH` transforms into `F`
152
+ { char: 'p', next: ['h'], code: 'F' },
153
+ // `S` transforms into `X` if followed by `H`, `IA` or `IO`
154
+ { char: 's', next: ['h'], code: 'X' },
155
+ { char: 's', next: ['i'], next2: ['a', 'o'], code: 'X' },
156
+ // `T` transforms into `X` if followed by `IA` or `IO`
157
+ { char: 't', next: ['i'], next2: ['a', 'o'], code: 'X' },
158
+ // `TH` transforms into `0` (zero)
159
+ { char: 't', next: ['h'], code: '0' },
160
+ // Drop `T` if followed by `CH`
161
+ { char: 't', next: ['c'], next2: ['h'], code: '' },
162
+ // Drop `W` if not followed by a vowel
163
+ { char: 'w', nextNot: ['a', 'e', 'i', 'o', 'u'], code: '' },
164
+ // `WH` transforms into `W` if at the beginning of the string
165
+ { char: 'h', leading: 'w', code: '' },
166
+ // `X` transforms into `S` if at the beginning
167
+ { char: 'x', position: 'start', code: 'S' },
168
+ // Drop `Y` if not followed by a vowel
169
+ { char: 'y', nextNot: ['a', 'e', 'i', 'o', 'u'], code: '' }
170
+ ]
171
+ });
172
+
173
+ export { Metaphone };
174
+ //# sourceMappingURL=Metaphone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Metaphone.js","sources":["../../../src/phonetic/Metaphone.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}