public SRResultList(int maxNumDocs) { this.results = new SRResult[maxNumDocs]; for (int i = 0; i < this.results.length; i++) { results[i] = new SRResult(); } numDocs = maxNumDocs; }
/** * Sets the ID, score, and explanations of the SRResult at the index. * @param i * @param id * @param score * @param explanationList */ public void set(int i, int id, double score, List<Explanation> explanationList){ set(i, new SRResult(id, score, explanationList)); }
@Override public SRResult similarity(int id1, int id2, boolean explanations) { return new SRResult(cosim.similarity(id1, id2)); }
@Override public SRResult similarity(int pageId1, int pageId2, boolean explanations) throws DaoException { double s1 = googleInlink(pageId1, pageId2); double s2 = cosineOutlink(pageId1, pageId2); return new SRResult(0.5 * s1 + 0.5 * s2); }
@Override public SRResult predictSimilarity(List<SRResult> scores) { double result=0.0; List<Explanation> explanationList = new ArrayList<Explanation>(); for (SRResult score : scores){ result+=score.getScore(); if (score.getExplanations()!=null&&!score.getExplanations().isEmpty()){ explanationList.addAll(score.getExplanations()); } } result/=scores.size(); return new SRResult(-2,result,explanationList); }
@Override public SRResult predictSimilarity(List<SRResult> scores) { if (scores.size()+1!= simlarityCoefficients.size()){ throw new IllegalStateException(); } double weightedScore = simlarityCoefficients.get(0); for (int i=0; i<scores.size(); i++){ double s = scores.get(i) == null ? Double.NaN : scores.get(i).getScore(); if (Double.isNaN(s) || Double.isInfinite(s)) { s = similarityInterpolator.getInterpolatedScore(i); } weightedScore+=(s * simlarityCoefficients.get(i+1)); } return new SRResult(weightedScore); }
@Override public SRResult predictSimilarity(List<SRResult> scores) { if (scores.size()+1!= simlarityCoefficients.size()){ throw new IllegalStateException(); } double weightedScore = simlarityCoefficients.get(0); for (int i=0; i<scores.size(); i++){ double s = scores.get(i) == null ? Double.NaN : scores.get(i).getScore(); if (Double.isNaN(s) || Double.isInfinite(s)) { s = similarityInterpolator.getInterpolatedScore(i); } weightedScore+=(s * simlarityCoefficients.get(i+1)); } return new SRResult(weightedScore); }
@Override public SRResult similarity(String phrase1, String phrase2, boolean explanations) throws DaoException { Integer id1 = getId(phrase1); Integer id2 = getId(phrase2); if (id1 == null || id2 == null) { return new SRResult(Double.NaN); } return similarity(id1, id2, explanations); }
@Override public SRResult similarity(String phrase1, String phrase2, boolean explanations) throws DaoException { double sum = 0.0; double divisor = 0.0; for (SubMetric m : metrics) { SRResult r = m.metric.similarity(phrase1, phrase2, false); if (r != null && r.isValid()) { sum += m.coefficient * r.getScore(); divisor += m.coefficient; } } return new SRResult((divisor > 0) ? (sum / divisor) : Double.NaN); }
@Override public SRResult similarity(String phrase1, String phrase2, boolean explanations) throws DaoException { Language language = getLanguage(); List<LocalString> phrases = Arrays.asList( new LocalString(language, phrase1), new LocalString(language, phrase2)); // debugSimilarityDisambiguator(phrases); List<LocalId> resolutions = disambiguator.disambiguateTop(phrases, null); if (resolutions.get(0) == null || resolutions.get(1) == null) { return new SRResult(); } // LocalPage lp1 = localPageDao.getById(language, resolutions.get(0).getId()); // LocalPage lp2 = localPageDao.getById(language, resolutions.get(1).getId()); // System.out.println("resolved " + phrase1 + ", " + phrase2 + " to " + lp1 + ", " + lp2); return similarity(resolutions.get(0).getId(), resolutions.get(1).getId(), explanations); }
@Override public SRResult similarity(int pageId1, int pageId2, boolean explanations) throws DaoException { // TODO: Handle explanations double sum = 0.0; double divisor = 0.0; for (SubMetric m : metrics) { SRResult r = m.metric.similarity(pageId1, pageId2, false); if (r != null && r.isValid()) { sum += m.coefficient * r.getScore(); divisor += m.coefficient; } } return new SRResult((divisor > 0) ? (sum / divisor) : Double.NaN); }
@Override public SRResultList predictMostSimilar(List<SRResultList> scores, int maxResults, TIntSet validIds) { int numMetrics = scores.size(); TIntDoubleHashMap scoreMap = new TIntDoubleHashMap(); for (SRResultList resultList : scores){ for (SRResult result : resultList){ double value = result.getScore()/numMetrics; scoreMap.adjustOrPutValue(result.getId(),value,value); } } List<SRResult> resultList = new ArrayList<SRResult>(); for (int id : scoreMap.keys()){ resultList.add(new SRResult(id,scoreMap.get(id))); } Collections.sort(resultList); Collections.reverse(resultList); SRResultList result = new SRResultList(maxResults); for (int i=0; i<maxResults&&i<resultList.size();i++){ result.set(i,resultList.get(i)); } return result; }
@Override public SRResult similarity(int pageId1, int pageId2, boolean explanations) throws DaoException { SRResult r1 = inlink.similarity(pageId1, pageId2, explanations); SRResult r2 = outlink.similarity(pageId1, pageId2, explanations); if (r1 == null || r2 == null || !r1.isValid() || !r2.isValid()) { return new SRResult(Double.NaN); } else { SRResult finalResult=new SRResult(0.5 * r1.getScore() + 0.5 * r2.getScore()); if (explanations) { List<Explanation> explanationList = new ArrayList<Explanation>(); explanationList.addAll(r1.getExplanations()); explanationList.addAll(r2.getExplanations()); finalResult.setExplanations(explanationList); } return normalize(finalResult); } }
@Override public SRResult similarity(int pageId1, int pageId2, boolean explanations) throws DaoException { int count = 0; int links1[] = getLinks(pageId1, true); int links2[] = getLinks(pageId2, true); count += hasLink(links1, pageId2); count += hasLink(links2, pageId1); return new SRResult(normalize(1.0 * count / 2.0)); }
@Override public SRResult similarity(int pageId1, int pageId2, boolean explanations) throws DaoException { if (pageId1 == pageId2) { return new SRResult(1.0); } if (dabs.contains(pageId1) || dabs.contains(pageId2)) { return null; } TIntSet ids1 = getLinksTo(pageId1); TIntSet ids2 = getLinksTo(pageId2); TIntSet both = new TIntHashSet(ids1); both.retainAll(ids2); if (both.isEmpty()) { return new SRResult(0.0); } double pmi = 1.0 * numArticles * both.size() / (ids1.size() * ids2.size()); double boost = Math.log10(both.size()); double graphDistance = graphDistance(pageId1, pageId2); // String t1 = getLocalPageDao().getById(getLanguage(), pageId1).getTitle().toString(); // String t2 = getLocalPageDao().getById(getLanguage(), pageId2).getTitle().toString(); // System.err.println(String.format("Values for %s, %s, are %.4f, %.4f, %.4f\n", t1, t2, pmi, boost, graphDistance)); return new SRResult(pmi * boost / graphDistance); }
@Override public SRResultList mostSimilar(String phrase, int maxResults) throws DaoException { LocalId similar = disambiguator.disambiguateTop(new LocalString(getLanguage(), phrase), null); if (similar==null){ SRResultList resultList = new SRResultList(1); resultList.set(0, new SRResult()); return resultList; } return mostSimilar(similar.getId(), maxResults); }
@Override public SRResultList mostSimilar(String phrase, int maxResults, TIntSet validIds) throws DaoException{ LocalId similar = disambiguator.disambiguateTop(new LocalString(getLanguage(), phrase), null); if (similar==null){ SRResultList resultList = new SRResultList(1); resultList.set(0, new SRResult()); return resultList; } return mostSimilar(similar.getId(), maxResults,validIds); }
@Override public SRResult similarity(String phrase1, String phrase2, boolean explanations) throws DaoException { if (featureFilter != null) { throw new UnsupportedOperationException(); } TIntFloatMap vector1 = null; TIntFloatMap vector2 = null; // try using phrases directly try { vector1 = generator.getVector(phrase1); vector2 = generator.getVector(phrase2); } catch (UnsupportedOperationException e) { // try using other methods } if (vector1 == null || vector2 == null) { return super.similarity(phrase1, phrase2, explanations); } else { SRResult result= new SRResult(similarity.similarity(vector1, vector2)); if(explanations) { result.setExplanations(generator.getExplanations(phrase1, phrase2, vector1, vector2, result)); } return normalize(result); } }
@Override public SRResult similarity(int pageId1, int pageId2, boolean explanations) throws DaoException { try { float [] v1 = getPageVector(pageId1); float [] v2 = getPageVector(pageId2); SRResult result = new SRResult(normalize(SimUtils.cosineSimilarity(v1, v2))); if (explanations) { result.setExplanations(generator.getExplanations(pageId1, pageId2, v1, v2, result)); } return result; } catch (IOException e) { throw new DaoException(e); } }
@Override public SRResult similarity(String phrase1, String phrase2, boolean explanations) throws DaoException { float [] vector1 = null; float [] vector2 = null; // try using phrases directly try { vector1 = generator.getVector(phrase1); vector2 = generator.getVector(phrase2); } catch (UnsupportedOperationException e) { // try using other methods } if (vector1 == null || vector2 == null) { return super.similarity(phrase1, phrase2, explanations); } else { SRResult result= new SRResult(SimUtils.cosineSimilarity(vector1, vector2)); if(explanations) { result.setExplanations(generator.getExplanations(phrase1, phrase2, vector1, vector2, result)); } return normalize(result); } }