stemmer 或 lemmatizer 都无法从 greatest 获取您 -> great:
>>> from nltk.stem import WordNetLemmatizer
>>> from nltk.stem import WordNetLemmatizer, PorterStemmer
>>> porter = PorterStemmer()
>>> wnl = WordNetLemmatizer()
>>> greatest = 'greatest'
>>> porter.stem(greatest)
u'greatest'
>>> wnl.lemmatize(greatest)
'greatest'
>>> greater = 'greater'
>>> wnl.lemmatize(greater)
'greater'
>>> porter.stem(greater)
u'greater'
但似乎您可以利用 PennTreeBank 标记集的一些不错的属性从 greatest -> great 获取:
>>> from nltk import pos_tag
>>> pos_tag(['greatest'])
[('greatest', 'JJS')]
>>> pos_tag(['greater'])
[('greater', 'JJR')]
>>> pos_tag(['great'])
[('great', 'JJ')]
让我们尝试一个基于规则的疯狂系统,让我们从greatest开始:
>>> import re
>>> word1 = 'greatest'
>>> re.sub('est$', '', word1)
'great'
>>> re.sub('est$', 'er', word1)
'greater'
>>> pos_tag([re.sub('est$', '', word1)])[0][1]
'JJ'
>>> pos_tag([re.sub('est$', 'er', word1)])[0][1]
'JJR'
>>> word1
'greatest'
现在我们知道我们可以构建自己的小型最高级词干分析器/lemmatizer/tail_substituter,让我们编写一个规则,说明如果一个词给出一个最高级 POS 标签,我们的tail_substituter 在我们词干时给我们 JJ,而当我们转换,我们可以肯定地说,通过我们的tail_substituter 可以轻松获得单词的比较形式和基本形式:
>>> if pos_tag([word1])[0][1] == 'JJS' \
... and pos_tag([re.sub('est$', '', word1)])[0][1] == 'JJ' \
... and pos_tag([re.sub('est$', 'er', word1)])[0][1] == 'JJR':
... comparative = re.sub('est$', 'er', word1)
... adjective = re.sub('est$', '', word1)
...
>>> adjective
'great'
>>> comparative
'greater'
现在你可以从greatest -> greater -> great 获得。来自great -> best 有点奇怪,因为在词汇上它们并不相关,尽管它们的语义相关似乎相关。
所以我认为说great -> best 是一个有效的转换是主观的