Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting adjective from an adverb in nltk or other NLP library

Tags:

python

nlp

nltk

Is there a way to get an adjective corresponding to a given adverb in NLTK or other python library. For example, for the adverb "terribly", I need to get "terrible". Thanks.

like image 313
rok Avatar asked Jun 21 '13 22:06

rok


2 Answers

There is a relation in wordnet that connects the adjectives to adverbs and vice versa.

>>> from itertools import chain
>>> from nltk.corpus import wordnet as wn
>>> from difflib import get_close_matches as gcm
>>> possible_adjectives = [k.name for k in chain(*[j.pertainyms() for j in chain(*[i.lemmas for i in wn.synsets('terribly')])])]
['terrible', 'atrocious', 'awful', 'rotten']
>>> gcm('terribly',possible_adjectives)
['terrible']

A more human readable way to computepossible_adjective is as followed:

possible_adj = []
for ss in wn.synsets('terribly'):
  for lemmas in ss.lemmas: # all possible lemmas.
    for lemma in lemmas: 
      for ps in lemma.pertainyms(): # all possible pertainyms.
        for p in ps:
          for ln in p.name: # all possible lemma names.
            possible_adj.append(ln)

EDIT: In the newer version of NLTK:

possible_adj = []
for ss in wn.synsets('terribly'):
  for lemmas in ss.lemmas(): # all possible lemmas
      for ps in lemmas.pertainyms(): # all possible pertainyms
          possible_adj.append(ps.name())
like image 62
alvas Avatar answered Sep 28 '22 08:09

alvas


As MKoosej mentioned, nltk's lemmas is no longer an attribute but a method. I also made a little simplification to get the most possible word. Hope someone else can use it also:

wordtoinv = 'unduly'
s = []
winner = ""
for ss in wn.synsets(wordtoinv):
    for lemmas in ss.lemmas(): # all possible lemmas.
        s.append(lemmas)

for pers in s:
    posword = pers.pertainyms()[0].name()
    if posword[0:3] == wordtoinv[0:3]:
        winner = posword
        break

print winner # undue
like image 28
Jani Bela Avatar answered Sep 28 '22 07:09

Jani Bela