2014-04-19 02:30:29 -04:00
|
|
|
package net.filebot.similarity;
|
2011-12-30 10:34:02 -05:00
|
|
|
|
2016-02-08 17:29:45 -05:00
|
|
|
import static java.util.Collections.*;
|
2011-12-30 10:34:02 -05:00
|
|
|
|
2016-02-08 17:29:45 -05:00
|
|
|
import java.util.Collection;
|
|
|
|
import java.util.Collections;
|
2011-12-30 10:34:02 -05:00
|
|
|
import java.util.Comparator;
|
2016-02-08 17:29:45 -05:00
|
|
|
import java.util.function.Function;
|
2011-12-30 10:34:02 -05:00
|
|
|
|
2016-02-08 17:29:45 -05:00
|
|
|
public class SimilarityComparator<T, P> implements Comparator<T> {
|
2015-07-25 18:47:19 -04:00
|
|
|
|
2012-02-22 03:30:50 -05:00
|
|
|
protected SimilarityMetric metric;
|
2016-02-08 17:29:45 -05:00
|
|
|
protected Collection<P> paragon;
|
2015-07-25 18:47:19 -04:00
|
|
|
|
2016-02-08 17:29:45 -05:00
|
|
|
protected Function<T, Collection<P>> mapper;
|
2015-07-25 18:47:19 -04:00
|
|
|
|
2016-02-08 17:29:45 -05:00
|
|
|
public SimilarityComparator(SimilarityMetric metric, Collection<P> paragon, Function<T, Collection<P>> mapper) {
|
2011-12-30 10:34:02 -05:00
|
|
|
this.metric = metric;
|
|
|
|
this.paragon = paragon;
|
2016-02-08 17:29:45 -05:00
|
|
|
this.mapper = mapper;
|
2011-12-30 10:34:02 -05:00
|
|
|
}
|
2015-07-25 18:47:19 -04:00
|
|
|
|
2016-02-08 17:29:45 -05:00
|
|
|
public SimilarityComparator(P paragon, Function<T, P> mapper) {
|
|
|
|
this(new NameSimilarityMetric(), singleton(paragon), mapper.andThen(Collections::singleton));
|
2011-12-30 10:34:02 -05:00
|
|
|
}
|
2015-07-25 18:47:19 -04:00
|
|
|
|
2011-12-30 10:34:02 -05:00
|
|
|
@Override
|
2016-02-08 17:29:45 -05:00
|
|
|
public int compare(T o1, T o2) {
|
|
|
|
return Double.compare(getSimilarity(o2), getSimilarity(o1));
|
|
|
|
}
|
2015-07-25 18:47:19 -04:00
|
|
|
|
2016-02-08 17:29:45 -05:00
|
|
|
private static final double ZERO = 0;
|
2015-07-25 18:47:19 -04:00
|
|
|
|
2016-02-08 17:29:45 -05:00
|
|
|
public double getSimilarity(T value) {
|
|
|
|
return paragon.stream().mapToDouble((it) -> accumulateSimilarity(it, value)).average().orElse(ZERO);
|
2011-12-30 10:34:02 -05:00
|
|
|
}
|
2015-07-25 18:47:19 -04:00
|
|
|
|
2016-02-08 17:29:45 -05:00
|
|
|
private double accumulateSimilarity(P paragon, T value) {
|
|
|
|
if (paragon == null) {
|
|
|
|
return ZERO;
|
2012-02-22 03:30:50 -05:00
|
|
|
}
|
2016-02-08 17:29:45 -05:00
|
|
|
|
|
|
|
return mapper.apply(value).stream().mapToDouble((it) -> it == null ? ZERO : (double) metric.getSimilarity(paragon, it)).max().orElse(ZERO);
|
2012-02-22 03:30:50 -05:00
|
|
|
}
|
2016-02-08 17:29:45 -05:00
|
|
|
|
2011-12-30 10:34:02 -05:00
|
|
|
}
|