package org.voyanttools.trombone.model; import java.util.Comparator; import org.voyanttools.trombone.model.CorpusTermsCorrelation.Sort; import org.voyanttools.trombone.util.FlexibleParameters; public class DocumentTermsCorrelation { private DocumentTerm source; private DocumentTerm target; private float correlation; public enum Sort {CORRELATIONASC, CORRELATIONDESC, CORRELATIONABS; public static Sort getForgivingly(FlexibleParameters parameters) { String sort = parameters.getParameterValue("sort", "").toUpperCase(); String sortPrefix = "CORRELATION"; // default String dir = parameters.getParameterValue("dir", "").toUpperCase(); String dirSuffix = "DESC"; if (dir.endsWith("ASC")) {dirSuffix="ASC";} else if (dir.endsWith("ABS")) {dirSuffix="ABS";} return valueOf(sortPrefix+dirSuffix); } } public DocumentTermsCorrelation(DocumentTerm source, DocumentTerm target, float correlation) { this.source = source; this.target = target; this.correlation = correlation; } public float getCorrelation() { return correlation; } public DocumentTerm[] getDocumentTerms() { return new DocumentTerm[]{source, target}; } public static Comparator<DocumentTermsCorrelation> getComparator(DocumentTermsCorrelation.Sort sort) { switch (sort) { case CORRELATIONASC: return CorrelationAscending; case CORRELATIONABS: return CorrelationAbsolute; } return CorrelationDescending; } private static Comparator<DocumentTermsCorrelation> TieBreaker = new Comparator<DocumentTermsCorrelation>() { @Override public int compare(DocumentTermsCorrelation o1, DocumentTermsCorrelation o2) { int compare = Integer.compare(o2.source.getRawFrequency()+o2.target.getRawFrequency(), o1.source.getRawFrequency()+o1.target.getRawFrequency()); if (compare!=0) {return compare;} compare = o1.source.getTerm().compareTo(o2.source.getTerm()); if (compare!=0) {return compare;} return o1.target.getTerm().compareTo(o2.target.getTerm()); } }; public static Comparator<DocumentTermsCorrelation> CorrelationAscending = new Comparator<DocumentTermsCorrelation>() { @Override public int compare(DocumentTermsCorrelation o1, DocumentTermsCorrelation o2) { int compare = Float.compare(o1.getCorrelation(), o2.getCorrelation()); if (compare==0) {return TieBreaker.compare(o1, o2);} else {return compare;} } }; public static Comparator<DocumentTermsCorrelation> CorrelationDescending = new Comparator<DocumentTermsCorrelation>() { @Override public int compare(DocumentTermsCorrelation o1, DocumentTermsCorrelation o2) { int compare = Float.compare(o2.getCorrelation(), o1.getCorrelation()); if (compare==0) {return TieBreaker.compare(o1, o2);} else {return compare;} } }; public static Comparator<DocumentTermsCorrelation> CorrelationAbsolute = new Comparator<DocumentTermsCorrelation>() { @Override public int compare(DocumentTermsCorrelation o1, DocumentTermsCorrelation o2) { int compare = Float.compare(Math.abs(o2.getCorrelation()), Math.abs(o1.getCorrelation())); if (compare==0) {return TieBreaker.compare(o1, o2);} else {return compare;} } }; }