単語を抽象化する

こういうことがしたい。

変換前: ヨーグルト を 食べる。
変換後: 乳製品 を 食べる。

こんな感じに言葉を抽象的にしたい。


WordNetを使えば簡単にできる。hypernym(上位語)をたどればそれだけでOK。
そして、日本語WordNetを使うのは以下のコードを使うとすごく楽。すごい。
http://subtech.g.hatena.ne.jp/y_yanbe/20090314/p2


やってることは、
lemma(見出し語) => word(単語) => sense(意味?) => synset(同義語)とたどって、
synsetのリンクから hype(上位語) => word(単語) と順番にたどっています。


このあたりのモデルは以下のページの図が分かりやすい。
http://w-it.jp/shima/2009/03/wordnet_java_api.html

import wn

def abstract_word(lemma):
    result = []
    for word in wn.getWords(lemma):
        for sense in wn.getSenses(word):
            if sense.src != 'hand': continue
            for synlink in wn.getSynLinks(sense, 'hype'):
                abst_sense = wn.getSense(synlink.synset2)
                if abst_sense and word.wordid != abst_sense.wordid:
                    result.append(wn.getWord(abst_sense.wordid).lemma)
    return result


lemma = u"ヨーグルト"
print lemma

for abst_word in abstract_word(lemma=lemma):
    print '-', abst_word


実行例

ヨーグルト

  • 乳製品
  • 食べ物

本棚

  • 調度品

  • 密偵
  • イヌ科動物
  • 家畜


あんまり確認していないけど、それなりにいけそう。