How to improve results for clustering of words
I cannot write comments yet, so I will start with an answer that still contains some questions, feel free to complement/correct it!

A) The data

Without any contextual information, it looks like the only solution you have to link entities is their character similarity. I don't know which distance metric you use, but have you tried these metrics that are well designed for string data?:


Levenshtein distance (also called string edit distance): basically computes the number of operations needed to transform one string into another
Jaro-Winkler distance: close to levenshtein but favoring strings with a common prefix
Jaccard similarity: roughly computes the ratio of common elements between two sets, be it characters, ngrams, words..


You can try these metrics without the n-gram transformation first, but also on transformed data and use cosine distance afterwards. 

You can also perform additional normalization but you need to assess whether it is relevant for your dataset, which I don't know, so I am just firing ideas, not advices: stripping accents, special characters, short tokens (like the 'P.' in your example), which will reduce the variance in your data.

B) The clustering

One thing that could explain your result is that with KMeans or Affinity Propagation, any data point must belong to a cluster, so names that should be alone are assigned to the cluster so that it minimizes the loss of the algorithm.

Have you thought of trying DBSCAN? It can label some data points as noise, and if you are using one of the string distances above, you can encode prior knowledge about the maximum distance between two potential matches through the epsilon parameter. 

But as with any unsupervised method, you will never have the guarantee to get rid of noise.