使用Wordnet生成最高级,比较性和形容词

Cec*_*uez 6 python nlp nltk wordnet

我有一个wordnet数据库设置,我正在尝试为各种单词生成同义词.

例如,"最伟大"这个词.我会翻阅并找到几个不同的同义词,但它们都不符合定义 - 例如,一个是"最高级".

我猜我需要在给定的语言中按频率进行某种检查,或者用一个单词来获取基本单词(例如,最大 - >很棒,很棒 - >最好).

我应该使用什么表来确保我的话语有一点点意义?

alv*_*vas 4

词干分析器或词形还原器都无法让您从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是一个有效的转变是主观的