In [3]:
import nltk
from nltk.corpus import brown
from nltk.corpus import wordnet
from nltk.corpus import wordnet as w

In [4]:
brown.words() # just test that nltk corpus is downloaded, by printing some small corpus


Out[4]:
[u'The', u'Fulton', u'County', u'Grand', u'Jury', ...]

In [11]:
s = w.synsets('plan')
for a in s:
    print "{}\t{}".format(a,a.definition())


Synset('plan.n.01')	a series of steps to be carried out or goals to be accomplished
Synset('design.n.02')	an arrangement scheme
Synset('plan.n.03')	scale drawing of a structure
Synset('plan.v.01')	have the will and intention to carry out some action
Synset('plan.v.02')	make plans for something
Synset('plan.v.03')	make or work out a plan for; devise
Synset('design.v.04')	make a design of; plan out in systematic, often graphic form

In [19]:
''' synonyms and antonyms '''
synonyms = []
antonyms = []
for syn in wordnet.synsets("good"):
    for l in syn.lemmas():
        synonyms.append(l.name())
        if l.antonyms():
            antonyms.append(l.antonyms()[0].name())
            
print(set(synonyms))
print 
print(set(antonyms))


set([u'beneficial', u'right', u'secure', u'just', u'unspoilt', u'respectable', u'good', u'goodness', u'dear', u'salutary', u'ripe', u'expert', u'skillful', u'in_force', u'proficient', u'unspoiled', u'dependable', u'soundly', u'honorable', u'full', u'undecomposed', u'safe', u'adept', u'upright', u'trade_good', u'sound', u'in_effect', u'practiced', u'effective', u'commodity', u'estimable', u'well', u'honest', u'near', u'skilful', u'thoroughly', u'serious'])

set([u'bad', u'badness', u'ill', u'evil', u'evilness'])

In [24]:
s = w.synsets('plan')
print s[0].lemmas()


[Lemma('plan.n.01.plan'), Lemma('plan.n.01.program'), Lemma('plan.n.01.programme')]

In [85]:
""" Similarity between two words 
Threshold decided manually, can be tweaked after discussion
"""
def similarity(a, b):
    suf=".n.01"
    a, b = a+suf, b+suf
    w1 = wordnet.synset(a)
    w2 = wordnet.synset(b)
    sim = w1.wup_similarity(w2)
    #print sim,
    output=""
    if sim >= 0.85:
        output="Very similar"
    elif sim >= 0.65:
        output="Little similar"
    else:
        output="Not similar"
    print 'similarity({:>15}, {:15}) = {:<15} ==> {} '.format(a[:a.find('.')],b[:b.find('.')], sim, output)

In [92]:
sim = similarity
# very similar
print
sim("sparrow", "parrot")
sim("ship", "boat")

# little similar
print
sim("cat", "elephant")


# not similar
print
sim("dolphin", "ship")
sim("giraffe", "tiger")
sim("sheep", "ship")
sim("ship", "cat")


similarity(        sparrow, parrot         ) = 0.869565217391  ==> Very similar 
similarity(           ship, boat           ) = 0.909090909091  ==> Very similar 

similarity(            cat, elephant       ) = 0.814814814815  ==> Little similar 

similarity(        dolphin, ship           ) = 0.296296296296  ==> Not similar 
similarity(        giraffe, tiger          ) = 0.521739130435  ==> Not similar 
similarity(          sheep, ship           ) = 0.296296296296  ==> Not similar 
similarity(           ship, cat            ) = 0.32            ==> Not similar 

In [108]:
# few more
s = similarity
s("cobra", "animal")
s("ocean", "river")
s("nose", "ear")
s("female", "male")
s("forest", "tree")
s("banana", "mango")
s("cobra", "snake")


similarity(          cobra, animal         ) = 0.666666666667  ==> Little similar 
similarity(          ocean, river          ) = 0.727272727273  ==> Little similar 
similarity(           nose, ear            ) = 0.823529411765  ==> Little similar 
similarity(         female, male           ) = 0.875           ==> Very similar 
similarity(         forest, tree           ) = 0.125           ==> Not similar 
similarity(         banana, mango          ) = 0.695652173913  ==> Little similar 
similarity(          cobra, snake          ) = 0.923076923077  ==> Very similar