docs: @Override
      public Collection<String> wordsNearestSum(INDArray words, int top) {
  
          if (lookupTable instanceof InMemoryLookupTable) {
              InMemoryLookupTable l = (InMemoryLookupTable) lookupTable;
              INDArray syn0 = l.getSyn0();
              INDArray weights = syn0.norm2(0).rdivi(1).muli(words);
              INDArray distances = syn0.mulRowVector(weights).sum(1);
              INDArray[] sorted = Nd4j.sortWithIndices(distances, 0, false);
              INDArray sort = sorted[0];
              List<String> ret = new ArrayList<>();
  
              // FIXME: int cast
              if (top > sort.length())
                  top = (int) sort.length();
              //there will be a redundant word
              int end = top;
              for (int i = 0; i < end; i++) {
                  String add = vocabCache.wordAtIndex(sort.getInt(i));
                  if (add == null || add.equals("UNK") || add.equals("STOP")) {
                      end++;
                      if (end >= sort.length())
                          break;
                      continue;
                  }
                  ret.add(vocabCache.wordAtIndex(sort.getInt(i)));
              }
              return ret;
          }
  
          Counter<String> distances = new Counter<>();
  
          for (String s : vocabCache.words()) {
              INDArray otherVec = lookupTable.vector(s);
              double sim = Transforms.cosineSim(words, otherVec);
              distances.incrementCount(s, (float) sim);
          }
  
          distances.keepTopNElements(top);
          return distances.keySet();
      }