package doser.entitydisambiguation.table.columndisambiguation; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.jgrapht.graph.DefaultDirectedWeightedGraph; import org.jgrapht.graph.DefaultWeightedEdge; import doser.entitydisambiguation.table.logic.Type; public class LayerVarianceFeature extends AbstractTypeDisFeatures { private final static float WEIGHT = 0.258219f; public LayerVarianceFeature( final DefaultDirectedWeightedGraph<Type, DefaultWeightedEdge> graph) { super(graph); } @Override public float computeFeature(final Type type) { final Set<DefaultWeightedEdge> set = this.graph.incomingEdgesOf(type); VarianceCalculator cal = new VarianceCalculator(); for (final DefaultWeightedEdge defWeightedEdge2 : set) { final DefaultWeightedEdge defWeightedEdge = defWeightedEdge2; final Type ctype = this.graph.getEdgeSource(defWeightedEdge); cal.addValue(ctype.getAccumulatedWeight()); } double var = 0; double standardDeviation = cal.standardDeviation(); if (standardDeviation < 0.001) { var = 1.0f; } else { var = standardDeviation; } return (float) (WEIGHT * (1 / Math.sqrt(var))); } class VarianceCalculator { private List<Double> l; double sum; VarianceCalculator() { super(); l = new ArrayList<Double>(); sum = 0; } void addValue(double val) { l.add(new Double(val)); sum += val; } double variance() { double mean = sum / l.size(); double res = 0; for(Double d : l) { res += Math.pow((d - mean), 2); } return res; } double standardDeviation() { return Math.sqrt(variance()); } } }