There is no simple and general answer, I think. The inherent semantic of clustering is explorative, so is its process in developping use-cases, and eventually its evaluation by usefulness. Each ‘methodological clustering approach’ owns its strengths and weaknesses and gets different results - see the graph below. LBNL, bear in mind, even small changes to your input-data, may (and typically do) result in considerably different similarity and clustering results, respectively. So, it depends heavily on your data, their preparation, their tokenization and transformation, as well as on the demands and the dimensionality of your question, of what can be, and is, regarded ‘optimal’.

Graph: results of some clustering algorithms on identical input-data (real world sentences), by PCA dimensions, colored and bullet-sized according to their respective cluster-size (blue, e.g., depicts in each example the largest cluster, green the second, red the third, …)

As of my experience, ‘data wrangling’ and ‘data cleaning’ are the most crucial and critical parts for that job successfully being done. This having said, my answer can’t be precise, nor complete, nevertheless - hopefully - giving you some ideas and hints.

In order to avoid inadvertent results, you would have to remove or replace in your input as much as feasible of things that are not really relevant from your point of view, but might be taken by the transformation algorithm as markers for being similar or dissimilar. Depending on your demands, necessary removals could include stopwords, flections, conjugates, irrelavant topics and words, POS, and replacements could affect differing doc lengths, synonyms, and so on. In the Python world, most of these jobs are accomplished by NLTK and spaCy very well.

Since they are prepared in a more general way for that type of question, consider also using python sklearn (giving you an overwiev here), or gensim’s WORD/DOC2VEC implementation for clustering, which also respects word positions to some extent. They both should be prepared by the before mentioned thorough NLP-work in NLTK. You will find more details on using gensim, e.g., here.

The ‘Cosine Similarity’ (CS) based on tf-idf vectors - reflecting the similarity of direction, rather than the strength of similarity (as would be yielded by the correlation of its probabilities) - is likely to be the most often used similarity measure in vector space modeling. By converting the CS to (e.g., angular-) distances, this measure becomes eligible for hierarchical clustering methods like the ‘nearest neighbor classification’. You might adapt, as I did for the graph above, this sklearn python-program to start own experiments with different clustering algorithms.

In the case your vectors represented probabilities, other transformation approaches might appear preferable, e.g., see: Kullback–Leibler divergence.

In a wider understanding of your question, you might also consider approaches like LSI or PCA, yielding multidimensional latent constructs, which allow to pre-group your sentences by their distances to their respective axes, and/or also to reduce the dimensionality (and hence remove some noise) before clustering your data.