Skip to content

Commit ffd75a8

Browse files
committed
fix(string): similarity
1 parent 3749fc6 commit ffd75a8

File tree

1 file changed

+28
-29
lines changed

1 file changed

+28
-29
lines changed

src/String.ts

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14,39 +14,38 @@ define(String.prototype, {
1414
replaceAll: function (find: string, replace: string) {
1515
return this.replace(new RegExp(escapeRegExp(find), "g"), replace);
1616
},
17-
similarity: function (second: string) {
18-
const first = this.replace(/\s+/g, "");
19-
second = second.replace(/\s+/g, "");
20-
if (!first.length && !second.length) return 1; // if both are empty strings
21-
if (!first.length || !second.length) return 0; // if only one is empty string
22-
if (first === second) return 1; // identical
23-
if (first.length === 1 && second.length === 1) return 0; // both are 1-letter strings
24-
if (first.length < 2 || second.length < 2) return 0; // if either is a 1-letter string
25-
const firstBigrams = new Map();
26-
const lowBigrams = new Map();
27-
for (let i = 0; i < first.length - 1; i++) {
28-
const bigram = first.substring(i, i + 2);
29-
const count = firstBigrams.has(bigram) ? firstBigrams.get(bigram) + 1 : 1;
30-
const countLow = lowBigrams.has(bigram.toLowerCase()) ? lowBigrams.get(bigram.toLowerCase()) + 1 : 1;
17+
similarity: function (s2: string) {
18+
var s1 = this.toLowerCase();
19+
s2 = s2.toLowerCase();
3120

32-
lowBigrams.set(bigram.toLowerCase(), countLow);
33-
firstBigrams.set(bigram, count);
21+
if (s1.length < s2.length) {
22+
s1 = s2;
23+
s2 = this;
3424
}
35-
let intersectionSize = 0;
36-
for (let i = 0; i < second.length - 1; i++) {
37-
const bigram = second.substring(i, i + 2);
38-
const count = firstBigrams.has(bigram) ? firstBigrams.get(bigram) : 0;
39-
const countLow = firstBigrams.has(bigram.toLowerCase()) ? firstBigrams.get(bigram.toLowerCase()) : 0;
40-
if (count > 0) {
41-
firstBigrams.set(bigram, count - 1);
42-
intersectionSize++;
43-
}
44-
if (countLow > 0) {
45-
firstBigrams.set(bigram.toLowerCase(), countLow - 1);
46-
intersectionSize += 0.9;
25+
var longerLength = s1.length;
26+
if (longerLength == 0) {
27+
return 1.0;
28+
}
29+
30+
var costs = new Array();
31+
for (var i = 0; i <= s1.length; i++) {
32+
var lastValue = i;
33+
for (var j = 0; j <= s2.length; j++) {
34+
if (i == 0) costs[j] = j;
35+
else {
36+
if (j > 0) {
37+
var newValue = costs[j - 1];
38+
if (s1.charAt(i - 1) != s2.charAt(j - 1))
39+
newValue = Math.min(Math.min(newValue, lastValue), costs[j]) + 1;
40+
costs[j - 1] = lastValue;
41+
lastValue = newValue;
42+
}
43+
}
4744
}
45+
if (i > 0) costs[s2.length] = lastValue;
4846
}
49-
return (2.0 * intersectionSize) / (first.length + second.length - 2);
47+
48+
return (longerLength - costs[s2.length]) / parseFloat(longerLength);
5049
},
5150
join: function (iterate: string[]) {
5251
if (typeof iterate === "string") return iterate;

0 commit comments

Comments
 (0)