据我所知,答案是否定的,并且根据词干分析器的不同,可能很难进行详尽的搜索来恢复词干规则的效果,并且无论以什么标准来看,结果都大多是无效的单词。例如,对于波特词干分析器:
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内置英语单词词典 https://stackoverflow.com/questions/28339622/is-there-a-corpora-of-english-words-in-nltk.