Multiple string replacement (with similarity) using a dictionary
I can be wrong, but it seems that the problem is that if you have a large number of keywords, you are defining a lot of regular expressions in vain. How about creating a single regex and replacing values only for found keywords?

var words = string.Join("|", keywords.Keys);
text = Regex.Replace(text, $@"\b({words})\b", delegate (Match m)
{
    return keywords[m.Value];
});