Skip to content

Commit 4c1540e

Browse files
committed
Add Serencen algorithm of calculation of sets similarity
1 parent 294315e commit 4c1540e

2 files changed

Lines changed: 62 additions & 0 deletions

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package by.andd3dfx.string;
2+
3+
import java.util.HashSet;
4+
import java.util.Set;
5+
import java.util.stream.IntStream;
6+
7+
public class StringComparison {
8+
9+
public static double serencen(String first, String second) {
10+
return serencen(toBigram(first), toBigram(second));
11+
}
12+
13+
private static Set<String> toBigram(String text) {
14+
if (text == null || text.length() < 2) {
15+
return new HashSet<>();
16+
}
17+
18+
// Создаем поток индексов от 0 до length - 2 и собираем биграммы в Set
19+
return IntStream.range(0, text.length() - 1)
20+
.mapToObj(i -> text.substring(i, i + 2))
21+
.collect(HashSet::new, Set::add, Set::addAll);
22+
}
23+
24+
public static <T> double serencen(Set<T> set1, Set<T> set2) {
25+
var intersection = new HashSet<>(set1);
26+
intersection.retainAll(set2);
27+
return 2.0 * intersection.size() / (set1.size() + set2.size());
28+
}
29+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package by.andd3dfx.string;
2+
3+
import org.junit.Test;
4+
5+
import java.util.Set;
6+
7+
import static by.andd3dfx.string.StringComparison.serencen;
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.assertj.core.api.Assertions.byLessThan;
10+
11+
public class StringComparisonTest {
12+
13+
@Test
14+
public void serencenForStrings() {
15+
assertThat(serencen("кот", "каток")).isEqualTo(0.0);
16+
assertThat(serencen("Andrei", "Andrei")).isEqualTo(1.0);
17+
assertThat(serencen("Andrei", "Andrew")).isEqualTo(0.8);
18+
assertThat(serencen("кошка", "кошак")).isEqualTo(0.5);
19+
assertThat(serencen("кошка", "носок")).isEqualTo(0.0);
20+
assertThat(serencen("Василевский", "Василевские")).isEqualTo(0.9);
21+
assertThat(serencen("алкогольдегридрогеназа", "алкоголь гидропоника генезис"))
22+
.isCloseTo(0.5217, byLessThan(1e-4));
23+
}
24+
25+
@Test
26+
public void testSerencenForSets() {
27+
assertThat(serencen(Set.of(1, 2, 3), Set.of())).isEqualTo(0.0);
28+
assertThat(serencen(Set.of(1, 2, 3), Set.of(1, 2, 3))).isEqualTo(1.0);
29+
assertThat(serencen(Set.of(1, 2, 3), Set.of(3, 2, 1))).isEqualTo(1.0);
30+
assertThat(serencen(Set.of(1, 2, 3, 10), Set.of(1, 3, 2)))
31+
.isCloseTo(0.8571, byLessThan(1e-4));
32+
}
33+
}

0 commit comments

Comments
 (0)