2011-03-30 21 views
6

NLTKを介してsynsetからWordNetの選択制限(+ animate、+ humanなど)をキャプチャする方法はありますか? synsetに関する意味情報を提供する他の方法はありますか?私がそれに近づけることができるのは、上位関係でした。NLTKのWordNet選択制限

答えて

4

それはあなたの「selectional制限」であるかに依存したり、私は古典的なセマンティクスに、conceptsの世界が存在するので、意味的な機能、それを呼ぶだろうと我々は

  • を識別見つける必要がある概念の間で比較すること機能(お互いからそれらを区別するために使用されている概念のすなわち機能)と
  • 類似性がます(概念のつまりの特徴と類似して、それらを区別する必要性を強調して)
  • 例えば

Man is [+HUMAN], [+MALE], [+ADULT] 
Woman is [+HUMAN], [-MALE], [+ADULT] 

[+HUMAN] and [+ADULT] = similarity features 
[+-MALE] is the discrimating features 

伝統的な意味の共通の問題や計算の意味で、この理論を適用するには、「

の質問である私たちが使用できる機能の特定のリストがありますどちらかを比較する

"もしそうなら、このリストの機能は何ですか?" の概念? "

(詳細はwww.acl.ldc.upenn.edu/E/E91/E91-1034.pdfを参照)

バックのWordNetに取得、私は "解決するために2つの方法を提案することができます選択制限 "

最初に、区別するために上位語を確認してください。しかし、まず区別する機能を決定する必要があります。動物を人間と区別するために、差別的な特徴を[+ - ヒト]と[+ - 動物]としましょう。

from nltk.corpus import wordnet as wn 

# Concepts to compare 
dog_sense = wn.synsets('dog')[0] # It's http://goo.gl/b9sg9X 
jb_sense = wn.synsets('James_Baldwin')[0] # It's http://goo.gl/CQQIG9 

# To access the hypernym_paths()[0] 
# It's weird for that hypernym_paths gives a list of list rather than a list, nevertheless it works. 
dog_hypernyms = dog_sense.hypernym_paths()[0] 
jb_hypernyms = jb_sense.hypernym_paths()[0] 


# Discriminating features in terms of concepts in WordNet 
human = wn.synset('person.n.01') # i.e. [+human] 
animal = wn.synset('animal.n.01') # i.e. [+animal] 

try: 
    assert human in jb_hypernyms and animal not in jb_hypernyms 
    print "James Baldwin is human" 
except: 
    print "James Baldwin is not human" 

try: 
    assert human in dog_hypernyms and animal not in dog_hypernyms 
    print "Dog is an animal" 
except: 
    print "Dog is not an animal" 

第二に、@Jacobとして類似度のためチェックが示唆されていました。

dog_sense = wn.synsets('dog')[0] # It's http://goo.gl/b9sg9X 
jb_sense = wn.synsets('James_Baldwin')[0] # It's http://goo.gl/CQQIG9 

# Features to check against whether the 'dubious' concept is a human or an animal 
human = wn.synset('person.n.01') # i.e. [+human] 
animal = wn.synset('animal.n.01') # i.e. [+animal] 

if dog_sense.wup_similarity(animal) > dog_sense.wup_similarity(human): 
    print "Dog is more of an animal than human" 
elif dog_sense.wup_similarity(animal) < dog_sense.wup_similarity(human): 
    print "Dog is more of a human than animal" 
+0

徹底的な回答ありがとうございました。私はしばらく前に、あなたが言及した理由のためにWordNetの類似性/差別化機能を見つけることができませんでした。 – erickrf

0

いくつかの類似機能を手書きのsynsetで試して、それをフィルタリングすることができます。しかし、それは本質的にハイパーシンツリーをたどるのと同じです。すべてのワードネット類似関数は上位の距離を使って計算します。また、探索の価値があるかもしれないシンセセットの多くのオプションの属性がありますが、その存在は非常に矛盾している可能性があります。

関連する問題