Можно табличным методом решить.
Составь 2 таблицы в любой БД, например SQLite:
Synonyms: поля group(int),name(text).
Paronyms: поля name1(text), name2(text).
Всё храни и используй в верхнем регистре.
В Synonyms все имена с одинаковым group считаются синонимами.
В Paronyms name1 и name2 составляют пару, невозможную для таблицы Synonyms в одной группе.
Составь и потихоньку заполняй их.
А проверки все делаются на обычном SQL.
Перед вставкой новых значений в Synonyms проверяй на наличие в паронимах. Если обнаружено в паронимах, вручную решай, что делать, убрать пароним или не вставлять.
База наполнится и начнёт работать. Размеры будут не сильно большими, несколько десятков тысяч записей на каждую таблицу. Впрочем, зависит от области применения.