Вы хотите найти противоположность Стеммингу, но вам может пригодиться стемминг.
Посмотрите на этот пример на Python:
from nltk.stem.porter import PorterStemmer
stemmer = PorterStemmer()
words = ["renting", "renter", "rental", "rents", "apple"]
all_rents = {}
for word in words:
stem = stemmer.stem(word)
if stem not in all_rents:
all_rents[stem] = []
all_rents[stem].append(word)
else:
all_rents[stem].append(word)
print(all_rents)
Результат:
{'рента': ['рента', 'рента'], 'арендатор': ['арендатор'], 'аренда': ['аренда'], 'приложение': ['яблоко']}
Есть несколько других алгоритмов для использования.Однако имейте в виду, что основатели основаны на правилах и не являются "умными" в той степени, в которой они будут выбирать все связанные слова (как видно выше).Вы даже можете реализовать свои собственные правила (расширить API Stem от NLTK).
Подробнее обо всех доступных стемерах в NLTK (модуль, который использовался в приведенном выше примере) здесь: https://www.nltk.org/api/nltk.stem.html
Вы также можете реализовать свой собственный алгоритм.Например, вы можете реализовать Levenshtein Distance (как предложено в комментарии @noski), чтобы вычислить меньший общий префикс.Однако вы должны провести собственное исследование по этому вопросу, поскольку это сложный процесс.