Sorensen–Dice coefficient: Difference between revisions
Content added Content deleted
(New post.) |
|||
Line 201: | Line 201: | ||
0.608696 Fermat numbers |
0.608696 Fermat numbers |
||
0.600000 Lah numbers </pre> |
0.600000 Lah numbers </pre> |
||
=={{header|Java}}== |
|||
<syntaxhighlight lang="java"> |
|||
import java.io.IOException; |
|||
import java.nio.charset.StandardCharsets; |
|||
import java.nio.file.Files; |
|||
import java.nio.file.Path; |
|||
import java.util.ArrayList; |
|||
import java.util.Collections; |
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
public final class SorensenDiceCoefficient { |
|||
public static void main(String[] args) throws IOException { |
|||
List<String> tasks = Files.readAllLines(Path.of("Rosetta Code Tasks.dat"), StandardCharsets.UTF_8); |
|||
List<String> tests = List.of( |
|||
"Primordial primes", "Sunkist-Giuliani formula", "Sieve of Euripides", "Chowder numbers" ); |
|||
record TaskValue(String task, double value) {} |
|||
for ( String test : tests ) { |
|||
List<TaskValue> taskValues = new ArrayList<TaskValue>(); |
|||
Map<String, Integer> bigramsTest = createBigrams(test); |
|||
for ( String task : tasks ) { |
|||
double value = sorensenDice(bigramsTest, createBigrams(task)); |
|||
taskValues.add( new TaskValue(task, value) ); |
|||
} |
|||
Collections.sort(taskValues, (one, two) -> Double.compare(two.value, one.value)); |
|||
System.out.println(test + ":"); |
|||
for ( int i = 0; i < 5; i++ ) { |
|||
System.out.println(String.format("%s%.4f%s%s", |
|||
" ", taskValues.get(i).value, " ", taskValues.get(i).task)); |
|||
} |
|||
System.out.println(); |
|||
} |
|||
} |
|||
private static double sorensenDice(Map<String, Integer> bigramsOne, Map<String, Integer> bigramsTwo) { |
|||
int intersectionSize = 0; |
|||
for ( Map.Entry<String, Integer> entry : bigramsOne.entrySet() ) { |
|||
if ( bigramsTwo.keySet().contains(entry.getKey()) ) { |
|||
intersectionSize += Math.min(entry.getValue(), bigramsTwo.get(entry.getKey())); |
|||
} |
|||
} |
|||
return 2.0 * intersectionSize / ( size(bigramsOne) + size(bigramsTwo) ); |
|||
} |
|||
private static Map<String, Integer> createBigrams(String text) { |
|||
Map<String, Integer> result = new HashMap<String, Integer>(); |
|||
for ( String word : text.toLowerCase().split(" ") ) { |
|||
if ( word.length() == 1 ) { |
|||
result.merge(word, 1, Integer::sum); |
|||
} else { |
|||
for ( int i = 0; i < word.length() - 1; i++ ) { |
|||
result.merge(word.substring(i, i + 2), 1, Integer::sum); |
|||
} |
|||
} |
|||
} |
|||
return result; |
|||
} |
|||
private static int size(Map<String, Integer> map) { |
|||
return map.values().stream().mapToInt(Integer::intValue).sum(); |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
{{ out }} |
|||
<pre> |
|||
Primordial primes: |
|||
0.6857 Sequence of primorial primes |
|||
0.6667 Factorial primes |
|||
0.5714 Primorial numbers |
|||
0.5455 Prime words |
|||
0.5217 Almost prime |
|||
Sunkist-Giuliani formula: |
|||
0.5652 Almkvist-Giullera formula for pi |
|||
0.3784 Faulhaber's formula |
|||
0.3429 Haversine formula |
|||
0.3333 Check Machin-like formulas |
|||
0.3077 Resistance calculator |
|||
Sieve of Euripides: |
|||
0.4615 Four sides of square |
|||
0.4615 Sieve of Pritchard |
|||
0.4138 Sieve of Eratosthenes |
|||
0.4000 Piprimes |
|||
0.3846 Sierpinski curve |
|||
Chowder numbers: |
|||
0.7826 Chowla numbers |
|||
0.6400 Powerful numbers |
|||
0.6087 Fermat numbers |
|||
0.6087 Rhonda numbers |
|||
0.6000 Lah numbers |
|||
</pre> |
|||
=={{header|Julia}}== |
=={{header|Julia}}== |