복붙노트

[PYTHON] 동사 / 명사 / 형용사간에 단어를 변환하십시오.

PYTHON

동사 / 명사 / 형용사간에 단어를 변환하십시오.

파이썬 라이브러리 함수를 사용하여 다른 언어로 번역 / 변환합니다. 때로는 여러 단어를 출력해야합니다 (예 : "코더"및 "코드"는 모두 동사에서 "코드"로, 명사는 다른 사람의 객체입니다)

# :: 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. ==============================

    1.이것은보다 경험적인 접근 방식입니다. 방금 스타일에 대한 사과를했습니다. 그것은 wordnet의 derivationally_related_forms ()를 사용합니다. 나는 명성을 쌓았다. 나는 verbify가 유사하다고 생각합니다. 내가 테스트 한 것을 보면 꽤 잘 작동한다.

    이것은보다 경험적인 접근 방식입니다. 방금 스타일에 대한 사과를했습니다. 그것은 wordnet의 derivationally_related_forms ()를 사용합니다. 나는 명성을 쌓았다. 나는 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
    
  2. ==============================

    2.나는 이것이 당신의 모든 질문에 답하지 못한다는 것을 이해합니다. 그러나 그것의 대부분을 대답합니다. 나는 체크 아웃 할 것이다. http://nodebox.net/code/index.php/Linguistics#verb_conjugation 이 파이썬 라이브러리는 동사를 결합하고 단어가 동사, 명사 또는 형용사인지 여부를 인식 할 수 있습니다.

    나는 이것이 당신의 모든 질문에 답하지 못한다는 것을 이해합니다. 그러나 그것의 대부분을 대답합니다. 나는 체크 아웃 할 것이다. http://nodebox.net/code/index.php/Linguistics#verb_conjugation 이 파이썬 라이브러리는 동사를 결합하고 단어가 동사, 명사 또는 형용사인지 여부를 인식 할 수 있습니다.

    예제 코드

    print en.verb.present("gave")
    print en.verb.present("gave", person=3, negate=False)
    >>> give
    >>> gives
    

    단어를 분류 할 수도 있습니다.

    print en.is_noun("banana")
    >>> True
    

    다운로드는 링크 상단에 있습니다.

  3. ==============================

    3.하나의 접근법은 POS 태그와 wordforms 매핑을 사용하여 단어 사전을 사용할 수 있습니다. 그런 사전을 만들거나 만들면 (모든 사전이 단어의 POS 태그와 모든 파생 된 양식의 기본 양식을 나열하므로 일반 사전의 데이터에 액세스 할 수있는 경우 가능) 다음과 같이 사용할 수 있습니다.

    하나의 접근법은 POS 태그와 wordforms 매핑을 사용하여 단어 사전을 사용할 수 있습니다. 그런 사전을 만들거나 만들면 (모든 사전이 단어의 POS 태그와 모든 파생 된 양식의 기본 양식을 나열하므로 일반 사전의 데이터에 액세스 할 수있는 경우 가능) 다음과 같이 사용할 수 있습니다.

    def is_verb(word):
        if word:
            tags = pos_tags(word)
            return 'VB' in tags or 'VBP' in tags or 'VBZ' in tags \
                   or 'VBD' in tags or 'VBN' in tags:
    
    def verbify(word):
        if is_verb(word):
            return word
        else:
           forms = []
           for tag in pos_tags(word):
               base = word_form(word, tag[:2])
               if is_verb(base):
                  forms.append(base)
           return forms
    
  4. ==============================

    4.여기에 이론적으로 내가 여기에서 업데이트 한 명사 / 동사 / 형용사 / 부사 형식 사이의 단어를 변환 할 수있는 기능이 있습니다 (원래 습지에 의해 작성된 것으로, 나는 믿습니다). nltk 3.2.5와 호환되도록 synset.lemmas 및 sysnset .name은 함수입니다.

    여기에 이론적으로 내가 여기에서 업데이트 한 명사 / 동사 / 형용사 / 부사 형식 사이의 단어를 변환 할 수있는 기능이 있습니다 (원래 습지에 의해 작성된 것으로, 나는 믿습니다). nltk 3.2.5와 호환되도록 synset.lemmas 및 sysnset .name은 함수입니다.

    from nltk.corpus import wordnet as wn
    
    # Just to make it a bit more readable
    WN_NOUN = 'n'
    WN_VERB = 'v'
    WN_ADJECTIVE = 'a'
    WN_ADJECTIVE_SATELLITE = 's'
    WN_ADVERB = 'r'
    
    
    def convert(word, from_pos, to_pos):    
        """ Transform words given from/to POS tags """
    
        synsets = wn.synsets(word, pos=from_pos)
    
        # Word not found
        if not synsets:
            return []
    
        # Get all lemmas of the word (consider 'a'and 's' equivalent)
        lemmas = []
        for s in synsets:
            for l in s.lemmas():
                if s.name().split('.')[1] == from_pos or from_pos in (WN_ADJECTIVE, WN_ADJECTIVE_SATELLITE) and s.name().split('.')[1] in (WN_ADJECTIVE, WN_ADJECTIVE_SATELLITE):
                    lemmas += [l]
    
        # Get related forms
        derivationally_related_forms = [(l, l.derivationally_related_forms()) for l in lemmas]
    
        # filter only the desired pos (consider 'a' and 's' equivalent)
        related_noun_lemmas = []
    
        for drf in derivationally_related_forms:
            for l in drf[1]:
                if l.synset().name().split('.')[1] == to_pos or to_pos in (WN_ADJECTIVE, WN_ADJECTIVE_SATELLITE) and l.synset().name().split('.')[1] in (WN_ADJECTIVE, WN_ADJECTIVE_SATELLITE):
                    related_noun_lemmas += [l]
    
        # 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
    
    
    convert('direct', 'a', 'r')
    convert('direct', 'a', 'n')
    convert('quick', 'a', 'r')
    convert('quickly', 'r', 'a')
    convert('hunger', 'n', 'v')
    convert('run', 'v', 'a')
    convert('tired', 'a', 'r')
    convert('tired', 'a', 'v')
    convert('tired', 'a', 'n')
    convert('tired', 'a', 's')
    convert('wonder', 'v', 'n')
    convert('wonder', 'n', 'a')
    

    아래에서 볼 수 있듯이, 그렇게 잘 작동하지 않습니다. 형용사와 부사 (내 목표) 사이를 전환 할 수는 없지만 다른 경우에는 흥미로운 결과를줍니다.

    >>> convert('direct', 'a', 'r')
    []
    >>> convert('direct', 'a', 'n')
    [('directness', 0.6666666666666666), ('line', 0.3333333333333333)]
    >>> convert('quick', 'a', 'r')
    []
    >>> convert('quickly', 'r', 'a')
    []
    >>> convert('hunger', 'n', 'v')
    [('hunger', 0.75), ('thirst', 0.25)]
    >>> convert('run', 'v', 'a')
    [('persistent', 0.16666666666666666), ('executive', 0.16666666666666666), ('operative', 0.16666666666666666), ('prevalent', 0.16666666666666666), ('meltable', 0.16666666666666666), ('operant', 0.16666666666666666)]
    >>> convert('tired', 'a', 'r')
    []
    >>> convert('tired', 'a', 'v')
    []
    >>> convert('tired', 'a', 'n')
    [('triteness', 0.25), ('banality', 0.25), ('tiredness', 0.25), ('commonplace', 0.25)]
    >>> convert('tired', 'a', 's')
    []
    >>> convert('wonder', 'v', 'n')
    [('wonder', 0.3333333333333333), ('wonderer', 0.2222222222222222), ('marveller', 0.1111111111111111), ('marvel', 0.1111111111111111), ('wonderment', 0.1111111111111111), ('question', 0.1111111111111111)]
    >>> convert('wonder', 'n', 'a')
    [('curious', 0.4), ('wondrous', 0.2), ('marvelous', 0.2), ('marvellous', 0.2)]
    

    이 사람이 약간의 문제를 저장할 수 있기를 바랍니다.

  5. from https://stackoverflow.com/questions/14489309/convert-words-between-verb-noun-adjective-forms by cc-by-sa and MIT license