Unless you want to write a library to handle all the different exceptions, i think you might be best creating a autoloaded or static class where you can register each word that you'll possibly use in dictionary.
Grammar.gd (autoloaded)
extends Node
const articles = {
'axe': 'an',
'bottle': 'a',
}
func withArticle(word : String) -> String:
if not articles.has(word.to_lower()):
print_debug("Word [%s] does not have a registered article" % word)
return "a " + word
return articles[word.to_lower()] + " " + word
Then you can later use it like:
"This is %s %s" % [Grammar.articles[word], word]
# or
"This is %s" % Grammar.withArticle(word)