@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(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 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); } }
private void doSimilarity(WikiBrainWebRequest req) throws ConfigurationException, DaoException { // TODO: support explanations Language lang = req.getLanguage(); List<WebEntity> entities = entityParser.extractEntityList(req); if (entities.size() != 2) { throw new WikiBrainWebException("Similarity requires exactly two entities"); } WebEntity entity1 = entities.get(0); WebEntity entity2 = entities.get(1); SRMetric sr = getSr(lang); SRResult r = null; switch (entity1.getType()) { case ARTICLE_ID: case TITLE: r = sr.similarity(entity1.getArticleId(), entity2.getArticleId(), false); break; case PHRASE: r = sr.similarity(entity1.getPhrase(), entity2.getPhrase(), false); break; default: throw new WikiBrainWebException("Unsupported entity type: " + entity1.getType()); } Double sim = (r != null && r.isValid()) ? r.getScore() : null; req.writeJsonResponse("score", sim, "entity1", entity1.toJson(), "entity2", entity2.toJson()); }