動詞/名詞/形容詞の形式間で単語を変換する 質問する

動詞/名詞/形容詞の形式間で単語を変換する 質問する

異なる品詞間で翻訳/変換する Python ライブラリ関数が必要です。複数の単語を出力する必要がある場合もあります (例: 「coder」と「code」はどちらも動詞「to code」から派生した名詞で、一方が主語でもう一方が目的語です)

# :: String => List of String
print verbify('writer') # => ['write']
print nounize('written') # => ['writer']
print adjectivate('write') # => ['written']

私が書きたいメモ作成プログラムでは、動詞 <=> 名詞が主に重要です。つまり、「カフェインは A1 に拮抗する」または「カフェインは A1 の拮抗薬である」と書くと、NLP を少し使用すれば、同じ意味であることがわかります。(これは簡単ではないことはわかっていますし、解析してタグ付けするだけの NLP も必要ですが、プロトタイプをハックしたいと思っています)。

同様の質問...形容詞と副詞を名詞形に変換する(この回答はルート POS までしか進みません。POS 間を移動したいのです。)

ps 言語学では変換と呼ばれるhttp://en.wikipedia.org/wiki/Conversion_%28linguistics%29

ベストアンサー1

これは、よりヒューリスティックなアプローチです。私はただコード化しただけなので、スタイルについてはお詫びします。これは、wordnet の derivationally_related_forms() を使用します。私は nounify を実装しました。verbify も同様に動作すると思います。私がテストしたところ、かなりうまく動作します。

from nltk.corpus import wordnet as wn

def nounify(verb_word):
    """ Transform a verb to the closest noun: die -> death """
    verb_synsets = wn.synsets(verb_word, pos="v")

    # Word not found
    if not verb_synsets:
        return []

    # Get all verb lemmas of the word
    verb_lemmas = [l for s in verb_synsets \
                   for l in s.lemmas if s.name.split('.')[1] == 'v']

    # Get related forms
    derivationally_related_forms = [(l, l.derivationally_related_forms()) \
                                    for l in    verb_lemmas]

    # filter only the nouns
    related_noun_lemmas = [l for drf in derivationally_related_forms \
                           for l in drf[1] if l.synset.name.split('.')[1] == 'n']

    # Extract the words from the lemmas
    words = [l.name for l in related_noun_lemmas]
    len_words = len(words)

    # Build the result in the form of a list containing tuples (word, probability)
    result = [(w, float(words.count(w))/len_words) for w in set(words)]
    result.sort(key=lambda w: -w[1])

    # return all the possibilities sorted by probability
    return result

おすすめ記事