词干分析器或词形还原器都无法让您从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'
Run Code Online (Sandbox Code Playgroud)
但似乎您可以利用 PennTreeBank 标记集的一些不错的属性来获取greatest -> great
:
>>> from nltk import pos_tag
>>> pos_tag(['greatest'])
[('greatest', 'JJS')]
>>> pos_tag(['greater'])
[('greater', 'JJR')]
>>> pos_tag(['great'])
[('great', 'JJ')]
Run Code Online (Sandbox Code Playgroud)
让我们尝试一个疯狂的基于规则的系统,让我们从以下开始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'
Run Code Online (Sandbox Code Playgroud)
现在我们知道我们可以构建自己的小型最高级词干分析器/词形还原器/tail_substituter,让我们编写一个规则,如果一个单词给出最高级词性词性标签,并且我们在tail_substituter
词干时给出 JJ,在转换时给出 JJR,我们可以放心地说该词的比较级和基本形式可以通过我们轻松获得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'
Run Code Online (Sandbox Code Playgroud)
现在你可以从greatest -> greater -> great
. Fromgreat -> best
有点奇怪,因为从词法上看它们并不是不相关的,尽管它们的语义相对似乎相关。
所以我认为说这great -> best
是一个有效的转变是主观的