Насколько я знаю, ответ - нет, и в зависимости от того, кто произвел это, может быть трудно найти исчерпывающий поиск для отмены действия правил, и результаты будут в большинстве случаев недопустимыми словами по любому стандарту. Например, для Портера:
from nltk.stem.porter import *
stemmer = PorterStemmer()
stemmer.stem('grabfuled')
# results in "grab"
Таким образом, обратная функция будет генерировать «grabfuled» как одно из допустимых слов, так как суффиксы «-ed» и «-ful» удаляются последовательно в процессе ствола.
Тем не менее, при наличии действительной лексики вы можете сделать следующее, не зависящее от метода стволов:
from nltk.stem.porter import *
from collections import defaultdict
vocab = set(['grab', 'grabbing', 'grabbed', 'run', 'running', 'eat'])
# Here porter stemmer, but can be any other stemmer too
stemmer = PorterStemmer()
d = defaultdict(set)
for v in vocab:
d[stemmer.stem(v)].add(v)
print(d)
# defaultdict(<class 'set'>, {'grab': {'grab', 'grabbing', 'grabbed'}, 'eat': {'eat'}, 'run': {'run', 'running'}})
Теперь у нас есть словарь, который сопоставляет основы с действительными словами, которые могут их генерировать. Для любого стебля мы можем сделать следующее:
print(d['grab'])
# {'grab', 'grabbed', 'grabbing'}
Для создания словарного запаса вы можете разбить на части корпус или использовать встроенный в nltk словарь английских слов .