protected double semanticSimilarityVW(
     Counter<String> features, String prefix, Sentence candidate1, Sentence candidate2) {
   double[] v1 = embeddings.get(candidate1);
   double[] v2 = embeddings.get(candidate2);
   double sim = Util.WordEmbedding.dotProduct(v1, v2);
   //    features.incrementCount(prefix + "semantic-similarity", 2*sim - 1); // to make it between
   // 0 and 1.
   return 2 * sim - 1;
 }
 protected double semanticSimilarityVW(
     Counter<String> features, String prefix, NumericMention mention, Sentence candidate) {
   double[] v1 = embeddings.get(mention.sentence.get(), mention.token_begin, mention.token_end);
   double[] v2 = embeddings.get(candidate);
   double sim = Util.WordEmbedding.dotProduct(v1, v2);
   //    double sim =
   //        candidate.lemmas().stream()
   //            .map(w -> embeddings.get(Collections.singletonList(w), 0, 1))
   //            .map(v2 -> Util.WordEmbedding.dotProduct(v1, v2))
   //            .max(Double::compare)
   //            .get();
   //    features.incrementCount(prefix + "semantic-similarity", 2*sim - 1); // to make it between
   // 0 and 1.
   return 2 * sim - 1;
 }