code: @Override
      protected double scoreImpl(List<Word> words1, List<Word> words2) {
          if(words1.isEmpty() && words2.isEmpty()){
              return 1.0;
          }
          //HashSet的contains性能要大于ArrayList的contains
          Set<Word> words2Set = new HashSet<>();
          words2Set.addAll(words2);
          //求交集
          Set<String> intersectionSet = new ConcurrentSkipListSet<>();
          words1.parallelStream().forEach(word -> {
              if (words2Set.contains(word)) {
                  intersectionSet.add(word.getText());
              }
          });
          //交集的大小
          int intersectionSize = intersectionSet.size();
          //求并集
          Set<String> unionSet = new HashSet<>();
          words1.forEach(word -> unionSet.add(word.getText()));
          words2.forEach(word -> unionSet.add(word.getText()));
          //并集的大小
          int unionSize = unionSet.size();
          //相似度分值
          double score = intersectionSize/(double)unionSize;
          if(LOGGER.isDebugEnabled()) {
              LOGGER.debug("交集的大小：" + intersectionSize);
              LOGGER.debug("并集的大小：" + unionSize);
              LOGGER.debug("相似度分值=" + intersectionSize + "/(double)" + unionSize + "=" + score);
          }
          return score;
      }
docs: 判定相似度的方式：Jaccard相似性系数
  @param words1 词列表1
  @param words2 词列表2
  @return 相似度分值